{
  "meta": {
    "run_date": "2026-05-12",
    "election_cycle": "fed_46",
    "n_polls": 229,
    "mode": "rich",
    "majority_threshold": 172,
    "total_seats": 343,
    "n_simulations": 50000,
    "pipeline_version": "4.0"
  },
  "parties": [
    {
      "party": "lib",
      "label_en": "Liberal",
      "label_fr": "Libéral",
      "color": "#D71920",
      "vote_mean": 46.2,
      "vote_sd": 1.51,
      "vote_ci_low_80": 44.3,
      "vote_ci_high_80": 48.1,
      "vote_ci_low_95": 43.3,
      "vote_ci_high_95": 49.3,
      "trend_7d": 0.21,
      "trend_direction": "flat",
      "seats_projected": 226,
      "seats_mean": 222.4,
      "seats_median": 224.0,
      "seats_ci_low_80": 206.0,
      "seats_ci_high_80": 237.0,
      "seats_ci_low_95": 198.0,
      "seats_ci_high_95": 241.0,
      "p_majority": 1.0,
      "p_largest": 1.0,
      "p_strict_largest": 1.0,
      "p_tied_largest": 0.0
    },
    {
      "party": "con",
      "label_en": "Conservative",
      "label_fr": "Conservateur",
      "color": "#1A4782",
      "vote_mean": 32.8,
      "vote_sd": 1.66,
      "vote_ci_low_80": 30.6,
      "vote_ci_high_80": 34.8,
      "vote_ci_low_95": 29.5,
      "vote_ci_high_95": 36.0,
      "trend_7d": -0.72,
      "trend_direction": "down",
      "seats_projected": 85,
      "seats_mean": 88.8,
      "seats_median": 87.0,
      "seats_ci_low_80": 74.0,
      "seats_ci_high_80": 105.0,
      "seats_ci_low_95": 70.0,
      "seats_ci_high_95": 113.0,
      "p_majority": 0.0,
      "p_largest": 0.0,
      "p_strict_largest": 0.0,
      "p_tied_largest": 0.0
    },
    {
      "party": "bq",
      "label_en": "Bloc Quebecois",
      "label_fr": "Bloc québécois",
      "color": "#33B2CC",
      "vote_mean": 6.7,
      "vote_sd": 0.66,
      "vote_ci_low_80": 5.9,
      "vote_ci_high_80": 7.6,
      "vote_ci_low_95": 5.5,
      "vote_ci_high_95": 8.0,
      "trend_7d": 0.69,
      "trend_direction": "up",
      "seats_projected": 23,
      "seats_mean": 22.7,
      "seats_median": 23.0,
      "seats_ci_low_80": 21.0,
      "seats_ci_high_80": 24.0,
      "seats_ci_low_95": 20.0,
      "seats_ci_high_95": 25.0,
      "p_majority": 0.0,
      "p_largest": 0.0,
      "p_strict_largest": 0.0,
      "p_tied_largest": 0.0
    },
    {
      "party": "ndp",
      "label_en": "NDP",
      "label_fr": "NPD",
      "color": "#F58220",
      "vote_mean": 10.3,
      "vote_sd": 1.42,
      "vote_ci_low_80": 8.4,
      "vote_ci_high_80": 12.0,
      "vote_ci_low_95": 7.5,
      "vote_ci_high_95": 13.0,
      "trend_7d": 0.18,
      "trend_direction": "flat",
      "seats_projected": 7,
      "seats_mean": 7.2,
      "seats_median": 7.0,
      "seats_ci_low_80": 5.0,
      "seats_ci_high_80": 10.0,
      "seats_ci_low_95": 4.0,
      "seats_ci_high_95": 11.0,
      "p_majority": 0.0,
      "p_largest": 0.0,
      "p_strict_largest": 0.0,
      "p_tied_largest": 0.0
    },
    {
      "party": "grn",
      "label_en": "Green",
      "label_fr": "Vert",
      "color": "#3D9B35",
      "vote_mean": 2.9,
      "vote_sd": 0.69,
      "vote_ci_low_80": 2.0,
      "vote_ci_high_80": 3.8,
      "vote_ci_low_95": 1.5,
      "vote_ci_high_95": 4.2,
      "trend_7d": -0.02,
      "trend_direction": "flat",
      "seats_projected": 2,
      "seats_mean": 2.0,
      "seats_median": 2.0,
      "seats_ci_low_80": 2.0,
      "seats_ci_high_80": 2.0,
      "seats_ci_low_95": 1.0,
      "seats_ci_high_95": 2.0,
      "p_majority": 0.0,
      "p_largest": 0.0,
      "p_strict_largest": 0.0,
      "p_tied_largest": 0.0
    },
    {
      "party": "ppc",
      "label_en": "PPC",
      "label_fr": "PPC",
      "color": "#4B306A",
      "vote_mean": 1.1,
      "vote_sd": 0.6,
      "vote_ci_low_80": 0.3,
      "vote_ci_high_80": 1.9,
      "vote_ci_low_95": 0.0,
      "vote_ci_high_95": 2.3,
      "trend_7d": -0.25,
      "trend_direction": "flat",
      "seats_projected": 0,
      "seats_mean": 0.0,
      "seats_median": 0.0,
      "seats_ci_low_80": 0.0,
      "seats_ci_high_80": 0.0,
      "seats_ci_low_95": 0.0,
      "seats_ci_high_95": 0.0,
      "p_majority": 0.0,
      "p_largest": 0.0,
      "p_strict_largest": 0.0,
      "p_tied_largest": 0.0
    }
  ],
  "current_composition": {
    "lib": 174,
    "con": 140,
    "ndp": 6,
    "bq": 22,
    "grn": 1,
    "ppc": 0,
    "vacant": 0
  },
  "ridings": [
    {
      "riding_id": "10001",
      "name_en": "Avalon",
      "name_fr": "Avalon",
      "province": "NL",
      "region": "atlantic",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 37.17,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 61.57,
          "con": 24.4,
          "ndp": 8.59,
          "bq": 0.0,
          "grn": 1.58,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 22.37,
        "turnout_pct": 66.92,
        "lib_pct": 58.13,
        "con_pct": 35.75,
        "ndp_pct": 4.82,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 22.37,
        "turnout_pct": 66.92,
        "lib_pct": 58.13,
        "con_pct": 35.75,
        "ndp_pct": 4.82,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "10002",
      "name_en": "Cape Spear",
      "name_fr": "Cape Spear",
      "province": "NL",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 58.74,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 72.86,
          "con": 14.0,
          "ndp": 10.29,
          "bq": 0.0,
          "grn": 1.87,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 42.09,
        "turnout_pct": 66.5,
        "lib_pct": 67.59,
        "con_pct": 25.5,
        "ndp_pct": 5.27,
        "bq_pct": 0.0,
        "grn_pct": 0.3,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 42.09,
        "turnout_pct": 66.5,
        "lib_pct": 67.59,
        "con_pct": 25.5,
        "ndp_pct": 5.27,
        "bq_pct": 0.0,
        "grn_pct": 0.3,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "10003",
      "name_en": "Central Newfoundland",
      "name_fr": "Central Newfoundland",
      "province": "NL",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9129,
        "mean_margin": 4.48,
        "p_close_race": 0.5891,
        "vote_mean": {
          "lib": 44.96,
          "con": 40.73,
          "ndp": 5.37,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 0.9129,
          "con": 0.0871,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 10.4,
        "turnout_pct": 64.17,
        "lib_pct": 43.03,
        "con_pct": 53.43,
        "ndp_pct": 2.35,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 10.4,
        "turnout_pct": 64.17,
        "lib_pct": 43.03,
        "con_pct": 53.43,
        "ndp_pct": 2.35,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "10004",
      "name_en": "Labrador",
      "name_fr": "Labrador",
      "province": "NL",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 24.25,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 52.67,
          "con": 28.42,
          "ndp": 9.69,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 9.62,
        "turnout_pct": 57.18,
        "lib_pct": 50.74,
        "con_pct": 41.12,
        "ndp_pct": 6.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 9.62,
        "turnout_pct": 57.18,
        "lib_pct": 50.74,
        "con_pct": 41.12,
        "ndp_pct": 6.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "10005",
      "name_en": "Long Range Mountains",
      "name_fr": "Long Range Mountains",
      "province": "NL",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9883,
        "mean_margin": 7.13,
        "p_close_race": 0.2503,
        "vote_mean": {
          "lib": 44.27,
          "con": 37.16,
          "ndp": 7.34,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 1.17
        },
        "win_prob": {
          "lib": 0.9883,
          "con": 0.0117,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.52,
        "turnout_pct": 65.0,
        "lib_pct": 42.34,
        "con_pct": 49.86,
        "ndp_pct": 4.32,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.15
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.52,
        "turnout_pct": 65.0,
        "lib_pct": 42.34,
        "con_pct": 49.86,
        "ndp_pct": 4.32,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.15
      }
    },
    {
      "riding_id": "10006",
      "name_en": "St. John's East",
      "name_fr": "St. John's-Est",
      "province": "NL",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 50.38,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.96,
          "con": 14.18,
          "ndp": 16.14,
          "bq": 0.0,
          "grn": 1.91,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 36.01,
        "turnout_pct": 70.02,
        "lib_pct": 61.69,
        "con_pct": 25.68,
        "ndp_pct": 11.12,
        "bq_pct": 0.0,
        "grn_pct": 0.34,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 36.01,
        "turnout_pct": 70.02,
        "lib_pct": 61.69,
        "con_pct": 25.68,
        "ndp_pct": 11.12,
        "bq_pct": 0.0,
        "grn_pct": 0.34,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "10007",
      "name_en": "Terra Nova--The Peninsulas",
      "name_fr": "Terra Nova--Les Péninsules",
      "province": "NL",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.6,
        "p_close_race": 0.0013,
        "vote_mean": {
          "lib": 48.92,
          "con": 34.32,
          "ndp": 7.04,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 0.03,
        "turnout_pct": 64.43,
        "lib_pct": 46.99,
        "con_pct": 47.02,
        "ndp_pct": 4.02,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 0.03,
        "turnout_pct": 64.43,
        "lib_pct": 46.99,
        "con_pct": 47.02,
        "ndp_pct": 4.02,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "11001",
      "name_en": "Cardigan",
      "name_fr": "Cardigan",
      "province": "PE",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 34.09,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 58.43,
          "con": 24.34,
          "ndp": 5.0,
          "bq": 0.0,
          "grn": 2.88,
          "ppc": 0.79
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.46,
        "turnout_pct": 79.05,
        "lib_pct": 56.5,
        "con_pct": 37.04,
        "ndp_pct": 1.98,
        "bq_pct": 0.0,
        "grn_pct": 1.28,
        "ppc_pct": 0.71
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.46,
        "turnout_pct": 79.05,
        "lib_pct": 56.5,
        "con_pct": 37.04,
        "ndp_pct": 1.98,
        "bq_pct": 0.0,
        "grn_pct": 1.28,
        "ppc_pct": 0.71
      }
    },
    {
      "riding_id": "11002",
      "name_en": "Charlottetown",
      "name_fr": "Charlottetown",
      "province": "PE",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 52.05,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 69.37,
          "con": 17.32,
          "ndp": 9.27,
          "bq": 0.0,
          "grn": 2.78,
          "ppc": 0.71
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 35.29,
        "turnout_pct": 76.07,
        "lib_pct": 64.1,
        "con_pct": 28.82,
        "ndp_pct": 4.25,
        "bq_pct": 0.0,
        "grn_pct": 1.21,
        "ppc_pct": 0.61
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 35.29,
        "turnout_pct": 76.07,
        "lib_pct": 64.1,
        "con_pct": 28.82,
        "ndp_pct": 4.25,
        "bq_pct": 0.0,
        "grn_pct": 1.21,
        "ppc_pct": 0.61
      }
    },
    {
      "riding_id": "11003",
      "name_en": "Egmont",
      "name_fr": "Egmont",
      "province": "PE",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 23.07,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.34,
          "con": 30.27,
          "ndp": 5.43,
          "bq": 0.0,
          "grn": 3.82,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 8.44,
        "turnout_pct": 77.26,
        "lib_pct": 51.41,
        "con_pct": 42.97,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 2.22,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 8.44,
        "turnout_pct": 77.26,
        "lib_pct": 51.41,
        "con_pct": 42.97,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 2.22,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "11004",
      "name_en": "Malpeque",
      "name_fr": "Malpeque",
      "province": "PE",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 35.44,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 59.07,
          "con": 23.63,
          "ndp": 4.39,
          "bq": 0.0,
          "grn": 5.47,
          "ppc": 0.62
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 20.81,
        "turnout_pct": 81.9,
        "lib_pct": 57.14,
        "con_pct": 36.33,
        "ndp_pct": 1.37,
        "bq_pct": 0.0,
        "grn_pct": 3.87,
        "ppc_pct": 0.49
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 20.81,
        "turnout_pct": 81.9,
        "lib_pct": 57.14,
        "con_pct": 36.33,
        "ndp_pct": 1.37,
        "bq_pct": 0.0,
        "grn_pct": 3.87,
        "ppc_pct": 0.49
      }
    },
    {
      "riding_id": "12001",
      "name_en": "Acadie--Annapolis",
      "name_fr": "Acadie--Annapolis",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 13.53,
        "p_close_race": 0.0022,
        "vote_mean": {
          "lib": 48.53,
          "con": 35.0,
          "ndp": 6.72,
          "bq": 0.0,
          "grn": 2.8,
          "ppc": 0.95
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 1.1,
        "turnout_pct": 72.07,
        "lib_pct": 46.6,
        "con_pct": 47.7,
        "ndp_pct": 3.7,
        "bq_pct": 0.0,
        "grn_pct": 1.2,
        "ppc_pct": 0.9
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 1.1,
        "turnout_pct": 72.07,
        "lib_pct": 46.6,
        "con_pct": 47.7,
        "ndp_pct": 3.7,
        "bq_pct": 0.0,
        "grn_pct": 1.2,
        "ppc_pct": 0.9
      }
    },
    {
      "riding_id": "12002",
      "name_en": "Cape Breton--Canso--Antigonish",
      "name_fr": "Cape Breton--Canso--Antigonish",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.95,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.22,
          "con": 30.27,
          "ndp": 6.99,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 0.77
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 8.31,
        "turnout_pct": 75.1,
        "lib_pct": 51.29,
        "con_pct": 42.97,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.69
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 8.31,
        "turnout_pct": 75.1,
        "lib_pct": 51.29,
        "con_pct": 42.97,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.69
      }
    },
    {
      "riding_id": "12003",
      "name_en": "Central Nova",
      "name_fr": "Nova-Centre",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 23.75,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.51,
          "con": 29.76,
          "ndp": 6.28,
          "bq": 0.0,
          "grn": 2.5,
          "ppc": 0.74
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 9.12,
        "turnout_pct": 74.57,
        "lib_pct": 51.58,
        "con_pct": 42.46,
        "ndp_pct": 3.26,
        "bq_pct": 0.0,
        "grn_pct": 0.9,
        "ppc_pct": 0.65
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 9.12,
        "turnout_pct": 74.57,
        "lib_pct": 51.58,
        "con_pct": 42.46,
        "ndp_pct": 3.26,
        "bq_pct": 0.0,
        "grn_pct": 0.9,
        "ppc_pct": 0.65
      }
    },
    {
      "riding_id": "12004",
      "name_en": "Cumberland--Colchester",
      "name_fr": "Cumberland--Colchester",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 17.09,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 49.94,
          "con": 32.85,
          "ndp": 6.78,
          "bq": 0.0,
          "grn": 2.99,
          "ppc": 0.75
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 2.46,
        "turnout_pct": 70.43,
        "lib_pct": 48.01,
        "con_pct": 45.55,
        "ndp_pct": 3.76,
        "bq_pct": 0.0,
        "grn_pct": 1.39,
        "ppc_pct": 0.67
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 2.46,
        "turnout_pct": 70.43,
        "lib_pct": 48.01,
        "con_pct": 45.55,
        "ndp_pct": 3.76,
        "bq_pct": 0.0,
        "grn_pct": 1.39,
        "ppc_pct": 0.67
      }
    },
    {
      "riding_id": "12005",
      "name_en": "Dartmouth--Cole Harbour",
      "name_fr": "Dartmouth--Cole Harbour",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 59.82,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 72.62,
          "con": 11.12,
          "ndp": 12.03,
          "bq": 0.0,
          "grn": 2.62,
          "ppc": 1.26
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 44.73,
        "turnout_pct": 71.46,
        "lib_pct": 67.35,
        "con_pct": 22.62,
        "ndp_pct": 7.01,
        "bq_pct": 0.0,
        "grn_pct": 1.05,
        "ppc_pct": 1.25
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 44.73,
        "turnout_pct": 71.46,
        "lib_pct": 67.35,
        "con_pct": 22.62,
        "ndp_pct": 7.01,
        "bq_pct": 0.0,
        "grn_pct": 1.05,
        "ppc_pct": 1.25
      }
    },
    {
      "riding_id": "12006",
      "name_en": "Halifax",
      "name_fr": "Halifax",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 46.42,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 67.88,
          "con": 7.42,
          "ndp": 21.47,
          "bq": 0.0,
          "grn": 2.37,
          "ppc": 0.64
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 43.69,
        "turnout_pct": 72.57,
        "lib_pct": 62.61,
        "con_pct": 18.92,
        "ndp_pct": 16.45,
        "bq_pct": 0.0,
        "grn_pct": 0.8,
        "ppc_pct": 0.52
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 43.69,
        "turnout_pct": 72.57,
        "lib_pct": 62.61,
        "con_pct": 18.92,
        "ndp_pct": 16.45,
        "bq_pct": 0.0,
        "grn_pct": 0.8,
        "ppc_pct": 0.52
      }
    },
    {
      "riding_id": "12007",
      "name_en": "Halifax West",
      "name_fr": "Halifax-Ouest",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 54.83,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 70.37,
          "con": 15.51,
          "ndp": 10.56,
          "bq": 0.0,
          "grn": 2.46,
          "ppc": 0.77
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 38.09,
        "turnout_pct": 73.17,
        "lib_pct": 65.1,
        "con_pct": 27.01,
        "ndp_pct": 5.54,
        "bq_pct": 0.0,
        "grn_pct": 0.89,
        "ppc_pct": 0.69
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 38.09,
        "turnout_pct": 73.17,
        "lib_pct": 65.1,
        "con_pct": 27.01,
        "ndp_pct": 5.54,
        "bq_pct": 0.0,
        "grn_pct": 0.89,
        "ppc_pct": 0.69
      }
    },
    {
      "riding_id": "12008",
      "name_en": "Kings--Hants",
      "name_fr": "Kings--Hants",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 41.6,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 62.09,
          "con": 20.49,
          "ndp": 6.64,
          "bq": 0.0,
          "grn": 2.98,
          "ppc": 1.03
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 26.97,
        "turnout_pct": 72.43,
        "lib_pct": 60.16,
        "con_pct": 33.19,
        "ndp_pct": 3.62,
        "bq_pct": 0.0,
        "grn_pct": 1.38,
        "ppc_pct": 0.99
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 26.97,
        "turnout_pct": 72.43,
        "lib_pct": 60.16,
        "con_pct": 33.19,
        "ndp_pct": 3.62,
        "bq_pct": 0.0,
        "grn_pct": 1.38,
        "ppc_pct": 0.99
      }
    },
    {
      "riding_id": "12009",
      "name_en": "Sackville--Bedford--Preston",
      "name_fr": "Sackville--Bedford--Preston",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 44.14,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 64.97,
          "con": 20.83,
          "ndp": 7.74,
          "bq": 0.0,
          "grn": 2.48,
          "ppc": 0.79
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 29.35,
        "turnout_pct": 72.8,
        "lib_pct": 61.53,
        "con_pct": 32.18,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.9,
        "ppc_pct": 0.71
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 29.35,
        "turnout_pct": 72.8,
        "lib_pct": 61.53,
        "con_pct": 32.18,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.9,
        "ppc_pct": 0.71
      }
    },
    {
      "riding_id": "12010",
      "name_en": "South Shore--St. Margarets",
      "name_fr": "South Shore--St. Margarets",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 28.27,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.41,
          "con": 28.14,
          "ndp": 3.02,
          "bq": 0.0,
          "grn": 3.2,
          "ppc": 1.38
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 13.64,
        "turnout_pct": 72.25,
        "lib_pct": 54.48,
        "con_pct": 40.84,
        "ndp_pct": 0.0,
        "bq_pct": 0.0,
        "grn_pct": 1.6,
        "ppc_pct": 1.37
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 13.64,
        "turnout_pct": 72.25,
        "lib_pct": 54.48,
        "con_pct": 40.84,
        "ndp_pct": 0.0,
        "bq_pct": 0.0,
        "grn_pct": 1.6,
        "ppc_pct": 1.37
      }
    },
    {
      "riding_id": "12011",
      "name_en": "Sydney--Glace Bay",
      "name_fr": "Sydney--Glace Bay",
      "province": "NS",
      "region": "atlantic",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 31.17,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 57.64,
          "con": 26.47,
          "ndp": 7.53,
          "bq": 0.0,
          "grn": 1.58,
          "ppc": 1.26
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 16.38,
        "turnout_pct": 69.22,
        "lib_pct": 54.2,
        "con_pct": 37.82,
        "ndp_pct": 3.76,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.24
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 16.38,
        "turnout_pct": 69.22,
        "lib_pct": 54.2,
        "con_pct": 37.82,
        "ndp_pct": 3.76,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.24
      }
    },
    {
      "riding_id": "13001",
      "name_en": "Acadie--Bathurst",
      "name_fr": "Acadie--Bathurst",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 55.6,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 68.59,
          "con": 12.98,
          "ndp": 7.34,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 2.14
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 40.98,
        "turnout_pct": 70.33,
        "lib_pct": 66.66,
        "con_pct": 25.68,
        "ndp_pct": 4.32,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 2.14
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 40.98,
        "turnout_pct": 70.33,
        "lib_pct": 66.66,
        "con_pct": 25.68,
        "ndp_pct": 4.32,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 2.14
      }
    },
    {
      "riding_id": "13002",
      "name_en": "Beauséjour",
      "name_fr": "Beauséjour",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 41.77,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 62.18,
          "con": 20.41,
          "ndp": 5.43,
          "bq": 0.0,
          "grn": 3.75,
          "ppc": 0.9
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 27.14,
        "turnout_pct": 77.03,
        "lib_pct": 60.25,
        "con_pct": 33.11,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 2.15,
        "ppc_pct": 0.84
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 27.14,
        "turnout_pct": 77.03,
        "lib_pct": 60.25,
        "con_pct": 33.11,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 2.15,
        "ppc_pct": 0.84
      }
    },
    {
      "riding_id": "13003",
      "name_en": "Fredericton--Oromocto",
      "name_fr": "Fredericton--Oromocto",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 45.63,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.27,
          "con": 20.64,
          "ndp": 6.82,
          "bq": 0.0,
          "grn": 4.68,
          "ppc": 0.56
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 28.86,
        "turnout_pct": 75.41,
        "lib_pct": 61.0,
        "con_pct": 32.14,
        "ndp_pct": 1.8,
        "bq_pct": 0.0,
        "grn_pct": 3.11,
        "ppc_pct": 0.41
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 28.86,
        "turnout_pct": 75.41,
        "lib_pct": 61.0,
        "con_pct": 32.14,
        "ndp_pct": 1.8,
        "bq_pct": 0.0,
        "grn_pct": 3.11,
        "ppc_pct": 0.41
      }
    },
    {
      "riding_id": "13004",
      "name_en": "Fundy Royal",
      "name_fr": "Fundy Royal",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.6752,
        "mean_margin": 2.75,
        "p_close_race": 0.847,
        "vote_mean": {
          "lib": 41.86,
          "con": 40.41,
          "ndp": 6.17,
          "bq": 0.0,
          "grn": 3.61,
          "ppc": 1.32
        },
        "win_prob": {
          "lib": 0.6752,
          "con": 0.3248,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 13.18,
        "turnout_pct": 75.71,
        "lib_pct": 39.93,
        "con_pct": 53.11,
        "ndp_pct": 3.15,
        "bq_pct": 0.0,
        "grn_pct": 2.01,
        "ppc_pct": 1.31
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 13.18,
        "turnout_pct": 75.71,
        "lib_pct": 39.93,
        "con_pct": 53.11,
        "ndp_pct": 3.15,
        "bq_pct": 0.0,
        "grn_pct": 2.01,
        "ppc_pct": 1.31
      }
    },
    {
      "riding_id": "13005",
      "name_en": "Madawaska--Restigouche",
      "name_fr": "Madawaska--Restigouche",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 30.03,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.58,
          "con": 26.55,
          "ndp": 6.03,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 2.13
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 15.39,
        "turnout_pct": 70.1,
        "lib_pct": 54.65,
        "con_pct": 39.25,
        "ndp_pct": 3.01,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 2.13
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 15.39,
        "turnout_pct": 70.1,
        "lib_pct": 54.65,
        "con_pct": 39.25,
        "ndp_pct": 3.01,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 2.13
      }
    },
    {
      "riding_id": "13006",
      "name_en": "Miramichi--Grand Lake",
      "name_fr": "Miramichi--Grand Lake",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 13.64,
        "p_close_race": 0.0022,
        "vote_mean": {
          "lib": 48.71,
          "con": 35.07,
          "ndp": 5.53,
          "bq": 0.0,
          "grn": 3.76,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 1.0,
        "turnout_pct": 73.71,
        "lib_pct": 46.78,
        "con_pct": 47.77,
        "ndp_pct": 2.51,
        "bq_pct": 0.0,
        "grn_pct": 2.16,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 1.0,
        "turnout_pct": 73.71,
        "lib_pct": 46.78,
        "con_pct": 47.77,
        "ndp_pct": 2.51,
        "bq_pct": 0.0,
        "grn_pct": 2.16,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "13007",
      "name_en": "Moncton--Dieppe",
      "name_fr": "Moncton--Dieppe",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 48.32,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 67.81,
          "con": 19.49,
          "ndp": 8.69,
          "bq": 0.0,
          "grn": 3.63,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 31.55,
        "turnout_pct": 70.79,
        "lib_pct": 62.54,
        "con_pct": 30.99,
        "ndp_pct": 3.67,
        "bq_pct": 0.0,
        "grn_pct": 2.06,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 31.55,
        "turnout_pct": 70.79,
        "lib_pct": 62.54,
        "con_pct": 30.99,
        "ndp_pct": 3.67,
        "bq_pct": 0.0,
        "grn_pct": 2.06,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "13008",
      "name_en": "Saint John--Kennebecasis",
      "name_fr": "Saint John--Kennebecasis",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 37.43,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 63.05,
          "con": 25.62,
          "ndp": 7.69,
          "bq": 0.0,
          "grn": 3.2,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 20.66,
        "turnout_pct": 69.54,
        "lib_pct": 57.78,
        "con_pct": 37.12,
        "ndp_pct": 2.67,
        "bq_pct": 0.0,
        "grn_pct": 1.63,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 20.66,
        "turnout_pct": 69.54,
        "lib_pct": 57.78,
        "con_pct": 37.12,
        "ndp_pct": 2.67,
        "bq_pct": 0.0,
        "grn_pct": 1.63,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "13009",
      "name_en": "Saint John--St. Croix",
      "name_fr": "Saint John--St. Croix",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8996,
        "mean_margin": 5.66,
        "p_close_race": 0.4725,
        "vote_mean": {
          "lib": 46.47,
          "con": 41.21,
          "ndp": 8.28,
          "bq": 0.0,
          "grn": 3.14,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 0.8996,
          "con": 0.1004,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 11.51,
        "turnout_pct": 74.17,
        "lib_pct": 41.2,
        "con_pct": 52.71,
        "ndp_pct": 3.26,
        "bq_pct": 0.0,
        "grn_pct": 1.57,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 11.51,
        "turnout_pct": 74.17,
        "lib_pct": 41.2,
        "con_pct": 52.71,
        "ndp_pct": 3.26,
        "bq_pct": 0.0,
        "grn_pct": 1.57,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "13010",
      "name_en": "Tobique--Mactaquac",
      "name_fr": "Tobique--Mactaquac",
      "province": "NB",
      "region": "atlantic",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 8.19,
        "p_close_race": 0.1583,
        "vote_mean": {
          "lib": 37.61,
          "con": 45.8,
          "ndp": 5.06,
          "bq": 0.0,
          "grn": 3.62,
          "ppc": 1.27
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 22.81,
        "turnout_pct": 73.75,
        "lib_pct": 35.68,
        "con_pct": 58.5,
        "ndp_pct": 2.04,
        "bq_pct": 0.0,
        "grn_pct": 2.02,
        "ppc_pct": 1.26
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 22.81,
        "turnout_pct": 73.75,
        "lib_pct": 35.68,
        "con_pct": 58.5,
        "ndp_pct": 2.04,
        "bq_pct": 0.0,
        "grn_pct": 2.02,
        "ppc_pct": 1.26
      }
    },
    {
      "riding_id": "24001",
      "name_en": "Abitibi--Baie-James--Nunavik--Eeyou",
      "name_fr": "Abitibi--Baie-James--Nunavik--Eeyou",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9985,
        "mean_margin": 8.23,
        "p_close_race": 0.1208,
        "vote_mean": {
          "lib": 41.4,
          "con": 21.49,
          "ndp": 3.5,
          "bq": 33.17,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.9985,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0015,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 7.02,
        "turnout_pct": 47.39,
        "lib_pct": 40.18,
        "con_pct": 21.88,
        "ndp_pct": 2.4,
        "bq_pct": 33.16,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 7.02,
        "turnout_pct": 47.39,
        "lib_pct": 40.18,
        "con_pct": 21.88,
        "ndp_pct": 2.4,
        "bq_pct": 33.16,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24002",
      "name_en": "Abitibi--Témiscamingue",
      "name_fr": "Abitibi--Témiscamingue",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 21.2,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 27.81,
          "con": 17.46,
          "ndp": 4.0,
          "bq": 49.01,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 22.02,
        "turnout_pct": 62.04,
        "lib_pct": 26.59,
        "con_pct": 19.35,
        "ndp_pct": 2.9,
        "bq_pct": 48.61,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 22.02,
        "turnout_pct": 62.04,
        "lib_pct": 26.59,
        "con_pct": 19.35,
        "ndp_pct": 2.9,
        "bq_pct": 48.61,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24003",
      "name_en": "Ahuntsic-Cartierville",
      "name_fr": "Ahuntsic-Cartierville",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 44.23,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 61.15,
          "con": 14.38,
          "ndp": 7.58,
          "bq": 16.59,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 43.34,
        "turnout_pct": 67.19,
        "lib_pct": 59.93,
        "con_pct": 14.77,
        "ndp_pct": 6.48,
        "bq_pct": 16.6,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 43.34,
        "turnout_pct": 67.19,
        "lib_pct": 59.93,
        "con_pct": 14.77,
        "ndp_pct": 6.48,
        "bq_pct": 16.6,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24004",
      "name_en": "Alfred-Pellan",
      "name_fr": "Alfred-Pellan",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 33.69,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.91,
          "con": 20.26,
          "ndp": 4.43,
          "bq": 19.97,
          "grn": 1.09,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 33.03,
        "turnout_pct": 69.47,
        "lib_pct": 53.69,
        "con_pct": 20.65,
        "ndp_pct": 3.33,
        "bq_pct": 19.98,
        "grn_pct": 0.0,
        "ppc_pct": 0.69
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 33.03,
        "turnout_pct": 69.47,
        "lib_pct": 53.69,
        "con_pct": 20.65,
        "ndp_pct": 3.33,
        "bq_pct": 19.98,
        "grn_pct": 0.0,
        "ppc_pct": 0.69
      }
    },
    {
      "riding_id": "24005",
      "name_en": "Argenteuil--La Petite-Nation",
      "name_fr": "Argenteuil--La Petite-Nation",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 23.83,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 48.05,
          "con": 23.57,
          "ndp": 3.6,
          "bq": 22.49,
          "grn": 2.4,
          "ppc": 1.3
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 22.36,
        "turnout_pct": 64.61,
        "lib_pct": 46.83,
        "con_pct": 24.47,
        "ndp_pct": 2.5,
        "bq_pct": 22.51,
        "grn_pct": 1.34,
        "ppc_pct": 0.98
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 22.36,
        "turnout_pct": 64.61,
        "lib_pct": 46.83,
        "con_pct": 24.47,
        "ndp_pct": 2.5,
        "bq_pct": 22.51,
        "grn_pct": 1.34,
        "ppc_pct": 0.98
      }
    },
    {
      "riding_id": "24006",
      "name_en": "Beauce",
      "name_fr": "Beauce",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 36.82,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 20.08,
          "con": 56.92,
          "ndp": 2.82,
          "bq": 13.82,
          "grn": 1.09,
          "ppc": 5.96
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 39.95,
        "turnout_pct": 71.79,
        "lib_pct": 18.86,
        "con_pct": 58.81,
        "ndp_pct": 1.72,
        "bq_pct": 13.44,
        "grn_pct": 0.0,
        "ppc_pct": 5.67
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 39.95,
        "turnout_pct": 71.79,
        "lib_pct": 18.86,
        "con_pct": 58.81,
        "ndp_pct": 1.72,
        "bq_pct": 13.44,
        "grn_pct": 0.0,
        "ppc_pct": 5.67
      }
    },
    {
      "riding_id": "24007",
      "name_en": "Beauharnois--Salaberry--Soulanges--Huntingdon",
      "name_fr": "Beauharnois--Salaberry--Soulanges--Huntingdon",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 10.41,
        "p_close_race": 0.0241,
        "vote_mean": {
          "lib": 32.86,
          "con": 18.18,
          "ndp": 3.5,
          "bq": 43.27,
          "grn": 2.22,
          "ppc": 1.29
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 11.63,
        "turnout_pct": 67.05,
        "lib_pct": 31.64,
        "con_pct": 19.08,
        "ndp_pct": 2.4,
        "bq_pct": 43.27,
        "grn_pct": 1.16,
        "ppc_pct": 0.97
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 11.63,
        "turnout_pct": 67.05,
        "lib_pct": 31.64,
        "con_pct": 19.08,
        "ndp_pct": 2.4,
        "bq_pct": 43.27,
        "grn_pct": 1.16,
        "ppc_pct": 0.97
      }
    },
    {
      "riding_id": "24008",
      "name_en": "Beauport--Limoilou",
      "name_fr": "Beauport--Limoilou",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9977,
        "mean_margin": 6.96,
        "p_close_race": 0.1774,
        "vote_mean": {
          "lib": 36.27,
          "con": 27.77,
          "ndp": 4.46,
          "bq": 28.58,
          "grn": 2.54,
          "ppc": 1.0
        },
        "win_prob": {
          "lib": 0.9977,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0023,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 5.4,
        "turnout_pct": 68.89,
        "lib_pct": 35.05,
        "con_pct": 29.66,
        "ndp_pct": 3.36,
        "bq_pct": 28.16,
        "grn_pct": 1.48,
        "ppc_pct": 0.64
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 5.4,
        "turnout_pct": 68.89,
        "lib_pct": 35.05,
        "con_pct": 29.66,
        "ndp_pct": 3.36,
        "bq_pct": 28.16,
        "grn_pct": 1.48,
        "ppc_pct": 0.64
      }
    },
    {
      "riding_id": "24009",
      "name_en": "Bécancour--Nicolet--Saurel--Alnôbak",
      "name_fr": "Bécancour--Nicolet--Saurel--Alnôbak",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 18.53,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 28.01,
          "con": 19.3,
          "ndp": 3.11,
          "bq": 46.54,
          "grn": 2.39,
          "ppc": 1.12
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 19.34,
        "turnout_pct": 67.19,
        "lib_pct": 26.79,
        "con_pct": 21.19,
        "ndp_pct": 2.01,
        "bq_pct": 46.13,
        "grn_pct": 1.33,
        "ppc_pct": 0.78
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 19.34,
        "turnout_pct": 67.19,
        "lib_pct": 26.79,
        "con_pct": 21.19,
        "ndp_pct": 2.01,
        "bq_pct": 46.13,
        "grn_pct": 1.33,
        "ppc_pct": 0.78
      }
    },
    {
      "riding_id": "24010",
      "name_en": "Bellechasse--Les Etchemins--Lévis",
      "name_fr": "Bellechasse--Les Etchemins--Lévis",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 17.46,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 29.73,
          "con": 47.19,
          "ndp": 3.58,
          "bq": 19.13,
          "grn": 1.09,
          "ppc": 1.52
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 17.8,
        "turnout_pct": 72.34,
        "lib_pct": 28.51,
        "con_pct": 49.08,
        "ndp_pct": 2.48,
        "bq_pct": 18.72,
        "grn_pct": 0.0,
        "ppc_pct": 1.21
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 17.8,
        "turnout_pct": 72.34,
        "lib_pct": 28.51,
        "con_pct": 49.08,
        "ndp_pct": 2.48,
        "bq_pct": 18.72,
        "grn_pct": 0.0,
        "ppc_pct": 1.21
      }
    },
    {
      "riding_id": "24011",
      "name_en": "Beloeil--Chambly",
      "name_fr": "Beloeil--Chambly",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 12.85,
        "p_close_race": 0.0022,
        "vote_mean": {
          "lib": 34.79,
          "con": 12.17,
          "ndp": 4.57,
          "bq": 47.64,
          "grn": 1.09,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 14.08,
        "turnout_pct": 75.43,
        "lib_pct": 33.57,
        "con_pct": 13.35,
        "ndp_pct": 3.47,
        "bq_pct": 47.65,
        "grn_pct": 0.0,
        "ppc_pct": 0.7
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 14.08,
        "turnout_pct": 75.43,
        "lib_pct": 33.57,
        "con_pct": 13.35,
        "ndp_pct": 3.47,
        "bq_pct": 47.65,
        "grn_pct": 0.0,
        "ppc_pct": 0.7
      }
    },
    {
      "riding_id": "24012",
      "name_en": "Berthier--Maskinongé",
      "name_fr": "Berthier--Maskinongé",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9998,
        "mean_margin": 9.66,
        "p_close_race": 0.0446,
        "vote_mean": {
          "lib": 25.14,
          "con": 15.02,
          "ndp": 22.48,
          "bq": 34.84,
          "grn": 1.94,
          "ppc": 1.24
        },
        "win_prob": {
          "lib": 0.0002,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9998,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 10.52,
        "turnout_pct": 67.95,
        "lib_pct": 23.92,
        "con_pct": 16.91,
        "ndp_pct": 21.38,
        "bq_pct": 34.44,
        "grn_pct": 0.88,
        "ppc_pct": 0.91
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 10.52,
        "turnout_pct": 67.95,
        "lib_pct": 23.92,
        "con_pct": 16.91,
        "ndp_pct": 21.38,
        "bq_pct": 34.44,
        "grn_pct": 0.88,
        "ppc_pct": 0.91
      }
    },
    {
      "riding_id": "24013",
      "name_en": "Bourassa",
      "name_fr": "Bourassa",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 41.0,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 58.31,
          "con": 15.51,
          "ndp": 6.86,
          "bq": 16.72,
          "grn": 1.09,
          "ppc": 1.48
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 40.38,
        "turnout_pct": 56.46,
        "lib_pct": 57.09,
        "con_pct": 15.9,
        "ndp_pct": 5.76,
        "bq_pct": 16.71,
        "grn_pct": 0.0,
        "ppc_pct": 1.17
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 40.38,
        "turnout_pct": 56.46,
        "lib_pct": 57.09,
        "con_pct": 15.9,
        "ndp_pct": 5.76,
        "bq_pct": 16.71,
        "grn_pct": 0.0,
        "ppc_pct": 1.17
      }
    },
    {
      "riding_id": "24014",
      "name_en": "Brome--Missisquoi",
      "name_fr": "Brome--Missisquoi",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 21.18,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 48.9,
          "con": 18.17,
          "ndp": 3.3,
          "bq": 27.72,
          "grn": 2.62,
          "ppc": 1.12
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.97,
        "turnout_pct": 72.37,
        "lib_pct": 47.68,
        "con_pct": 18.87,
        "ndp_pct": 2.2,
        "bq_pct": 27.71,
        "grn_pct": 1.56,
        "ppc_pct": 0.77
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.97,
        "turnout_pct": 72.37,
        "lib_pct": 47.68,
        "con_pct": 18.87,
        "ndp_pct": 2.2,
        "bq_pct": 27.71,
        "grn_pct": 1.56,
        "ppc_pct": 0.77
      }
    },
    {
      "riding_id": "24015",
      "name_en": "Brossard--Saint-Lambert",
      "name_fr": "Brossard--Saint-Lambert",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 44.47,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 62.77,
          "con": 18.27,
          "ndp": 4.55,
          "bq": 13.2,
          "grn": 2.5,
          "ppc": 1.0
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 42.89,
        "turnout_pct": 68.22,
        "lib_pct": 61.55,
        "con_pct": 18.66,
        "ndp_pct": 3.45,
        "bq_pct": 13.2,
        "grn_pct": 1.44,
        "ppc_pct": 0.64
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 42.89,
        "turnout_pct": 68.22,
        "lib_pct": 61.55,
        "con_pct": 18.66,
        "ndp_pct": 3.45,
        "bq_pct": 13.2,
        "grn_pct": 1.44,
        "ppc_pct": 0.64
      }
    },
    {
      "riding_id": "24016",
      "name_en": "Charlesbourg--Haute-Saint-Charles",
      "name_fr": "Charlesbourg--Haute-Saint-Charles",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.9958,
        "mean_margin": 4.6,
        "p_close_race": 0.5899,
        "vote_mean": {
          "lib": 35.35,
          "con": 39.95,
          "ndp": 3.75,
          "bq": 19.04,
          "grn": 1.09,
          "ppc": 1.12
        },
        "win_prob": {
          "lib": 0.0042,
          "con": 0.9958,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.71,
        "turnout_pct": 72.97,
        "lib_pct": 34.13,
        "con_pct": 41.84,
        "ndp_pct": 2.65,
        "bq_pct": 18.65,
        "grn_pct": 0.0,
        "ppc_pct": 0.78
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.71,
        "turnout_pct": 72.97,
        "lib_pct": 34.13,
        "con_pct": 41.84,
        "ndp_pct": 2.65,
        "bq_pct": 18.65,
        "grn_pct": 0.0,
        "ppc_pct": 0.78
      }
    },
    {
      "riding_id": "24017",
      "name_en": "Châteauguay--Les Jardins-de-Napierville",
      "name_fr": "Châteauguay--Les Jardins-de-Napierville",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 17.31,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 46.38,
          "con": 21.27,
          "ndp": 3.3,
          "bq": 29.07,
          "grn": 2.3,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 15.85,
        "turnout_pct": 69.3,
        "lib_pct": 45.16,
        "con_pct": 21.66,
        "ndp_pct": 2.2,
        "bq_pct": 29.06,
        "grn_pct": 1.24,
        "ppc_pct": 0.69
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 15.85,
        "turnout_pct": 69.3,
        "lib_pct": 45.16,
        "con_pct": 21.66,
        "ndp_pct": 2.2,
        "bq_pct": 29.06,
        "grn_pct": 1.24,
        "ppc_pct": 0.69
      }
    },
    {
      "riding_id": "24018",
      "name_en": "Chicoutimi--Le Fjord",
      "name_fr": "Chicoutimi--Le Fjord",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.3737,
        "mean_margin": 1.37,
        "p_close_race": 0.9903,
        "vote_mean": {
          "lib": 31.9,
          "con": 31.77,
          "ndp": 3.02,
          "bq": 31.14,
          "grn": 1.98,
          "ppc": 1.02
        },
        "win_prob": {
          "lib": 0.3737,
          "con": 0.3309,
          "ndp": 0.0,
          "bq": 0.2954,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 2.91,
        "turnout_pct": 68.54,
        "lib_pct": 30.68,
        "con_pct": 33.66,
        "ndp_pct": 1.92,
        "bq_pct": 30.75,
        "grn_pct": 0.92,
        "ppc_pct": 0.66
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 2.91,
        "turnout_pct": 68.54,
        "lib_pct": 30.68,
        "con_pct": 33.66,
        "ndp_pct": 1.92,
        "bq_pct": 30.75,
        "grn_pct": 0.92,
        "ppc_pct": 0.66
      }
    },
    {
      "riding_id": "24019",
      "name_en": "Compton--Stanstead",
      "name_fr": "Compton--Stanstead",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 20.23,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 46.28,
          "con": 20.68,
          "ndp": 4.3,
          "bq": 26.02,
          "grn": 2.81,
          "ppc": 1.49
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.03,
        "turnout_pct": 71.63,
        "lib_pct": 45.06,
        "con_pct": 21.5,
        "ndp_pct": 3.2,
        "bq_pct": 26.03,
        "grn_pct": 1.75,
        "ppc_pct": 1.18
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.03,
        "turnout_pct": 71.63,
        "lib_pct": 45.06,
        "con_pct": 21.5,
        "ndp_pct": 3.2,
        "bq_pct": 26.03,
        "grn_pct": 1.75,
        "ppc_pct": 1.18
      }
    },
    {
      "riding_id": "24020",
      "name_en": "Côte-du-Sud-Rivière-du-Loup-Kataskomiq-Témiscouata",
      "name_fr": "Côte-du-Sud-Rivière-du-Loup-Kataskomiq-Témiscouata",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 12.41,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 31.54,
          "con": 43.95,
          "ndp": 2.8,
          "bq": 20.4,
          "grn": 2.14,
          "ppc": 1.09
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 15.28,
        "turnout_pct": 66.71,
        "lib_pct": 30.32,
        "con_pct": 45.84,
        "ndp_pct": 1.7,
        "bq_pct": 20.0,
        "grn_pct": 1.08,
        "ppc_pct": 0.74
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 15.28,
        "turnout_pct": 66.71,
        "lib_pct": 30.32,
        "con_pct": 45.84,
        "ndp_pct": 1.7,
        "bq_pct": 20.0,
        "grn_pct": 1.08,
        "ppc_pct": 0.74
      }
    },
    {
      "riding_id": "24021",
      "name_en": "Côte-Nord--Kawawachikamach--Nitassinan",
      "name_fr": "Côte-Nord--Kawawachikamach--Nitassinan",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 14.83,
        "p_close_race": 0.0001,
        "vote_mean": {
          "lib": 28.22,
          "con": 23.99,
          "ndp": 2.8,
          "bq": 43.05,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 16.06,
        "turnout_pct": 52.91,
        "lib_pct": 27.0,
        "con_pct": 24.83,
        "ndp_pct": 1.7,
        "bq_pct": 43.06,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 16.06,
        "turnout_pct": 52.91,
        "lib_pct": 27.0,
        "con_pct": 24.83,
        "ndp_pct": 1.7,
        "bq_pct": 43.06,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24022",
      "name_en": "Dorval--Lachine--LaSalle",
      "name_fr": "Dorval--Lachine--LaSalle",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 39.82,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 59.86,
          "con": 20.04,
          "ndp": 5.22,
          "bq": 12.43,
          "grn": 2.67,
          "ppc": 1.27
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 38.21,
        "turnout_pct": 63.42,
        "lib_pct": 58.64,
        "con_pct": 20.43,
        "ndp_pct": 4.12,
        "bq_pct": 12.42,
        "grn_pct": 1.61,
        "ppc_pct": 0.94
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 38.21,
        "turnout_pct": 63.42,
        "lib_pct": 58.64,
        "con_pct": 20.43,
        "ndp_pct": 4.12,
        "bq_pct": 12.42,
        "grn_pct": 1.61,
        "ppc_pct": 0.94
      }
    },
    {
      "riding_id": "24023",
      "name_en": "Drummond",
      "name_fr": "Drummond",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 13.26,
        "p_close_race": 0.0014,
        "vote_mean": {
          "lib": 29.12,
          "con": 20.42,
          "ndp": 5.65,
          "bq": 42.38,
          "grn": 1.09,
          "ppc": 1.65
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 14.08,
        "turnout_pct": 65.03,
        "lib_pct": 27.9,
        "con_pct": 22.31,
        "ndp_pct": 4.55,
        "bq_pct": 41.98,
        "grn_pct": 0.0,
        "ppc_pct": 1.35
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 14.08,
        "turnout_pct": 65.03,
        "lib_pct": 27.9,
        "con_pct": 22.31,
        "ndp_pct": 4.55,
        "bq_pct": 41.98,
        "grn_pct": 0.0,
        "ppc_pct": 1.35
      }
    },
    {
      "riding_id": "24024",
      "name_en": "Gaspésie--Les Îles-de-la-Madeleine--Listuguj",
      "name_fr": "Gaspésie--Les Îles-de-la-Madeleine--Listuguj",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9875,
        "mean_margin": 6.19,
        "p_close_race": 0.337,
        "vote_mean": {
          "lib": 38.95,
          "con": 11.09,
          "ndp": 2.84,
          "bq": 45.11,
          "grn": 1.09,
          "ppc": 1.12
        },
        "win_prob": {
          "lib": 0.0125,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9875,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 7.39,
        "turnout_pct": 60.39,
        "lib_pct": 37.73,
        "con_pct": 12.19,
        "ndp_pct": 1.74,
        "bq_pct": 45.12,
        "grn_pct": 0.0,
        "ppc_pct": 0.78
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 7.39,
        "turnout_pct": 60.39,
        "lib_pct": 37.73,
        "con_pct": 12.19,
        "ndp_pct": 1.74,
        "bq_pct": 45.12,
        "grn_pct": 0.0,
        "ppc_pct": 0.78
      }
    },
    {
      "riding_id": "24025",
      "name_en": "Gatineau",
      "name_fr": "Gatineau",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 42.52,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 61.1,
          "con": 18.22,
          "ndp": 3.88,
          "bq": 16.16,
          "grn": 1.09,
          "ppc": 1.2
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 40.96,
        "turnout_pct": 68.13,
        "lib_pct": 59.88,
        "con_pct": 18.92,
        "ndp_pct": 2.78,
        "bq_pct": 16.15,
        "grn_pct": 0.0,
        "ppc_pct": 0.87
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 40.96,
        "turnout_pct": 68.13,
        "lib_pct": 59.88,
        "con_pct": 18.92,
        "ndp_pct": 2.78,
        "bq_pct": 16.15,
        "grn_pct": 0.0,
        "ppc_pct": 0.87
      }
    },
    {
      "riding_id": "24026",
      "name_en": "Hochelaga--Rosemont-Est",
      "name_fr": "Hochelaga--Rosemont-Est",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 19.88,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 46.64,
          "con": 10.01,
          "ndp": 13.94,
          "bq": 26.76,
          "grn": 3.62,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 18.66,
        "turnout_pct": 65.52,
        "lib_pct": 45.42,
        "con_pct": 10.4,
        "ndp_pct": 12.84,
        "bq_pct": 26.75,
        "grn_pct": 2.56,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 18.66,
        "turnout_pct": 65.52,
        "lib_pct": 45.42,
        "con_pct": 10.4,
        "ndp_pct": 12.84,
        "bq_pct": 26.75,
        "grn_pct": 2.56,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24027",
      "name_en": "Honoré-Mercier",
      "name_fr": "Honoré-Mercier",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 39.65,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 60.38,
          "con": 20.73,
          "ndp": 4.63,
          "bq": 12.71,
          "grn": 2.18,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 38.04,
        "turnout_pct": 65.09,
        "lib_pct": 59.16,
        "con_pct": 21.12,
        "ndp_pct": 3.53,
        "bq_pct": 12.71,
        "grn_pct": 1.12,
        "ppc_pct": 0.69
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 38.04,
        "turnout_pct": 65.09,
        "lib_pct": 59.16,
        "con_pct": 21.12,
        "ndp_pct": 3.53,
        "bq_pct": 12.71,
        "grn_pct": 1.12,
        "ppc_pct": 0.69
      }
    },
    {
      "riding_id": "24028",
      "name_en": "Hull--Aylmer",
      "name_fr": "Hull--Aylmer",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 46.26,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 62.71,
          "con": 16.39,
          "ndp": 6.59,
          "bq": 12.0,
          "grn": 3.23,
          "ppc": 1.02
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 44.71,
        "turnout_pct": 69.39,
        "lib_pct": 61.49,
        "con_pct": 16.78,
        "ndp_pct": 5.49,
        "bq_pct": 12.01,
        "grn_pct": 2.17,
        "ppc_pct": 0.66
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 44.71,
        "turnout_pct": 69.39,
        "lib_pct": 61.49,
        "con_pct": 16.78,
        "ndp_pct": 5.49,
        "bq_pct": 12.01,
        "grn_pct": 2.17,
        "ppc_pct": 0.66
      }
    },
    {
      "riding_id": "24029",
      "name_en": "Joliette--Manawan",
      "name_fr": "Joliette--Manawan",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 16.86,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 31.9,
          "con": 13.06,
          "ndp": 3.51,
          "bq": 48.76,
          "grn": 2.8,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 17.67,
        "turnout_pct": 64.92,
        "lib_pct": 30.68,
        "con_pct": 14.95,
        "ndp_pct": 2.41,
        "bq_pct": 48.35,
        "grn_pct": 1.74,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 17.67,
        "turnout_pct": 64.92,
        "lib_pct": 30.68,
        "con_pct": 14.95,
        "ndp_pct": 2.41,
        "bq_pct": 48.35,
        "grn_pct": 1.74,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24030",
      "name_en": "Jonquière",
      "name_fr": "Jonquière",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 11.58,
        "p_close_race": 0.0071,
        "vote_mean": {
          "lib": 26.82,
          "con": 27.88,
          "ndp": 2.91,
          "bq": 39.77,
          "grn": 1.93,
          "ppc": 1.32
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 9.59,
        "turnout_pct": 67.82,
        "lib_pct": 25.6,
        "con_pct": 29.77,
        "ndp_pct": 1.81,
        "bq_pct": 39.36,
        "grn_pct": 0.87,
        "ppc_pct": 1.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 9.59,
        "turnout_pct": 67.82,
        "lib_pct": 25.6,
        "con_pct": 29.77,
        "ndp_pct": 1.81,
        "bq_pct": 39.36,
        "grn_pct": 0.87,
        "ppc_pct": 1.0
      }
    },
    {
      "riding_id": "24031",
      "name_en": "La Pointe-de-l'Île",
      "name_fr": "La Pointe-de-l'Île",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9346,
        "mean_margin": 4.28,
        "p_close_race": 0.6274,
        "vote_mean": {
          "lib": 38.22,
          "con": 11.73,
          "ndp": 5.31,
          "bq": 42.34,
          "grn": 2.86,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.0654,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9346,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 5.33,
        "turnout_pct": 65.03,
        "lib_pct": 37.0,
        "con_pct": 12.51,
        "ndp_pct": 4.21,
        "bq_pct": 42.33,
        "grn_pct": 1.8,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 5.33,
        "turnout_pct": 65.03,
        "lib_pct": 37.0,
        "con_pct": 12.51,
        "ndp_pct": 4.21,
        "bq_pct": 42.33,
        "grn_pct": 1.8,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24032",
      "name_en": "La Prairie--Atateken",
      "name_fr": "La Prairie--Atateken",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9999,
        "mean_margin": 10.37,
        "p_close_race": 0.0256,
        "vote_mean": {
          "lib": 44.77,
          "con": 16.64,
          "ndp": 3.45,
          "bq": 34.4,
          "grn": 2.03,
          "ppc": 0.91
        },
        "win_prob": {
          "lib": 0.9999,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0001,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 9.16,
        "turnout_pct": 72.9,
        "lib_pct": 43.55,
        "con_pct": 17.03,
        "ndp_pct": 2.35,
        "bq_pct": 34.39,
        "grn_pct": 0.97,
        "ppc_pct": 0.53
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 9.16,
        "turnout_pct": 72.9,
        "lib_pct": 43.55,
        "con_pct": 17.03,
        "ndp_pct": 2.35,
        "bq_pct": 34.39,
        "grn_pct": 0.97,
        "ppc_pct": 0.53
      }
    },
    {
      "riding_id": "24033",
      "name_en": "Lac-Saint-Jean",
      "name_fr": "Lac-Saint-Jean",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 18.84,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 27.1,
          "con": 22.45,
          "ndp": 2.79,
          "bq": 45.95,
          "grn": 1.09,
          "ppc": 1.42
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 19.68,
        "turnout_pct": 64.01,
        "lib_pct": 25.88,
        "con_pct": 24.34,
        "ndp_pct": 1.69,
        "bq_pct": 45.55,
        "grn_pct": 0.0,
        "ppc_pct": 1.11
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 19.68,
        "turnout_pct": 64.01,
        "lib_pct": 25.88,
        "con_pct": 24.34,
        "ndp_pct": 1.69,
        "bq_pct": 45.55,
        "grn_pct": 0.0,
        "ppc_pct": 1.11
      }
    },
    {
      "riding_id": "24034",
      "name_en": "Lac-Saint-Louis",
      "name_fr": "Lac-Saint-Louis",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 45.94,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 68.83,
          "con": 22.89,
          "ndp": 4.0,
          "bq": 3.7,
          "grn": 2.47,
          "ppc": 1.08
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 43.67,
        "turnout_pct": 75.06,
        "lib_pct": 67.17,
        "con_pct": 23.51,
        "ndp_pct": 2.9,
        "bq_pct": 3.6,
        "grn_pct": 1.41,
        "ppc_pct": 0.73
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 43.67,
        "turnout_pct": 75.06,
        "lib_pct": 67.17,
        "con_pct": 23.51,
        "ndp_pct": 2.9,
        "bq_pct": 3.6,
        "grn_pct": 1.41,
        "ppc_pct": 0.73
      }
    },
    {
      "riding_id": "24035",
      "name_en": "LaSalle--Émard--Verdun",
      "name_fr": "LaSalle--Émard--Verdun",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 30.46,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 51.46,
          "con": 13.26,
          "ndp": 11.33,
          "bq": 20.99,
          "grn": 3.44,
          "ppc": 0.87
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 29.24,
        "turnout_pct": 66.57,
        "lib_pct": 50.24,
        "con_pct": 13.65,
        "ndp_pct": 10.23,
        "bq_pct": 21.0,
        "grn_pct": 2.38,
        "ppc_pct": 0.48
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 29.24,
        "turnout_pct": 66.57,
        "lib_pct": 50.24,
        "con_pct": 13.65,
        "ndp_pct": 10.23,
        "bq_pct": 21.0,
        "grn_pct": 2.38,
        "ppc_pct": 0.48
      }
    },
    {
      "riding_id": "24036",
      "name_en": "Laurentides--Labelle",
      "name_fr": "Laurentides--Labelle",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9992,
        "mean_margin": 8.64,
        "p_close_race": 0.0919,
        "vote_mean": {
          "lib": 35.58,
          "con": 12.77,
          "ndp": 3.59,
          "bq": 44.22,
          "grn": 2.66,
          "ppc": 1.69
        },
        "win_prob": {
          "lib": 0.0008,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9992,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 9.47,
        "turnout_pct": 65.53,
        "lib_pct": 34.36,
        "con_pct": 14.66,
        "ndp_pct": 2.49,
        "bq_pct": 43.83,
        "grn_pct": 1.6,
        "ppc_pct": 1.39
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 9.47,
        "turnout_pct": 65.53,
        "lib_pct": 34.36,
        "con_pct": 14.66,
        "ndp_pct": 2.49,
        "bq_pct": 43.83,
        "grn_pct": 1.6,
        "ppc_pct": 1.39
      }
    },
    {
      "riding_id": "24037",
      "name_en": "Laurier--Sainte-Marie",
      "name_fr": "Laurier--Sainte-Marie",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 32.95,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 52.7,
          "con": 8.66,
          "ndp": 19.7,
          "bq": 15.26,
          "grn": 3.8,
          "ppc": 0.87
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 32.88,
        "turnout_pct": 64.02,
        "lib_pct": 51.48,
        "con_pct": 9.05,
        "ndp_pct": 18.6,
        "bq_pct": 15.24,
        "grn_pct": 2.74,
        "ppc_pct": 0.48
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 32.88,
        "turnout_pct": 64.02,
        "lib_pct": 51.48,
        "con_pct": 9.05,
        "ndp_pct": 18.6,
        "bq_pct": 15.24,
        "grn_pct": 2.74,
        "ppc_pct": 0.48
      }
    },
    {
      "riding_id": "24038",
      "name_en": "Laval--Les Îles",
      "name_fr": "Laval--Les Îles",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 19.09,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 50.95,
          "con": 31.86,
          "ndp": 4.55,
          "bq": 14.59,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 17.25,
        "turnout_pct": 66.28,
        "lib_pct": 49.73,
        "con_pct": 32.25,
        "ndp_pct": 3.45,
        "bq_pct": 14.58,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 17.25,
        "turnout_pct": 66.28,
        "lib_pct": 49.73,
        "con_pct": 32.25,
        "ndp_pct": 3.45,
        "bq_pct": 14.58,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24039",
      "name_en": "Les Pays-d'en-Haut",
      "name_fr": "Les Pays-d'en-Haut",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9872,
        "mean_margin": 6.08,
        "p_close_race": 0.3507,
        "vote_mean": {
          "lib": 41.74,
          "con": 16.68,
          "ndp": 3.34,
          "bq": 35.68,
          "grn": 2.62,
          "ppc": 1.28
        },
        "win_prob": {
          "lib": 0.9872,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0128,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 4.83,
        "turnout_pct": 69.68,
        "lib_pct": 40.52,
        "con_pct": 17.75,
        "ndp_pct": 2.24,
        "bq_pct": 35.69,
        "grn_pct": 1.56,
        "ppc_pct": 0.96
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 4.83,
        "turnout_pct": 69.68,
        "lib_pct": 40.52,
        "con_pct": 17.75,
        "ndp_pct": 2.24,
        "bq_pct": 35.69,
        "grn_pct": 1.56,
        "ppc_pct": 0.96
      }
    },
    {
      "riding_id": "24040",
      "name_en": "Lévis--Lotbinière",
      "name_fr": "Lévis--Lotbinière",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 14.94,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 30.27,
          "con": 45.21,
          "ndp": 3.41,
          "bq": 19.68,
          "grn": 1.09,
          "ppc": 1.31
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 18.05,
        "turnout_pct": 76.68,
        "lib_pct": 29.05,
        "con_pct": 47.1,
        "ndp_pct": 2.31,
        "bq_pct": 19.27,
        "grn_pct": 0.0,
        "ppc_pct": 0.99
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 18.05,
        "turnout_pct": 76.68,
        "lib_pct": 29.05,
        "con_pct": 47.1,
        "ndp_pct": 2.31,
        "bq_pct": 19.27,
        "grn_pct": 0.0,
        "ppc_pct": 0.99
      }
    },
    {
      "riding_id": "24041",
      "name_en": "Longueuil--Charles-LeMoyne",
      "name_fr": "Longueuil--Charles-LeMoyne",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 23.46,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 49.63,
          "con": 16.07,
          "ndp": 6.55,
          "bq": 26.17,
          "grn": 1.09,
          "ppc": 1.13
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 22.25,
        "turnout_pct": 63.38,
        "lib_pct": 48.41,
        "con_pct": 16.46,
        "ndp_pct": 5.45,
        "bq_pct": 26.16,
        "grn_pct": 0.0,
        "ppc_pct": 0.79
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 22.25,
        "turnout_pct": 63.38,
        "lib_pct": 48.41,
        "con_pct": 16.46,
        "ndp_pct": 5.45,
        "bq_pct": 26.16,
        "grn_pct": 0.0,
        "ppc_pct": 0.79
      }
    },
    {
      "riding_id": "24042",
      "name_en": "Longueuil--Saint-Hubert",
      "name_fr": "Longueuil--Saint-Hubert",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8177,
        "mean_margin": 3.03,
        "p_close_race": 0.8173,
        "vote_mean": {
          "lib": 41.41,
          "con": 13.3,
          "ndp": 6.05,
          "bq": 38.92,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.8177,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.1823,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 1.28,
        "turnout_pct": 69.65,
        "lib_pct": 40.19,
        "con_pct": 14.01,
        "ndp_pct": 4.95,
        "bq_pct": 38.91,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 1.28,
        "turnout_pct": 69.65,
        "lib_pct": 40.19,
        "con_pct": 14.01,
        "ndp_pct": 4.95,
        "bq_pct": 38.91,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24043",
      "name_en": "Louis-Hébert",
      "name_fr": "Louis-Hébert",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 34.59,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.0,
          "con": 18.85,
          "ndp": 3.62,
          "bq": 21.09,
          "grn": 1.09,
          "ppc": 0.92
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 33.7,
        "turnout_pct": 76.76,
        "lib_pct": 54.78,
        "con_pct": 19.88,
        "ndp_pct": 2.52,
        "bq_pct": 21.08,
        "grn_pct": 0.0,
        "ppc_pct": 0.54
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 33.7,
        "turnout_pct": 76.76,
        "lib_pct": 54.78,
        "con_pct": 19.88,
        "ndp_pct": 2.52,
        "bq_pct": 21.08,
        "grn_pct": 0.0,
        "ppc_pct": 0.54
      }
    },
    {
      "riding_id": "24044",
      "name_en": "Louis-Saint-Laurent--Akiawenhrahk",
      "name_fr": "Louis-Saint-Laurent--Akiawenhrahk",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 8.63,
        "p_close_race": 0.0218,
        "vote_mean": {
          "lib": 33.72,
          "con": 42.35,
          "ndp": 3.51,
          "bq": 19.08,
          "grn": 1.09,
          "ppc": 1.13
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 11.73,
        "turnout_pct": 72.65,
        "lib_pct": 32.5,
        "con_pct": 44.24,
        "ndp_pct": 2.41,
        "bq_pct": 18.68,
        "grn_pct": 0.0,
        "ppc_pct": 0.79
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 11.73,
        "turnout_pct": 72.65,
        "lib_pct": 32.5,
        "con_pct": 44.24,
        "ndp_pct": 2.41,
        "bq_pct": 18.68,
        "grn_pct": 0.0,
        "ppc_pct": 0.79
      }
    },
    {
      "riding_id": "24045",
      "name_en": "Marc-Aurèle-Fortin",
      "name_fr": "Marc-Aurèle-Fortin",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 29.45,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.22,
          "con": 20.31,
          "ndp": 4.8,
          "bq": 23.61,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 28.4,
        "turnout_pct": 70.43,
        "lib_pct": 52.0,
        "con_pct": 20.7,
        "ndp_pct": 3.7,
        "bq_pct": 23.6,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 28.4,
        "turnout_pct": 70.43,
        "lib_pct": 52.0,
        "con_pct": 20.7,
        "ndp_pct": 3.7,
        "bq_pct": 23.6,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24046",
      "name_en": "Mégantic--L'Érable--Lotbinière",
      "name_fr": "Mégantic--L'Érable--Lotbinière",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 34.18,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 22.7,
          "con": 56.9,
          "ndp": 2.92,
          "bq": 16.78,
          "grn": 1.09,
          "ppc": 1.53
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 36.69,
        "turnout_pct": 70.16,
        "lib_pct": 21.48,
        "con_pct": 58.79,
        "ndp_pct": 1.82,
        "bq_pct": 16.38,
        "grn_pct": 0.0,
        "ppc_pct": 1.22
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 36.69,
        "turnout_pct": 70.16,
        "lib_pct": 21.48,
        "con_pct": 58.79,
        "ndp_pct": 1.82,
        "bq_pct": 16.38,
        "grn_pct": 0.0,
        "ppc_pct": 1.22
      }
    },
    {
      "riding_id": "24047",
      "name_en": "Mirabel",
      "name_fr": "Mirabel",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9733,
        "mean_margin": 5.31,
        "p_close_race": 0.4656,
        "vote_mean": {
          "lib": 34.05,
          "con": 20.77,
          "ndp": 3.43,
          "bq": 39.3,
          "grn": 2.44,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 0.0267,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9733,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 6.46,
        "turnout_pct": 69.29,
        "lib_pct": 32.83,
        "con_pct": 21.91,
        "ndp_pct": 2.33,
        "bq_pct": 39.29,
        "grn_pct": 1.38,
        "ppc_pct": 0.7
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 6.46,
        "turnout_pct": 69.29,
        "lib_pct": 32.83,
        "con_pct": 21.91,
        "ndp_pct": 2.33,
        "bq_pct": 39.29,
        "grn_pct": 1.38,
        "ppc_pct": 0.7
      }
    },
    {
      "riding_id": "24048",
      "name_en": "Mount Royal",
      "name_fr": "Mont-Royal",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.06,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 51.57,
          "con": 39.51,
          "ndp": 5.74,
          "bq": 3.4,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 10.45,
        "turnout_pct": 65.63,
        "lib_pct": 50.35,
        "con_pct": 39.9,
        "ndp_pct": 4.64,
        "bq_pct": 3.29,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 10.45,
        "turnout_pct": 65.63,
        "lib_pct": 50.35,
        "con_pct": 39.9,
        "ndp_pct": 4.64,
        "bq_pct": 3.29,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24049",
      "name_en": "Mont-Saint-Bruno--L'Acadie",
      "name_fr": "Mont-Saint-Bruno--L'Acadie",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 13.09,
        "p_close_race": 0.0012,
        "vote_mean": {
          "lib": 47.73,
          "con": 12.61,
          "ndp": 3.4,
          "bq": 34.64,
          "grn": 2.27,
          "ppc": 0.95
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 11.87,
        "turnout_pct": 77.8,
        "lib_pct": 46.51,
        "con_pct": 13.51,
        "ndp_pct": 2.3,
        "bq_pct": 34.64,
        "grn_pct": 1.21,
        "ppc_pct": 0.57
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 11.87,
        "turnout_pct": 77.8,
        "lib_pct": 46.51,
        "con_pct": 13.51,
        "ndp_pct": 2.3,
        "bq_pct": 34.64,
        "grn_pct": 1.21,
        "ppc_pct": 0.57
      }
    },
    {
      "riding_id": "24050",
      "name_en": "Montcalm",
      "name_fr": "Montcalm",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 18.38,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 27.59,
          "con": 20.83,
          "ndp": 4.27,
          "bq": 45.97,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 19.23,
        "turnout_pct": 63.93,
        "lib_pct": 26.37,
        "con_pct": 22.72,
        "ndp_pct": 3.17,
        "bq_pct": 45.59,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 19.23,
        "turnout_pct": 63.93,
        "lib_pct": 26.37,
        "con_pct": 22.72,
        "ndp_pct": 3.17,
        "bq_pct": 45.59,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24051",
      "name_en": "Montmorency--Charlevoix",
      "name_fr": "Montmorency--Charlevoix",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "bq",
        "p_winner": 0.6918,
        "mean_margin": 2.37,
        "p_close_race": 0.906,
        "vote_mean": {
          "lib": 29.66,
          "con": 32.19,
          "ndp": 2.6,
          "bq": 33.61,
          "grn": 1.09,
          "ppc": 0.96
        },
        "win_prob": {
          "lib": 0.015,
          "con": 0.2932,
          "ndp": 0.0,
          "bq": 0.6918,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 0.87,
        "turnout_pct": 72.06,
        "lib_pct": 28.44,
        "con_pct": 34.08,
        "ndp_pct": 1.5,
        "bq_pct": 33.21,
        "grn_pct": 0.0,
        "ppc_pct": 0.59
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 0.87,
        "turnout_pct": 72.06,
        "lib_pct": 28.44,
        "con_pct": 34.08,
        "ndp_pct": 1.5,
        "bq_pct": 33.21,
        "grn_pct": 0.0,
        "ppc_pct": 0.59
      }
    },
    {
      "riding_id": "24052",
      "name_en": "Notre-Dame-de-Grâce--Westmount",
      "name_fr": "Notre-Dame-de-Grâce--Westmount",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 45.77,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 64.79,
          "con": 19.02,
          "ndp": 8.43,
          "bq": 4.94,
          "grn": 3.53,
          "ppc": 0.87
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 43.93,
        "turnout_pct": 67.23,
        "lib_pct": 63.41,
        "con_pct": 19.49,
        "ndp_pct": 7.33,
        "bq_pct": 4.91,
        "grn_pct": 2.47,
        "ppc_pct": 0.47
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 43.93,
        "turnout_pct": 67.23,
        "lib_pct": 63.41,
        "con_pct": 19.49,
        "ndp_pct": 7.33,
        "bq_pct": 4.91,
        "grn_pct": 2.47,
        "ppc_pct": 0.47
      }
    },
    {
      "riding_id": "24053",
      "name_en": "Outremont",
      "name_fr": "Outremont",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 42.46,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.72,
          "con": 11.99,
          "ndp": 11.62,
          "bq": 11.81,
          "grn": 10.57,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 42.12,
        "turnout_pct": 62.34,
        "lib_pct": 54.5,
        "con_pct": 12.38,
        "ndp_pct": 10.52,
        "bq_pct": 11.82,
        "grn_pct": 9.51,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 42.12,
        "turnout_pct": 62.34,
        "lib_pct": 54.5,
        "con_pct": 12.38,
        "ndp_pct": 10.52,
        "bq_pct": 11.82,
        "grn_pct": 9.51,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24054",
      "name_en": "Papineau",
      "name_fr": "Papineau",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 35.6,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.49,
          "con": 10.04,
          "ndp": 17.19,
          "bq": 16.34,
          "grn": 1.09,
          "ppc": 1.28
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 35.92,
        "turnout_pct": 65.57,
        "lib_pct": 52.27,
        "con_pct": 10.43,
        "ndp_pct": 16.09,
        "bq_pct": 16.35,
        "grn_pct": 0.0,
        "ppc_pct": 0.96
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 35.92,
        "turnout_pct": 65.57,
        "lib_pct": 52.27,
        "con_pct": 10.43,
        "ndp_pct": 16.09,
        "bq_pct": 16.35,
        "grn_pct": 0.0,
        "ppc_pct": 0.96
      }
    },
    {
      "riding_id": "24055",
      "name_en": "Pierre-Boucher--Les Patriotes--Verchères",
      "name_fr": "Pierre-Boucher--Les Patriotes--Verchères",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9897,
        "mean_margin": 6.4,
        "p_close_race": 0.3084,
        "vote_mean": {
          "lib": 39.52,
          "con": 9.78,
          "ndp": 3.54,
          "bq": 45.9,
          "grn": 1.09,
          "ppc": 1.18
        },
        "win_prob": {
          "lib": 0.0103,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9897,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 7.19,
        "turnout_pct": 76.32,
        "lib_pct": 38.3,
        "con_pct": 11.67,
        "ndp_pct": 2.44,
        "bq_pct": 45.5,
        "grn_pct": 0.0,
        "ppc_pct": 0.84
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 7.19,
        "turnout_pct": 76.32,
        "lib_pct": 38.3,
        "con_pct": 11.67,
        "ndp_pct": 2.44,
        "bq_pct": 45.5,
        "grn_pct": 0.0,
        "ppc_pct": 0.84
      }
    },
    {
      "riding_id": "24056",
      "name_en": "Pierrefonds--Dollard",
      "name_fr": "Pierrefonds--Dollard",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 30.85,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 60.71,
          "con": 29.86,
          "ndp": 3.9,
          "bq": 5.39,
          "grn": 1.09,
          "ppc": 0.95
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 29.24,
        "turnout_pct": 69.33,
        "lib_pct": 59.49,
        "con_pct": 30.25,
        "ndp_pct": 2.8,
        "bq_pct": 5.37,
        "grn_pct": 0.0,
        "ppc_pct": 0.58
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 29.24,
        "turnout_pct": 69.33,
        "lib_pct": 59.49,
        "con_pct": 30.25,
        "ndp_pct": 2.8,
        "bq_pct": 5.37,
        "grn_pct": 0.0,
        "ppc_pct": 0.58
      }
    },
    {
      "riding_id": "24057",
      "name_en": "Pontiac--Kitigan Zibi",
      "name_fr": "Pontiac--Kitigan Zibi",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 28.34,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.28,
          "con": 26.94,
          "ndp": 6.11,
          "bq": 10.2,
          "grn": 2.32,
          "ppc": 1.44
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 26.73,
        "turnout_pct": 69.04,
        "lib_pct": 54.06,
        "con_pct": 27.33,
        "ndp_pct": 5.01,
        "bq_pct": 10.23,
        "grn_pct": 1.26,
        "ppc_pct": 1.13
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 26.73,
        "turnout_pct": 69.04,
        "lib_pct": 54.06,
        "con_pct": 27.33,
        "ndp_pct": 5.01,
        "bq_pct": 10.23,
        "grn_pct": 1.26,
        "ppc_pct": 1.13
      }
    },
    {
      "riding_id": "24058",
      "name_en": "Portneuf--Jacques-Cartier",
      "name_fr": "Portneuf--Jacques-Cartier",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 17.17,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 29.94,
          "con": 47.11,
          "ndp": 2.67,
          "bq": 18.07,
          "grn": 2.17,
          "ppc": 1.14
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 20.28,
        "turnout_pct": 74.15,
        "lib_pct": 28.72,
        "con_pct": 49.0,
        "ndp_pct": 1.57,
        "bq_pct": 17.67,
        "grn_pct": 1.11,
        "ppc_pct": 0.8
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 20.28,
        "turnout_pct": 74.15,
        "lib_pct": 28.72,
        "con_pct": 49.0,
        "ndp_pct": 1.57,
        "bq_pct": 17.67,
        "grn_pct": 1.11,
        "ppc_pct": 0.8
      }
    },
    {
      "riding_id": "24059",
      "name_en": "Québec Centre",
      "name_fr": "Québec-Centre",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.44,
        "p_close_race": 0.0005,
        "vote_mean": {
          "lib": 49.21,
          "con": 0.1,
          "ndp": 8.67,
          "bq": 34.77,
          "grn": 1.09,
          "ppc": 5.14
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 13.21,
        "turnout_pct": 70.12,
        "lib_pct": 47.99,
        "con_pct": 0.0,
        "ndp_pct": 7.57,
        "bq_pct": 34.77,
        "grn_pct": 0.0,
        "ppc_pct": 4.85
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 13.21,
        "turnout_pct": 70.12,
        "lib_pct": 47.99,
        "con_pct": 0.0,
        "ndp_pct": 7.57,
        "bq_pct": 34.77,
        "grn_pct": 0.0,
        "ppc_pct": 4.85
      }
    },
    {
      "riding_id": "24060",
      "name_en": "Repentigny",
      "name_fr": "Repentigny",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.7849,
        "mean_margin": 2.84,
        "p_close_race": 0.8461,
        "vote_mean": {
          "lib": 39.29,
          "con": 13.76,
          "ndp": 3.78,
          "bq": 41.46,
          "grn": 1.09,
          "ppc": 0.97
        },
        "win_prob": {
          "lib": 0.2151,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.7849,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 3.39,
        "turnout_pct": 71.33,
        "lib_pct": 38.07,
        "con_pct": 14.94,
        "ndp_pct": 2.68,
        "bq_pct": 41.46,
        "grn_pct": 0.0,
        "ppc_pct": 0.6
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 3.39,
        "turnout_pct": 71.33,
        "lib_pct": 38.07,
        "con_pct": 14.94,
        "ndp_pct": 2.68,
        "bq_pct": 41.46,
        "grn_pct": 0.0,
        "ppc_pct": 0.6
      }
    },
    {
      "riding_id": "24061",
      "name_en": "Richmond--Arthabaska",
      "name_fr": "Richmond--Arthabaska",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.6353,
        "mean_margin": 1.53,
        "p_close_race": 0.9924,
        "vote_mean": {
          "lib": 33.59,
          "con": 32.96,
          "ndp": 3.06,
          "bq": 27.22,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.6353,
          "con": 0.3604,
          "ndp": 0.0,
          "bq": 0.0044,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 2.47,
        "turnout_pct": 70.21,
        "lib_pct": 32.37,
        "con_pct": 34.85,
        "ndp_pct": 1.96,
        "bq_pct": 26.83,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 2.47,
        "turnout_pct": 70.21,
        "lib_pct": 32.37,
        "con_pct": 34.85,
        "ndp_pct": 1.96,
        "bq_pct": 26.83,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24062",
      "name_en": "Rimouski--La Matapédia",
      "name_fr": "Rimouski--La Matapédia",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9998,
        "mean_margin": 9.67,
        "p_close_race": 0.0454,
        "vote_mean": {
          "lib": 36.28,
          "con": 11.48,
          "ndp": 2.88,
          "bq": 45.95,
          "grn": 1.09,
          "ppc": 0.99
        },
        "win_prob": {
          "lib": 0.0002,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9998,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 10.49,
        "turnout_pct": 65.0,
        "lib_pct": 35.06,
        "con_pct": 13.37,
        "ndp_pct": 1.78,
        "bq_pct": 45.55,
        "grn_pct": 0.0,
        "ppc_pct": 0.62
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 10.49,
        "turnout_pct": 65.0,
        "lib_pct": 35.06,
        "con_pct": 13.37,
        "ndp_pct": 1.78,
        "bq_pct": 45.55,
        "grn_pct": 0.0,
        "ppc_pct": 0.62
      }
    },
    {
      "riding_id": "24063",
      "name_en": "Rivière-des-Mille-Îles",
      "name_fr": "Rivière-des-Mille-Îles",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 13.82,
        "p_close_race": 0.0005,
        "vote_mean": {
          "lib": 46.2,
          "con": 16.73,
          "ndp": 3.19,
          "bq": 32.38,
          "grn": 2.27,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 12.6,
        "turnout_pct": 71.8,
        "lib_pct": 44.98,
        "con_pct": 17.12,
        "ndp_pct": 2.09,
        "bq_pct": 32.38,
        "grn_pct": 1.21,
        "ppc_pct": 0.5
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 12.6,
        "turnout_pct": 71.8,
        "lib_pct": 44.98,
        "con_pct": 17.12,
        "ndp_pct": 2.09,
        "bq_pct": 32.38,
        "grn_pct": 1.21,
        "ppc_pct": 0.5
      }
    },
    {
      "riding_id": "24064",
      "name_en": "Rivière-du-Nord",
      "name_fr": "Rivière-du-Nord",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 1.0,
        "mean_margin": 11.14,
        "p_close_race": 0.0129,
        "vote_mean": {
          "lib": 32.12,
          "con": 18.67,
          "ndp": 4.52,
          "bq": 43.26,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 1.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 11.95,
        "turnout_pct": 63.34,
        "lib_pct": 30.9,
        "con_pct": 20.56,
        "ndp_pct": 3.42,
        "bq_pct": 42.85,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 11.95,
        "turnout_pct": 63.34,
        "lib_pct": 30.9,
        "con_pct": 20.56,
        "ndp_pct": 3.42,
        "bq_pct": 42.85,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24065",
      "name_en": "Rosemont--La Petite-Patrie",
      "name_fr": "Rosemont--La Petite-Patrie",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "ndp",
        "p_winner": 1.0,
        "mean_margin": 9.19,
        "p_close_race": 0.0066,
        "vote_mean": {
          "lib": 32.39,
          "con": 6.38,
          "ndp": 41.58,
          "bq": 18.04,
          "grn": 3.33,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 1.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "ndp",
        "margin": 9.31,
        "turnout_pct": 72.3,
        "lib_pct": 31.17,
        "con_pct": 6.77,
        "ndp_pct": 40.48,
        "bq_pct": 18.05,
        "grn_pct": 2.27,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "ndp",
        "margin": 9.31,
        "turnout_pct": 72.3,
        "lib_pct": 31.17,
        "con_pct": 6.77,
        "ndp_pct": 40.48,
        "bq_pct": 18.05,
        "grn_pct": 2.27,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24066",
      "name_en": "Saint-Hyacinthe--Bagot--Acton",
      "name_fr": "Saint-Hyacinthe--Bagot--Acton",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9996,
        "mean_margin": 9.24,
        "p_close_race": 0.0619,
        "vote_mean": {
          "lib": 34.25,
          "con": 15.77,
          "ndp": 3.42,
          "bq": 43.49,
          "grn": 2.41,
          "ppc": 1.08
        },
        "win_prob": {
          "lib": 0.0004,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9996,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 10.06,
        "turnout_pct": 69.79,
        "lib_pct": 33.03,
        "con_pct": 17.66,
        "ndp_pct": 2.32,
        "bq_pct": 43.09,
        "grn_pct": 1.35,
        "ppc_pct": 0.73
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 10.06,
        "turnout_pct": 69.79,
        "lib_pct": 33.03,
        "con_pct": 17.66,
        "ndp_pct": 2.32,
        "bq_pct": 43.09,
        "grn_pct": 1.35,
        "ppc_pct": 0.73
      }
    },
    {
      "riding_id": "24067",
      "name_en": "Saint-Jean",
      "name_fr": "Saint-Jean",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.9997,
        "mean_margin": 9.06,
        "p_close_race": 0.0677,
        "vote_mean": {
          "lib": 34.88,
          "con": 14.15,
          "ndp": 3.62,
          "bq": 43.94,
          "grn": 2.57,
          "ppc": 1.28
        },
        "win_prob": {
          "lib": 0.0003,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.9997,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 9.91,
        "turnout_pct": 69.76,
        "lib_pct": 33.66,
        "con_pct": 16.04,
        "ndp_pct": 2.52,
        "bq_pct": 43.57,
        "grn_pct": 1.51,
        "ppc_pct": 0.95
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 9.91,
        "turnout_pct": 69.76,
        "lib_pct": 33.66,
        "con_pct": 16.04,
        "ndp_pct": 2.52,
        "bq_pct": 43.57,
        "grn_pct": 1.51,
        "ppc_pct": 0.95
      }
    },
    {
      "riding_id": "24068",
      "name_en": "Saint-Laurent",
      "name_fr": "Saint-Laurent",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 31.81,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 59.24,
          "con": 27.43,
          "ndp": 5.53,
          "bq": 5.65,
          "grn": 2.61,
          "ppc": 1.12
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 30.2,
        "turnout_pct": 60.4,
        "lib_pct": 58.02,
        "con_pct": 27.82,
        "ndp_pct": 4.43,
        "bq_pct": 5.63,
        "grn_pct": 1.55,
        "ppc_pct": 0.78
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 30.2,
        "turnout_pct": 60.4,
        "lib_pct": 58.02,
        "con_pct": 27.82,
        "ndp_pct": 4.43,
        "bq_pct": 5.63,
        "grn_pct": 1.55,
        "ppc_pct": 0.78
      }
    },
    {
      "riding_id": "24069",
      "name_en": "Saint-Léonard--Saint-Michel",
      "name_fr": "Saint-Léonard--Saint-Michel",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 45.34,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 65.08,
          "con": 19.74,
          "ndp": 6.93,
          "bq": 7.0,
          "grn": 1.09,
          "ppc": 1.25
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 43.73,
        "turnout_pct": 58.02,
        "lib_pct": 63.86,
        "con_pct": 20.13,
        "ndp_pct": 5.83,
        "bq_pct": 6.99,
        "grn_pct": 0.0,
        "ppc_pct": 0.92
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 43.73,
        "turnout_pct": 58.02,
        "lib_pct": 63.86,
        "con_pct": 20.13,
        "ndp_pct": 5.83,
        "bq_pct": 6.99,
        "grn_pct": 0.0,
        "ppc_pct": 0.92
      }
    },
    {
      "riding_id": "24070",
      "name_en": "Saint-Maurice--Champlain",
      "name_fr": "Saint-Maurice--Champlain",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 27.41,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 50.39,
          "con": 22.34,
          "ndp": 3.04,
          "bq": 21.26,
          "grn": 2.17,
          "ppc": 1.07
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 24.94,
        "turnout_pct": 65.64,
        "lib_pct": 49.17,
        "con_pct": 24.23,
        "ndp_pct": 1.94,
        "bq_pct": 20.86,
        "grn_pct": 1.11,
        "ppc_pct": 0.72
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 24.94,
        "turnout_pct": 65.64,
        "lib_pct": 49.17,
        "con_pct": 24.23,
        "ndp_pct": 1.94,
        "bq_pct": 20.86,
        "grn_pct": 1.11,
        "ppc_pct": 0.72
      }
    },
    {
      "riding_id": "24071",
      "name_en": "Shefford",
      "name_fr": "Shefford",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "bq",
        "p_winner": 0.5013,
        "mean_margin": 2.18,
        "p_close_race": 0.9327,
        "vote_mean": {
          "lib": 39.8,
          "con": 14.93,
          "ndp": 3.4,
          "bq": 39.82,
          "grn": 1.09,
          "ppc": 1.47
        },
        "win_prob": {
          "lib": 0.4987,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.5013,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "bq",
        "margin": 0.84,
        "turnout_pct": 70.33,
        "lib_pct": 38.58,
        "con_pct": 16.82,
        "ndp_pct": 2.3,
        "bq_pct": 39.43,
        "grn_pct": 0.0,
        "ppc_pct": 1.16
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "bq",
        "margin": 0.84,
        "turnout_pct": 70.33,
        "lib_pct": 38.58,
        "con_pct": 16.82,
        "ndp_pct": 2.3,
        "bq_pct": 39.43,
        "grn_pct": 0.0,
        "ppc_pct": 1.16
      }
    },
    {
      "riding_id": "24072",
      "name_en": "Sherbrooke",
      "name_fr": "Sherbrooke",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 25.55,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 51.8,
          "con": 11.92,
          "ndp": 6.79,
          "bq": 26.26,
          "grn": 3.3,
          "ppc": 1.26
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 24.32,
        "turnout_pct": 67.69,
        "lib_pct": 50.58,
        "con_pct": 12.92,
        "ndp_pct": 5.69,
        "bq_pct": 26.26,
        "grn_pct": 2.24,
        "ppc_pct": 0.93
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 24.32,
        "turnout_pct": 67.69,
        "lib_pct": 50.58,
        "con_pct": 12.92,
        "ndp_pct": 5.69,
        "bq_pct": 26.26,
        "grn_pct": 2.24,
        "ppc_pct": 0.93
      }
    },
    {
      "riding_id": "24073",
      "name_en": "Terrebonne",
      "name_fr": "Terrebonne",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.6721,
        "mean_margin": 2.41,
        "p_close_race": 0.9044,
        "vote_mean": {
          "lib": 39.43,
          "con": 16.87,
          "ndp": 3.65,
          "bq": 38.21,
          "grn": 2.09,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 0.6721,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.3279,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 0.0,
        "turnout_pct": 67.93,
        "lib_pct": 38.21,
        "con_pct": 17.93,
        "ndp_pct": 2.55,
        "bq_pct": 38.21,
        "grn_pct": 1.03,
        "ppc_pct": 0.7
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 0.0,
        "turnout_pct": 67.93,
        "lib_pct": 38.21,
        "con_pct": 17.93,
        "ndp_pct": 2.55,
        "bq_pct": 38.21,
        "grn_pct": 1.03,
        "ppc_pct": 0.7
      }
    },
    {
      "riding_id": "24074",
      "name_en": "Thérèse-De Blainville",
      "name_fr": "Thérèse-De Blainville",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.5,
        "p_close_race": 0.0002,
        "vote_mean": {
          "lib": 46.31,
          "con": 17.45,
          "ndp": 3.52,
          "bq": 31.81,
          "grn": 1.09,
          "ppc": 1.04
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 13.28,
        "turnout_pct": 72.67,
        "lib_pct": 45.09,
        "con_pct": 18.36,
        "ndp_pct": 2.42,
        "bq_pct": 31.81,
        "grn_pct": 0.0,
        "ppc_pct": 0.68
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 13.28,
        "turnout_pct": 72.67,
        "lib_pct": 45.09,
        "con_pct": 18.36,
        "ndp_pct": 2.42,
        "bq_pct": 31.81,
        "grn_pct": 0.0,
        "ppc_pct": 0.68
      }
    },
    {
      "riding_id": "24075",
      "name_en": "Trois-Rivières",
      "name_fr": "Trois-Rivières",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 13.75,
        "p_close_race": 0.0005,
        "vote_mean": {
          "lib": 41.54,
          "con": 24.9,
          "ndp": 3.4,
          "bq": 27.55,
          "grn": 1.97,
          "ppc": 0.9
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 13.19,
        "turnout_pct": 68.0,
        "lib_pct": 40.32,
        "con_pct": 26.79,
        "ndp_pct": 2.3,
        "bq_pct": 27.13,
        "grn_pct": 0.91,
        "ppc_pct": 0.51
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 13.19,
        "turnout_pct": 68.0,
        "lib_pct": 40.32,
        "con_pct": 26.79,
        "ndp_pct": 2.3,
        "bq_pct": 27.13,
        "grn_pct": 0.91,
        "ppc_pct": 0.51
      }
    },
    {
      "riding_id": "24076",
      "name_en": "Vaudreuil",
      "name_fr": "Vaudreuil",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 36.31,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 58.56,
          "con": 22.25,
          "ndp": 3.34,
          "bq": 14.79,
          "grn": 2.4,
          "ppc": 1.09
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 34.7,
        "turnout_pct": 74.86,
        "lib_pct": 57.34,
        "con_pct": 22.64,
        "ndp_pct": 2.24,
        "bq_pct": 14.79,
        "grn_pct": 1.34,
        "ppc_pct": 0.74
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 34.7,
        "turnout_pct": 74.86,
        "lib_pct": 57.34,
        "con_pct": 22.64,
        "ndp_pct": 2.24,
        "bq_pct": 14.79,
        "grn_pct": 1.34,
        "ppc_pct": 0.74
      }
    },
    {
      "riding_id": "24077",
      "name_en": "Ville-Marie--Le Sud-Ouest--Île-des-Soeurs",
      "name_fr": "Ville-Marie--Le Sud-Ouest--Île-des-Soeurs",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 46.03,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 64.22,
          "con": 18.19,
          "ndp": 7.08,
          "bq": 8.9,
          "grn": 3.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 44.43,
        "turnout_pct": 59.79,
        "lib_pct": 63.0,
        "con_pct": 18.58,
        "ndp_pct": 5.98,
        "bq_pct": 8.9,
        "grn_pct": 2.03,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 44.43,
        "turnout_pct": 59.79,
        "lib_pct": 63.0,
        "con_pct": 18.58,
        "ndp_pct": 5.98,
        "bq_pct": 8.9,
        "grn_pct": 2.03,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "24078",
      "name_en": "Vimy",
      "name_fr": "Vimy",
      "province": "QC",
      "region": "fed_qc",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 29.63,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.38,
          "con": 23.75,
          "ndp": 5.7,
          "bq": 16.78,
          "grn": 1.09,
          "ppc": 0.53
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 28.02,
        "turnout_pct": 60.24,
        "lib_pct": 52.16,
        "con_pct": 24.14,
        "ndp_pct": 4.6,
        "bq_pct": 16.76,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 28.02,
        "turnout_pct": 60.24,
        "lib_pct": 52.16,
        "con_pct": 24.14,
        "ndp_pct": 4.6,
        "bq_pct": 16.76,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35001",
      "name_en": "Ajax",
      "name_fr": "Ajax",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 27.62,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 58.15,
          "con": 30.54,
          "ndp": 6.05,
          "bq": 0.0,
          "grn": 2.23,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 17.11,
        "turnout_pct": 67.31,
        "lib_pct": 55.91,
        "con_pct": 38.8,
        "ndp_pct": 2.66,
        "bq_pct": 0.0,
        "grn_pct": 0.93,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 17.11,
        "turnout_pct": 67.31,
        "lib_pct": 55.91,
        "con_pct": 38.8,
        "ndp_pct": 2.66,
        "bq_pct": 0.0,
        "grn_pct": 0.93,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35002",
      "name_en": "Algonquin--Renfrew--Pembroke",
      "name_fr": "Algonquin--Renfrew--Pembroke",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 7.97,
        "p_close_race": 0.0741,
        "vote_mean": {
          "lib": 38.62,
          "con": 46.59,
          "ndp": 6.06,
          "bq": 0.0,
          "grn": 2.23,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 17.8,
        "turnout_pct": 72.36,
        "lib_pct": 37.6,
        "con_pct": 55.4,
        "ndp_pct": 3.66,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 17.8,
        "turnout_pct": 72.36,
        "lib_pct": 37.6,
        "con_pct": 55.4,
        "ndp_pct": 3.66,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35003",
      "name_en": "Aurora--Oak Ridges--Richmond Hill",
      "name_fr": "Aurora--Oak Ridges--Richmond Hill",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 0.7087,
        "mean_margin": 2.27,
        "p_close_race": 0.9251,
        "vote_mean": {
          "lib": 44.73,
          "con": 46.11,
          "ndp": 4.72,
          "bq": 0.0,
          "grn": 2.04,
          "ppc": 1.17
        },
        "win_prob": {
          "lib": 0.2913,
          "con": 0.7087,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 11.88,
        "turnout_pct": 69.52,
        "lib_pct": 42.49,
        "con_pct": 54.37,
        "ndp_pct": 1.33,
        "bq_pct": 0.0,
        "grn_pct": 0.74,
        "ppc_pct": 0.41
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 11.88,
        "turnout_pct": 69.52,
        "lib_pct": 42.49,
        "con_pct": 54.37,
        "ndp_pct": 1.33,
        "bq_pct": 0.0,
        "grn_pct": 0.74,
        "ppc_pct": 0.41
      }
    },
    {
      "riding_id": "35004",
      "name_en": "Barrie South--Innisfil",
      "name_fr": "Barrie-Sud--Innisfil",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 9.92,
        "p_close_race": 0.0056,
        "vote_mean": {
          "lib": 38.74,
          "con": 48.66,
          "ndp": 5.54,
          "bq": 0.0,
          "grn": 1.32,
          "ppc": 1.76
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 19.75,
        "turnout_pct": 67.94,
        "lib_pct": 37.72,
        "con_pct": 57.47,
        "ndp_pct": 3.14,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.03
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 19.75,
        "turnout_pct": 67.94,
        "lib_pct": 37.72,
        "con_pct": 57.47,
        "ndp_pct": 3.14,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.03
      }
    },
    {
      "riding_id": "35005",
      "name_en": "Barrie--Springwater--Oro-Medonte",
      "name_fr": "Barrie--Springwater--Oro-Medonte",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8956,
        "mean_margin": 2.78,
        "p_close_race": 0.8811,
        "vote_mean": {
          "lib": 45.1,
          "con": 42.53,
          "ndp": 4.76,
          "bq": 0.0,
          "grn": 2.66,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.8956,
          "con": 0.1044,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.26,
        "turnout_pct": 70.66,
        "lib_pct": 44.08,
        "con_pct": 51.34,
        "ndp_pct": 2.36,
        "bq_pct": 0.0,
        "grn_pct": 1.35,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.26,
        "turnout_pct": 70.66,
        "lib_pct": 44.08,
        "con_pct": 51.34,
        "ndp_pct": 2.36,
        "bq_pct": 0.0,
        "grn_pct": 1.35,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35006",
      "name_en": "Bay of Quinte",
      "name_fr": "Bay of Quinte",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 15.37,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 51.95,
          "con": 36.58,
          "ndp": 6.61,
          "bq": 0.0,
          "grn": 2.57,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 5.67,
        "turnout_pct": 69.69,
        "lib_pct": 50.12,
        "con_pct": 44.45,
        "ndp_pct": 3.62,
        "bq_pct": 0.0,
        "grn_pct": 1.27,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 5.67,
        "turnout_pct": 69.69,
        "lib_pct": 50.12,
        "con_pct": 44.45,
        "ndp_pct": 3.62,
        "bq_pct": 0.0,
        "grn_pct": 1.27,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35007",
      "name_en": "Beaches--East York",
      "name_fr": "Beaches--East York",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 55.39,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 70.38,
          "con": 14.98,
          "ndp": 10.91,
          "bq": 0.0,
          "grn": 2.56,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 43.97,
        "turnout_pct": 71.94,
        "lib_pct": 67.39,
        "con_pct": 23.41,
        "ndp_pct": 6.82,
        "bq_pct": 0.0,
        "grn_pct": 1.27,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 43.97,
        "turnout_pct": 71.94,
        "lib_pct": 67.39,
        "con_pct": 23.41,
        "ndp_pct": 6.82,
        "bq_pct": 0.0,
        "grn_pct": 1.27,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35008",
      "name_en": "Bowmanville--Oshawa North",
      "name_fr": "Bowmanville--Oshawa-Nord",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9943,
        "mean_margin": 6.28,
        "p_close_race": 0.3029,
        "vote_mean": {
          "lib": 47.43,
          "con": 41.16,
          "ndp": 6.24,
          "bq": 0.0,
          "grn": 2.07,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.9943,
          "con": 0.0057,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 4.23,
        "turnout_pct": 69.67,
        "lib_pct": 45.19,
        "con_pct": 49.42,
        "ndp_pct": 2.85,
        "bq_pct": 0.0,
        "grn_pct": 0.77,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 4.23,
        "turnout_pct": 69.67,
        "lib_pct": 45.19,
        "con_pct": 49.42,
        "ndp_pct": 2.85,
        "bq_pct": 0.0,
        "grn_pct": 0.77,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35009",
      "name_en": "Brampton Centre",
      "name_fr": "Brampton-Centre",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 11.98,
        "p_close_race": 0.0023,
        "vote_mean": {
          "lib": 50.21,
          "con": 38.23,
          "ndp": 6.04,
          "bq": 0.0,
          "grn": 2.44,
          "ppc": 1.44
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 1.49,
        "turnout_pct": 61.33,
        "lib_pct": 47.97,
        "con_pct": 46.49,
        "ndp_pct": 2.64,
        "bq_pct": 0.0,
        "grn_pct": 1.14,
        "ppc_pct": 0.7
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 1.49,
        "turnout_pct": 61.33,
        "lib_pct": 47.97,
        "con_pct": 46.49,
        "ndp_pct": 2.64,
        "bq_pct": 0.0,
        "grn_pct": 1.14,
        "ppc_pct": 0.7
      }
    },
    {
      "riding_id": "35010",
      "name_en": "Brampton--Chinguacousy Park",
      "name_fr": "Brampton--Chinguacousy Park",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.86,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 50.57,
          "con": 35.71,
          "ndp": 6.03,
          "bq": 0.0,
          "grn": 2.47,
          "ppc": 2.38
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 4.36,
        "turnout_pct": 63.04,
        "lib_pct": 48.33,
        "con_pct": 43.97,
        "ndp_pct": 2.63,
        "bq_pct": 0.0,
        "grn_pct": 1.17,
        "ppc_pct": 1.66
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 4.36,
        "turnout_pct": 63.04,
        "lib_pct": 48.33,
        "con_pct": 43.97,
        "ndp_pct": 2.63,
        "bq_pct": 0.0,
        "grn_pct": 1.17,
        "ppc_pct": 1.66
      }
    },
    {
      "riding_id": "35011",
      "name_en": "Brampton East",
      "name_fr": "Brampton-Est",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.33,
        "p_close_race": 0.0001,
        "vote_mean": {
          "lib": 50.24,
          "con": 35.91,
          "ndp": 5.07,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 5.4
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 3.83,
        "turnout_pct": 65.38,
        "lib_pct": 48.0,
        "con_pct": 44.17,
        "ndp_pct": 1.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 4.68
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 3.83,
        "turnout_pct": 65.38,
        "lib_pct": 48.0,
        "con_pct": 44.17,
        "ndp_pct": 1.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 4.68
      }
    },
    {
      "riding_id": "35012",
      "name_en": "Brampton North--Caledon",
      "name_fr": "Brampton-Nord--Caledon",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.08,
        "p_close_race": 0.0018,
        "vote_mean": {
          "lib": 50.81,
          "con": 38.73,
          "ndp": 5.54,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 2.07
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 1.58,
        "turnout_pct": 67.19,
        "lib_pct": 48.57,
        "con_pct": 46.99,
        "ndp_pct": 2.14,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.35
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 1.58,
        "turnout_pct": 67.19,
        "lib_pct": 48.57,
        "con_pct": 46.99,
        "ndp_pct": 2.14,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.35
      }
    },
    {
      "riding_id": "35013",
      "name_en": "Brampton South",
      "name_fr": "Brampton-Sud",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.3,
        "p_close_race": 0.0013,
        "vote_mean": {
          "lib": 51.11,
          "con": 38.81,
          "ndp": 5.13,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.54
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 1.79,
        "turnout_pct": 65.21,
        "lib_pct": 48.87,
        "con_pct": 47.07,
        "ndp_pct": 1.73,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.8
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 1.79,
        "turnout_pct": 65.21,
        "lib_pct": 48.87,
        "con_pct": 47.07,
        "ndp_pct": 1.73,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.8
      }
    },
    {
      "riding_id": "35014",
      "name_en": "Brampton West",
      "name_fr": "Brampton-Ouest",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9996,
        "mean_margin": 8.36,
        "p_close_race": 0.0861,
        "vote_mean": {
          "lib": 49.38,
          "con": 41.03,
          "ndp": 5.05,
          "bq": 0.0,
          "grn": 1.95,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.9996,
          "con": 0.0004,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 2.14,
        "turnout_pct": 64.21,
        "lib_pct": 47.14,
        "con_pct": 49.29,
        "ndp_pct": 1.65,
        "bq_pct": 0.0,
        "grn_pct": 0.65,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 2.14,
        "turnout_pct": 64.21,
        "lib_pct": 47.14,
        "con_pct": 49.29,
        "ndp_pct": 1.65,
        "bq_pct": 0.0,
        "grn_pct": 0.65,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35015",
      "name_en": "Brantford--Brant South--Six Nations",
      "name_fr": "Brantford--Brant-Sud--Six Nations",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.7588,
        "mean_margin": 2.32,
        "p_close_race": 0.9199,
        "vote_mean": {
          "lib": 42.91,
          "con": 44.57,
          "ndp": 6.65,
          "bq": 0.0,
          "grn": 2.99,
          "ppc": 1.35
        },
        "win_prob": {
          "lib": 0.2412,
          "con": 0.7588,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 11.29,
        "turnout_pct": 64.18,
        "lib_pct": 41.09,
        "con_pct": 52.44,
        "ndp_pct": 3.66,
        "bq_pct": 0.0,
        "grn_pct": 1.69,
        "ppc_pct": 0.6
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 11.29,
        "turnout_pct": 64.18,
        "lib_pct": 41.09,
        "con_pct": 52.44,
        "ndp_pct": 3.66,
        "bq_pct": 0.0,
        "grn_pct": 1.69,
        "ppc_pct": 0.6
      }
    },
    {
      "riding_id": "35016",
      "name_en": "Bruce--Grey--Owen Sound",
      "name_fr": "Bruce--Grey--Owen Sound",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.933,
        "mean_margin": 3.14,
        "p_close_race": 0.8316,
        "vote_mean": {
          "lib": 40.92,
          "con": 43.96,
          "ndp": 5.47,
          "bq": 0.0,
          "grn": 3.46,
          "ppc": 1.5
        },
        "win_prob": {
          "lib": 0.067,
          "con": 0.933,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 12.86,
        "turnout_pct": 69.84,
        "lib_pct": 39.9,
        "con_pct": 52.76,
        "ndp_pct": 3.08,
        "bq_pct": 0.0,
        "grn_pct": 2.15,
        "ppc_pct": 0.77
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 12.86,
        "turnout_pct": 69.84,
        "lib_pct": 39.9,
        "con_pct": 52.76,
        "ndp_pct": 3.08,
        "bq_pct": 0.0,
        "grn_pct": 2.15,
        "ppc_pct": 0.77
      }
    },
    {
      "riding_id": "35017",
      "name_en": "Burlington",
      "name_fr": "Burlington",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 25.65,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 57.71,
          "con": 32.06,
          "ndp": 5.37,
          "bq": 0.0,
          "grn": 2.06,
          "ppc": 1.42
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 15.15,
        "turnout_pct": 76.53,
        "lib_pct": 55.47,
        "con_pct": 40.32,
        "ndp_pct": 1.97,
        "bq_pct": 0.0,
        "grn_pct": 0.76,
        "ppc_pct": 0.67
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 15.15,
        "turnout_pct": 76.53,
        "lib_pct": 55.47,
        "con_pct": 40.32,
        "ndp_pct": 1.97,
        "bq_pct": 0.0,
        "grn_pct": 0.76,
        "ppc_pct": 0.67
      }
    },
    {
      "riding_id": "35018",
      "name_en": "Burlington North--Milton West",
      "name_fr": "Burlington-Nord--Milton-Ouest",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 18.95,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.71,
          "con": 35.76,
          "ndp": 5.53,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.6
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 8.45,
        "turnout_pct": 73.89,
        "lib_pct": 52.47,
        "con_pct": 44.02,
        "ndp_pct": 2.13,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.86
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 8.45,
        "turnout_pct": 73.89,
        "lib_pct": 52.47,
        "con_pct": 44.02,
        "ndp_pct": 2.13,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.86
      }
    },
    {
      "riding_id": "35019",
      "name_en": "Cambridge",
      "name_fr": "Cambridge",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9996,
        "mean_margin": 8.3,
        "p_close_race": 0.0903,
        "vote_mean": {
          "lib": 48.26,
          "con": 39.97,
          "ndp": 6.71,
          "bq": 0.0,
          "grn": 2.9,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.9996,
          "con": 0.0004,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 2.21,
        "turnout_pct": 69.85,
        "lib_pct": 46.02,
        "con_pct": 48.23,
        "ndp_pct": 3.31,
        "bq_pct": 0.0,
        "grn_pct": 1.6,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 2.21,
        "turnout_pct": 69.85,
        "lib_pct": 46.02,
        "con_pct": 48.23,
        "ndp_pct": 3.31,
        "bq_pct": 0.0,
        "grn_pct": 1.6,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35020",
      "name_en": "Carleton",
      "name_fr": "Carleton",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 15.04,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 51.63,
          "con": 36.59,
          "ndp": 3.81,
          "bq": 0.0,
          "grn": 1.97,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 5.21,
        "turnout_pct": 81.36,
        "lib_pct": 50.6,
        "con_pct": 45.39,
        "ndp_pct": 1.41,
        "bq_pct": 0.0,
        "grn_pct": 0.65,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 5.21,
        "turnout_pct": 81.36,
        "lib_pct": 50.6,
        "con_pct": 45.39,
        "ndp_pct": 1.41,
        "bq_pct": 0.0,
        "grn_pct": 0.65,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35021",
      "name_en": "Chatham-Kent--Leamington",
      "name_fr": "Chatham-Kent--Leamington",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 11.78,
        "p_close_race": 0.0011,
        "vote_mean": {
          "lib": 37.51,
          "con": 49.29,
          "ndp": 7.03,
          "bq": 0.0,
          "grn": 2.34,
          "ppc": 2.18
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 21.48,
        "turnout_pct": 67.93,
        "lib_pct": 35.69,
        "con_pct": 57.16,
        "ndp_pct": 4.04,
        "bq_pct": 0.0,
        "grn_pct": 1.04,
        "ppc_pct": 1.46
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 21.48,
        "turnout_pct": 67.93,
        "lib_pct": 35.69,
        "con_pct": 57.16,
        "ndp_pct": 4.04,
        "bq_pct": 0.0,
        "grn_pct": 1.04,
        "ppc_pct": 1.46
      }
    },
    {
      "riding_id": "35022",
      "name_en": "Davenport",
      "name_fr": "Davenport",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 39.26,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 60.3,
          "con": 14.57,
          "ndp": 21.03,
          "bq": 0.0,
          "grn": 2.56,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 34.32,
        "turnout_pct": 65.75,
        "lib_pct": 57.31,
        "con_pct": 23.0,
        "ndp_pct": 16.94,
        "bq_pct": 0.0,
        "grn_pct": 1.27,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 34.32,
        "turnout_pct": 65.75,
        "lib_pct": 57.31,
        "con_pct": 23.0,
        "ndp_pct": 16.94,
        "bq_pct": 0.0,
        "grn_pct": 1.27,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35023",
      "name_en": "Don Valley North",
      "name_fr": "Don Valley-Nord",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.2,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.74,
          "con": 33.54,
          "ndp": 6.52,
          "bq": 0.0,
          "grn": 2.21,
          "ppc": 1.28
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 10.78,
        "turnout_pct": 63.07,
        "lib_pct": 52.75,
        "con_pct": 41.97,
        "ndp_pct": 2.43,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.53
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 10.78,
        "turnout_pct": 63.07,
        "lib_pct": 52.75,
        "con_pct": 41.97,
        "ndp_pct": 2.43,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.53
      }
    },
    {
      "riding_id": "35024",
      "name_en": "Don Valley West",
      "name_fr": "Don Valley-Ouest",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 40.82,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 65.59,
          "con": 24.77,
          "ndp": 6.49,
          "bq": 0.0,
          "grn": 2.39,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 29.19,
        "turnout_pct": 68.06,
        "lib_pct": 62.6,
        "con_pct": 33.2,
        "ndp_pct": 2.4,
        "bq_pct": 0.0,
        "grn_pct": 1.1,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 29.19,
        "turnout_pct": 68.06,
        "lib_pct": 62.6,
        "con_pct": 33.2,
        "ndp_pct": 2.4,
        "bq_pct": 0.0,
        "grn_pct": 1.1,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35025",
      "name_en": "Dufferin--Caledon",
      "name_fr": "Dufferin--Caledon",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 15.04,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 36.02,
          "con": 51.06,
          "ndp": 4.35,
          "bq": 0.0,
          "grn": 2.62,
          "ppc": 1.79
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 24.88,
        "turnout_pct": 71.06,
        "lib_pct": 35.0,
        "con_pct": 59.87,
        "ndp_pct": 1.95,
        "bq_pct": 0.0,
        "grn_pct": 1.31,
        "ppc_pct": 1.06
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 24.88,
        "turnout_pct": 71.06,
        "lib_pct": 35.0,
        "con_pct": 59.87,
        "ndp_pct": 1.95,
        "bq_pct": 0.0,
        "grn_pct": 1.31,
        "ppc_pct": 1.06
      }
    },
    {
      "riding_id": "35026",
      "name_en": "Eglinton--Lawrence",
      "name_fr": "Eglinton--Lawrence",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 11.28,
        "p_close_race": 0.0008,
        "vote_mean": {
          "lib": 49.98,
          "con": 38.7,
          "ndp": 4.03,
          "bq": 0.0,
          "grn": 2.01,
          "ppc": 1.28
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 1.45,
        "turnout_pct": 70.4,
        "lib_pct": 48.95,
        "con_pct": 47.5,
        "ndp_pct": 1.63,
        "bq_pct": 0.0,
        "grn_pct": 0.7,
        "ppc_pct": 0.53
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 1.45,
        "turnout_pct": 70.4,
        "lib_pct": 48.95,
        "con_pct": 47.5,
        "ndp_pct": 1.63,
        "bq_pct": 0.0,
        "grn_pct": 0.7,
        "ppc_pct": 0.53
      }
    },
    {
      "riding_id": "35027",
      "name_en": "Elgin--St. Thomas--London South",
      "name_fr": "Elgin--St. Thomas--London-Sud",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8752,
        "mean_margin": 3.01,
        "p_close_race": 0.8331,
        "vote_mean": {
          "lib": 44.67,
          "con": 41.95,
          "ndp": 7.76,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 2.64
        },
        "win_prob": {
          "lib": 0.8752,
          "con": 0.1248,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.97,
        "turnout_pct": 68.78,
        "lib_pct": 42.85,
        "con_pct": 49.82,
        "ndp_pct": 4.77,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.92
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.97,
        "turnout_pct": 68.78,
        "lib_pct": 42.85,
        "con_pct": 49.82,
        "ndp_pct": 4.77,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.92
      }
    },
    {
      "riding_id": "35028",
      "name_en": "Essex",
      "name_fr": "Essex",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 11.05,
        "p_close_race": 0.0034,
        "vote_mean": {
          "lib": 38.25,
          "con": 49.3,
          "ndp": 7.73,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.76
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 20.74,
        "turnout_pct": 73.01,
        "lib_pct": 36.43,
        "con_pct": 57.17,
        "ndp_pct": 4.74,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.04
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 20.74,
        "turnout_pct": 73.01,
        "lib_pct": 36.43,
        "con_pct": 57.17,
        "ndp_pct": 4.74,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.04
      }
    },
    {
      "riding_id": "35029",
      "name_en": "Etobicoke Centre",
      "name_fr": "Etobicoke-Centre",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 20.93,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.15,
          "con": 35.22,
          "ndp": 6.46,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 9.51,
        "turnout_pct": 68.9,
        "lib_pct": 53.16,
        "con_pct": 43.65,
        "ndp_pct": 2.37,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 9.51,
        "turnout_pct": 68.9,
        "lib_pct": 53.16,
        "con_pct": 43.65,
        "ndp_pct": 2.37,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35030",
      "name_en": "Etobicoke--Lakeshore",
      "name_fr": "Etobicoke--Lakeshore",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 29.93,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 60.08,
          "con": 30.15,
          "ndp": 6.62,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 1.67
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 18.51,
        "turnout_pct": 69.94,
        "lib_pct": 57.09,
        "con_pct": 38.58,
        "ndp_pct": 2.53,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.94
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 18.51,
        "turnout_pct": 69.94,
        "lib_pct": 57.09,
        "con_pct": 38.58,
        "ndp_pct": 2.53,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.94
      }
    },
    {
      "riding_id": "35031",
      "name_en": "Etobicoke North",
      "name_fr": "Etobicoke-Nord",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.93,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.19,
          "con": 32.26,
          "ndp": 7.26,
          "bq": 0.0,
          "grn": 2.21,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 11.51,
        "turnout_pct": 55.96,
        "lib_pct": 52.2,
        "con_pct": 40.69,
        "ndp_pct": 3.17,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 11.51,
        "turnout_pct": 55.96,
        "lib_pct": 52.2,
        "con_pct": 40.69,
        "ndp_pct": 3.17,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35032",
      "name_en": "Flamborough--Glanbrook--Brant North",
      "name_fr": "Flamborough--Glanbrook--Brant-Nord",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.5476,
        "mean_margin": 1.88,
        "p_close_race": 0.9683,
        "vote_mean": {
          "lib": 44.76,
          "con": 44.48,
          "ndp": 5.41,
          "bq": 0.0,
          "grn": 2.18,
          "ppc": 1.48
        },
        "win_prob": {
          "lib": 0.5476,
          "con": 0.4524,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 9.4,
        "turnout_pct": 76.62,
        "lib_pct": 42.94,
        "con_pct": 52.35,
        "ndp_pct": 2.42,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 0.74
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 9.4,
        "turnout_pct": 76.62,
        "lib_pct": 42.94,
        "con_pct": 52.35,
        "ndp_pct": 2.42,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 0.74
      }
    },
    {
      "riding_id": "35033",
      "name_en": "Guelph",
      "name_fr": "Guelph",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 34.5,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.94,
          "con": 22.44,
          "ndp": 6.6,
          "bq": 0.0,
          "grn": 11.5,
          "ppc": 1.44
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 24.0,
        "turnout_pct": 72.77,
        "lib_pct": 54.7,
        "con_pct": 30.7,
        "ndp_pct": 3.2,
        "bq_pct": 0.0,
        "grn_pct": 10.2,
        "ppc_pct": 0.7
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 24.0,
        "turnout_pct": 72.77,
        "lib_pct": 54.7,
        "con_pct": 30.7,
        "ndp_pct": 3.2,
        "bq_pct": 0.0,
        "grn_pct": 10.2,
        "ppc_pct": 0.7
      }
    },
    {
      "riding_id": "35034",
      "name_en": "Haldimand--Norfolk",
      "name_fr": "Haldimand--Norfolk",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 11.27,
        "p_close_race": 0.0003,
        "vote_mean": {
          "lib": 37.2,
          "con": 48.47,
          "ndp": 5.74,
          "bq": 0.0,
          "grn": 2.35,
          "ppc": 1.64
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 21.09,
        "turnout_pct": 72.14,
        "lib_pct": 36.18,
        "con_pct": 57.27,
        "ndp_pct": 3.35,
        "bq_pct": 0.0,
        "grn_pct": 1.04,
        "ppc_pct": 0.91
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 21.09,
        "turnout_pct": 72.14,
        "lib_pct": 36.18,
        "con_pct": 57.27,
        "ndp_pct": 3.35,
        "bq_pct": 0.0,
        "grn_pct": 1.04,
        "ppc_pct": 0.91
      }
    },
    {
      "riding_id": "35035",
      "name_en": "Haliburton--Kawartha Lakes",
      "name_fr": "Haliburton--Kawartha Lakes",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 7.92,
        "p_close_race": 0.078,
        "vote_mean": {
          "lib": 39.49,
          "con": 47.41,
          "ndp": 5.86,
          "bq": 0.0,
          "grn": 1.32,
          "ppc": 1.98
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 17.74,
        "turnout_pct": 72.71,
        "lib_pct": 38.47,
        "con_pct": 56.22,
        "ndp_pct": 3.46,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.26
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 17.74,
        "turnout_pct": 72.71,
        "lib_pct": 38.47,
        "con_pct": 56.22,
        "ndp_pct": 3.46,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.26
      }
    },
    {
      "riding_id": "35036",
      "name_en": "Hamilton Centre",
      "name_fr": "Hamilton-Centre",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9991,
        "mean_margin": 6.84,
        "p_close_race": 0.1989,
        "vote_mean": {
          "lib": 39.48,
          "con": 21.48,
          "ndp": 32.65,
          "bq": 0.0,
          "grn": 2.72,
          "ppc": 1.76
        },
        "win_prob": {
          "lib": 0.9991,
          "con": 0.0,
          "ndp": 0.0009,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 7.5,
        "turnout_pct": 62.3,
        "lib_pct": 37.24,
        "con_pct": 29.74,
        "ndp_pct": 29.25,
        "bq_pct": 0.0,
        "grn_pct": 1.42,
        "ppc_pct": 1.03
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 7.5,
        "turnout_pct": 62.3,
        "lib_pct": 37.24,
        "con_pct": 29.74,
        "ndp_pct": 29.25,
        "bq_pct": 0.0,
        "grn_pct": 1.42,
        "ppc_pct": 1.03
      }
    },
    {
      "riding_id": "35037",
      "name_en": "Hamilton East--Stoney Creek",
      "name_fr": "Hamilton-Est--Stoney Creek",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9996,
        "mean_margin": 8.34,
        "p_close_race": 0.0875,
        "vote_mean": {
          "lib": 48.36,
          "con": 40.03,
          "ndp": 7.03,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.9996,
          "con": 0.0004,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 2.17,
        "turnout_pct": 68.96,
        "lib_pct": 46.12,
        "con_pct": 48.29,
        "ndp_pct": 3.63,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.12
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 2.17,
        "turnout_pct": 68.96,
        "lib_pct": 46.12,
        "con_pct": 48.29,
        "ndp_pct": 3.63,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.12
      }
    },
    {
      "riding_id": "35038",
      "name_en": "Hamilton Mountain",
      "name_fr": "Hamilton Mountain",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.55,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 47.43,
          "con": 32.88,
          "ndp": 15.06,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.56
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 4.05,
        "turnout_pct": 67.73,
        "lib_pct": 45.19,
        "con_pct": 41.14,
        "ndp_pct": 11.66,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.82
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 4.05,
        "turnout_pct": 67.73,
        "lib_pct": 45.19,
        "con_pct": 41.14,
        "ndp_pct": 11.66,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.82
      }
    },
    {
      "riding_id": "35039",
      "name_en": "Hamilton West--Ancaster--Dundas",
      "name_fr": "Hamilton-Ouest--Ancaster--Dundas",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 29.72,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 58.05,
          "con": 28.33,
          "ndp": 8.62,
          "bq": 0.0,
          "grn": 2.49,
          "ppc": 1.2
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.23,
        "turnout_pct": 73.85,
        "lib_pct": 55.81,
        "con_pct": 36.59,
        "ndp_pct": 5.22,
        "bq_pct": 0.0,
        "grn_pct": 1.19,
        "ppc_pct": 0.44
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.23,
        "turnout_pct": 73.85,
        "lib_pct": 55.81,
        "con_pct": 36.59,
        "ndp_pct": 5.22,
        "bq_pct": 0.0,
        "grn_pct": 1.19,
        "ppc_pct": 0.44
      }
    },
    {
      "riding_id": "35040",
      "name_en": "Hastings--Lennox and Addington--Tyendinaga",
      "name_fr": "Hastings--Lennox and Addington--Tyendinaga",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.9793,
        "mean_margin": 4.09,
        "p_close_race": 0.6772,
        "vote_mean": {
          "lib": 41.15,
          "con": 45.22,
          "ndp": 5.93,
          "bq": 0.0,
          "grn": 2.51,
          "ppc": 1.32
        },
        "win_prob": {
          "lib": 0.0207,
          "con": 0.9793,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 13.89,
        "turnout_pct": 71.11,
        "lib_pct": 40.13,
        "con_pct": 54.03,
        "ndp_pct": 3.53,
        "bq_pct": 0.0,
        "grn_pct": 1.2,
        "ppc_pct": 0.57
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 13.89,
        "turnout_pct": 71.11,
        "lib_pct": 40.13,
        "con_pct": 54.03,
        "ndp_pct": 3.53,
        "bq_pct": 0.0,
        "grn_pct": 1.2,
        "ppc_pct": 0.57
      }
    },
    {
      "riding_id": "35041",
      "name_en": "Humber River--Black Creek",
      "name_fr": "Humber River--Black Creek",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 30.99,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 57.89,
          "con": 26.9,
          "ndp": 10.38,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 2.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.57,
        "turnout_pct": 55.14,
        "lib_pct": 54.9,
        "con_pct": 35.33,
        "ndp_pct": 6.29,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.6
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.57,
        "turnout_pct": 55.14,
        "lib_pct": 54.9,
        "con_pct": 35.33,
        "ndp_pct": 6.29,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.6
      }
    },
    {
      "riding_id": "35042",
      "name_en": "Huron--Bruce",
      "name_fr": "Huron--Bruce",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.8005,
        "mean_margin": 2.17,
        "p_close_race": 0.9454,
        "vote_mean": {
          "lib": 42.35,
          "con": 44.09,
          "ndp": 5.68,
          "bq": 0.0,
          "grn": 2.63,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.1995,
          "con": 0.8005,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 11.56,
        "turnout_pct": 75.75,
        "lib_pct": 41.33,
        "con_pct": 52.89,
        "ndp_pct": 3.29,
        "bq_pct": 0.0,
        "grn_pct": 1.32,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 11.56,
        "turnout_pct": 75.75,
        "lib_pct": 41.33,
        "con_pct": 52.89,
        "ndp_pct": 3.29,
        "bq_pct": 0.0,
        "grn_pct": 1.32,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35043",
      "name_en": "Kanata",
      "name_fr": "Kanata",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 36.36,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 63.37,
          "con": 27.02,
          "ndp": 6.36,
          "bq": 0.0,
          "grn": 2.4,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 24.94,
        "turnout_pct": 78.33,
        "lib_pct": 60.39,
        "con_pct": 35.45,
        "ndp_pct": 2.27,
        "bq_pct": 0.0,
        "grn_pct": 1.11,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 24.94,
        "turnout_pct": 78.33,
        "lib_pct": 60.39,
        "con_pct": 35.45,
        "ndp_pct": 2.27,
        "bq_pct": 0.0,
        "grn_pct": 1.11,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35044",
      "name_en": "Kapuskasing--Timmins--Mushkegowuk",
      "name_fr": "Kapuskasing--Timmins--Mushkegowuk",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.5077,
        "mean_margin": 1.63,
        "p_close_race": 0.9876,
        "vote_mean": {
          "lib": 39.65,
          "con": 39.7,
          "ndp": 12.7,
          "bq": 0.0,
          "grn": 1.32,
          "ppc": 2.43
        },
        "win_prob": {
          "lib": 0.4923,
          "con": 0.5077,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 9.88,
        "turnout_pct": 62.56,
        "lib_pct": 38.63,
        "con_pct": 48.51,
        "ndp_pct": 10.3,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.71
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 9.88,
        "turnout_pct": 62.56,
        "lib_pct": 38.63,
        "con_pct": 48.51,
        "ndp_pct": 10.3,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.71
      }
    },
    {
      "riding_id": "35045",
      "name_en": "Kenora--Kiiwetinoong",
      "name_fr": "Kenora--Kiiwetinoong",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.9652,
        "mean_margin": 3.71,
        "p_close_race": 0.7427,
        "vote_mean": {
          "lib": 35.95,
          "con": 39.62,
          "ndp": 16.06,
          "bq": 0.0,
          "grn": 2.37,
          "ppc": 1.49
        },
        "win_prob": {
          "lib": 0.0348,
          "con": 0.9652,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 13.5,
        "turnout_pct": 59.59,
        "lib_pct": 34.93,
        "con_pct": 48.43,
        "ndp_pct": 13.66,
        "bq_pct": 0.0,
        "grn_pct": 1.06,
        "ppc_pct": 0.75
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 13.5,
        "turnout_pct": 59.59,
        "lib_pct": 34.93,
        "con_pct": 48.43,
        "ndp_pct": 13.66,
        "bq_pct": 0.0,
        "grn_pct": 1.06,
        "ppc_pct": 0.75
      }
    },
    {
      "riding_id": "35046",
      "name_en": "Kingston and the Islands",
      "name_fr": "Kingston et les Îles",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 42.11,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 64.71,
          "con": 22.6,
          "ndp": 7.7,
          "bq": 0.0,
          "grn": 2.68,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 32.41,
        "turnout_pct": 71.68,
        "lib_pct": 62.88,
        "con_pct": 30.47,
        "ndp_pct": 4.71,
        "bq_pct": 0.0,
        "grn_pct": 1.38,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 32.41,
        "turnout_pct": 71.68,
        "lib_pct": 62.88,
        "con_pct": 30.47,
        "ndp_pct": 4.71,
        "bq_pct": 0.0,
        "grn_pct": 1.38,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35047",
      "name_en": "King--Vaughan",
      "name_fr": "King--Vaughan",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 14.85,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 37.88,
          "con": 52.74,
          "ndp": 4.52,
          "bq": 0.0,
          "grn": 2.14,
          "ppc": 1.29
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 25.36,
        "turnout_pct": 71.16,
        "lib_pct": 35.64,
        "con_pct": 61.0,
        "ndp_pct": 1.13,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.54
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 25.36,
        "turnout_pct": 71.16,
        "lib_pct": 35.64,
        "con_pct": 61.0,
        "ndp_pct": 1.13,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.54
      }
    },
    {
      "riding_id": "35048",
      "name_en": "Kitchener Centre",
      "name_fr": "Kitchener-Centre",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "grn",
        "p_winner": 0.962,
        "mean_margin": 3.42,
        "p_close_race": 0.8069,
        "vote_mean": {
          "lib": 31.31,
          "con": 25.76,
          "ndp": 5.35,
          "bq": 0.0,
          "grn": 34.69,
          "ppc": 1.31
        },
        "win_prob": {
          "lib": 0.038,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.962,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 0.63,
        "turnout_pct": 68.81,
        "lib_pct": 29.07,
        "con_pct": 34.02,
        "ndp_pct": 1.95,
        "bq_pct": 0.0,
        "grn_pct": 33.39,
        "ppc_pct": 0.56
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 0.63,
        "turnout_pct": 68.81,
        "lib_pct": 29.07,
        "con_pct": 34.02,
        "ndp_pct": 1.95,
        "bq_pct": 0.0,
        "grn_pct": 33.39,
        "ppc_pct": 0.56
      }
    },
    {
      "riding_id": "35049",
      "name_en": "Kitchener--Conestoga",
      "name_fr": "Kitchener--Conestoga",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 11.34,
        "p_close_race": 0.0047,
        "vote_mean": {
          "lib": 50.34,
          "con": 39.0,
          "ndp": 6.32,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.99
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 0.84,
        "turnout_pct": 73.84,
        "lib_pct": 48.1,
        "con_pct": 47.26,
        "ndp_pct": 2.92,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.26
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 0.84,
        "turnout_pct": 73.84,
        "lib_pct": 48.1,
        "con_pct": 47.26,
        "ndp_pct": 2.92,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.26
      }
    },
    {
      "riding_id": "35050",
      "name_en": "Kitchener South--Hespeler",
      "name_fr": "Kitchener-Sud--Hespeler",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9998,
        "mean_margin": 8.81,
        "p_close_race": 0.0602,
        "vote_mean": {
          "lib": 48.21,
          "con": 39.4,
          "ndp": 6.4,
          "bq": 0.0,
          "grn": 3.29,
          "ppc": 1.38
        },
        "win_prob": {
          "lib": 0.9998,
          "con": 0.0002,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 1.69,
        "turnout_pct": 70.05,
        "lib_pct": 45.97,
        "con_pct": 47.66,
        "ndp_pct": 3.0,
        "bq_pct": 0.0,
        "grn_pct": 1.99,
        "ppc_pct": 0.63
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 1.69,
        "turnout_pct": 70.05,
        "lib_pct": 45.97,
        "con_pct": 47.66,
        "ndp_pct": 3.0,
        "bq_pct": 0.0,
        "grn_pct": 1.99,
        "ppc_pct": 0.63
      }
    },
    {
      "riding_id": "35051",
      "name_en": "Lanark--Frontenac",
      "name_fr": "Lanark--Frontenac",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9928,
        "mean_margin": 5.03,
        "p_close_race": 0.4929,
        "vote_mean": {
          "lib": 46.29,
          "con": 41.27,
          "ndp": 5.31,
          "bq": 0.0,
          "grn": 2.4,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.9928,
          "con": 0.0072,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 4.81,
        "turnout_pct": 75.87,
        "lib_pct": 45.26,
        "con_pct": 50.07,
        "ndp_pct": 2.91,
        "bq_pct": 0.0,
        "grn_pct": 1.09,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 4.81,
        "turnout_pct": 75.87,
        "lib_pct": 45.26,
        "con_pct": 50.07,
        "ndp_pct": 2.91,
        "bq_pct": 0.0,
        "grn_pct": 1.09,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35052",
      "name_en": "Leeds--Grenville--Thousand Islands--Rideau Lakes",
      "name_fr": "Leeds--Grenville--Thousand Islands--Rideau Lakes",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9797,
        "mean_margin": 4.23,
        "p_close_race": 0.6494,
        "vote_mean": {
          "lib": 45.18,
          "con": 40.98,
          "ndp": 5.89,
          "bq": 0.0,
          "grn": 2.47,
          "ppc": 1.62
        },
        "win_prob": {
          "lib": 0.9797,
          "con": 0.0203,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 5.63,
        "turnout_pct": 73.78,
        "lib_pct": 44.15,
        "con_pct": 49.78,
        "ndp_pct": 3.49,
        "bq_pct": 0.0,
        "grn_pct": 1.16,
        "ppc_pct": 0.89
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 5.63,
        "turnout_pct": 73.78,
        "lib_pct": 44.15,
        "con_pct": 49.78,
        "ndp_pct": 3.49,
        "bq_pct": 0.0,
        "grn_pct": 1.16,
        "ppc_pct": 0.89
      }
    },
    {
      "riding_id": "35053",
      "name_en": "London Centre",
      "name_fr": "London-Centre",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 35.19,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 58.25,
          "con": 23.06,
          "ndp": 12.6,
          "bq": 0.0,
          "grn": 2.76,
          "ppc": 1.6
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 25.5,
        "turnout_pct": 67.15,
        "lib_pct": 56.43,
        "con_pct": 30.93,
        "ndp_pct": 9.61,
        "bq_pct": 0.0,
        "grn_pct": 1.46,
        "ppc_pct": 0.87
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 25.5,
        "turnout_pct": 67.15,
        "lib_pct": 56.43,
        "con_pct": 30.93,
        "ndp_pct": 9.61,
        "bq_pct": 0.0,
        "grn_pct": 1.46,
        "ppc_pct": 0.87
      }
    },
    {
      "riding_id": "35054",
      "name_en": "London--Fanshawe",
      "name_fr": "London--Fanshawe",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.5147,
        "mean_margin": 1.64,
        "p_close_race": 0.9839,
        "vote_mean": {
          "lib": 32.04,
          "con": 32.3,
          "ndp": 30.28,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 2.03
        },
        "win_prob": {
          "lib": 0.4334,
          "con": 0.5147,
          "ndp": 0.0519,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 9.96,
        "turnout_pct": 63.33,
        "lib_pct": 30.22,
        "con_pct": 40.17,
        "ndp_pct": 27.29,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.31
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 9.96,
        "turnout_pct": 63.33,
        "lib_pct": 30.22,
        "con_pct": 40.17,
        "ndp_pct": 27.29,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.31
      }
    },
    {
      "riding_id": "35055",
      "name_en": "London West",
      "name_fr": "London-Ouest",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 28.78,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 57.68,
          "con": 28.9,
          "ndp": 8.47,
          "bq": 0.0,
          "grn": 1.98,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.1,
        "turnout_pct": 72.79,
        "lib_pct": 55.86,
        "con_pct": 36.77,
        "ndp_pct": 5.48,
        "bq_pct": 0.0,
        "grn_pct": 0.68,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.1,
        "turnout_pct": 72.79,
        "lib_pct": 55.86,
        "con_pct": 36.77,
        "ndp_pct": 5.48,
        "bq_pct": 0.0,
        "grn_pct": 0.68,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35056",
      "name_en": "Markham--Stouffville",
      "name_fr": "Markham--Stouffville",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 16.58,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.32,
          "con": 36.75,
          "ndp": 5.2,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.37
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 6.07,
        "turnout_pct": 69.23,
        "lib_pct": 51.08,
        "con_pct": 45.01,
        "ndp_pct": 1.81,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.63
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 6.07,
        "turnout_pct": 69.23,
        "lib_pct": 51.08,
        "con_pct": 45.01,
        "ndp_pct": 1.81,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.63
      }
    },
    {
      "riding_id": "35057",
      "name_en": "Markham--Thornhill",
      "name_fr": "Markham--Thornhill",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 24.37,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.68,
          "con": 32.31,
          "ndp": 5.69,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 2.19
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 12.81,
        "turnout_pct": 63.65,
        "lib_pct": 54.21,
        "con_pct": 41.4,
        "ndp_pct": 2.01,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.47
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 12.81,
        "turnout_pct": 63.65,
        "lib_pct": 54.21,
        "con_pct": 41.4,
        "ndp_pct": 2.01,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.47
      }
    },
    {
      "riding_id": "35058",
      "name_en": "Markham--Unionville",
      "name_fr": "Markham--Unionville",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9979,
        "mean_margin": 6.93,
        "p_close_race": 0.2171,
        "vote_mean": {
          "lib": 49.01,
          "con": 42.09,
          "ndp": 4.74,
          "bq": 0.0,
          "grn": 2.24,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.9979,
          "con": 0.0021,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 3.58,
        "turnout_pct": 63.85,
        "lib_pct": 46.77,
        "con_pct": 50.35,
        "ndp_pct": 1.35,
        "bq_pct": 0.0,
        "grn_pct": 0.94,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 3.58,
        "turnout_pct": 63.85,
        "lib_pct": 46.77,
        "con_pct": 50.35,
        "ndp_pct": 1.35,
        "bq_pct": 0.0,
        "grn_pct": 0.94,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35059",
      "name_en": "Middlesex--London",
      "name_fr": "Middlesex--London",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.5264,
        "mean_margin": 1.88,
        "p_close_race": 0.9685,
        "vote_mean": {
          "lib": 43.7,
          "con": 43.55,
          "ndp": 7.1,
          "bq": 0.0,
          "grn": 2.29,
          "ppc": 1.55
        },
        "win_prob": {
          "lib": 0.5264,
          "con": 0.4736,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 9.53,
        "turnout_pct": 73.71,
        "lib_pct": 41.88,
        "con_pct": 51.42,
        "ndp_pct": 4.11,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 0.82
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 9.53,
        "turnout_pct": 73.71,
        "lib_pct": 41.88,
        "con_pct": 51.42,
        "ndp_pct": 4.11,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 0.82
      }
    },
    {
      "riding_id": "35060",
      "name_en": "Milton East--Halton Hills South",
      "name_fr": "Milton-Est--Halton Hills-Sud",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 10.53,
        "p_close_race": 0.0119,
        "vote_mean": {
          "lib": 50.26,
          "con": 39.73,
          "ndp": 4.94,
          "bq": 0.0,
          "grn": 2.3,
          "ppc": 1.45
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 0.03,
        "turnout_pct": 73.65,
        "lib_pct": 48.02,
        "con_pct": 47.99,
        "ndp_pct": 1.54,
        "bq_pct": 0.0,
        "grn_pct": 1.0,
        "ppc_pct": 0.71
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 0.03,
        "turnout_pct": 73.65,
        "lib_pct": 48.02,
        "con_pct": 47.99,
        "ndp_pct": 1.54,
        "bq_pct": 0.0,
        "grn_pct": 1.0,
        "ppc_pct": 0.71
      }
    },
    {
      "riding_id": "35061",
      "name_en": "Mississauga Centre",
      "name_fr": "Mississauga-Centre",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.4,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.65,
          "con": 33.25,
          "ndp": 6.11,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.82
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 11.9,
        "turnout_pct": 62.57,
        "lib_pct": 53.41,
        "con_pct": 41.51,
        "ndp_pct": 2.71,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.09
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 11.9,
        "turnout_pct": 62.57,
        "lib_pct": 53.41,
        "con_pct": 41.51,
        "ndp_pct": 2.71,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.09
      }
    },
    {
      "riding_id": "35062",
      "name_en": "Mississauga East--Cooksville",
      "name_fr": "Mississauga-Est--Cooksville",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 16.03,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 51.88,
          "con": 35.85,
          "ndp": 6.16,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 2.48
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 5.54,
        "turnout_pct": 63.4,
        "lib_pct": 49.64,
        "con_pct": 44.11,
        "ndp_pct": 2.76,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.76
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 5.54,
        "turnout_pct": 63.4,
        "lib_pct": 49.64,
        "con_pct": 44.11,
        "ndp_pct": 2.76,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.76
      }
    },
    {
      "riding_id": "35063",
      "name_en": "Mississauga--Erin Mills",
      "name_fr": "Mississauga--Erin Mills",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 26.12,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 57.54,
          "con": 31.42,
          "ndp": 5.57,
          "bq": 0.0,
          "grn": 1.91,
          "ppc": 1.94
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 15.62,
        "turnout_pct": 66.8,
        "lib_pct": 55.3,
        "con_pct": 39.68,
        "ndp_pct": 2.17,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 1.21
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 15.62,
        "turnout_pct": 66.8,
        "lib_pct": 55.3,
        "con_pct": 39.68,
        "ndp_pct": 2.17,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 1.21
      }
    },
    {
      "riding_id": "35064",
      "name_en": "Mississauga--Lakeshore",
      "name_fr": "Mississauga--Lakeshore",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 18.78,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.35,
          "con": 35.57,
          "ndp": 5.27,
          "bq": 0.0,
          "grn": 2.17,
          "ppc": 1.26
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 8.28,
        "turnout_pct": 70.48,
        "lib_pct": 52.11,
        "con_pct": 43.83,
        "ndp_pct": 1.87,
        "bq_pct": 0.0,
        "grn_pct": 0.87,
        "ppc_pct": 0.5
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 8.28,
        "turnout_pct": 70.48,
        "lib_pct": 52.11,
        "con_pct": 43.83,
        "ndp_pct": 1.87,
        "bq_pct": 0.0,
        "grn_pct": 0.87,
        "ppc_pct": 0.5
      }
    },
    {
      "riding_id": "35065",
      "name_en": "Mississauga--Malton",
      "name_fr": "Mississauga--Malton",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 21.53,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.13,
          "con": 33.6,
          "ndp": 5.95,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 2.66
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 11.04,
        "turnout_pct": 61.87,
        "lib_pct": 52.89,
        "con_pct": 41.86,
        "ndp_pct": 2.55,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.94
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 11.04,
        "turnout_pct": 61.87,
        "lib_pct": 52.89,
        "con_pct": 41.86,
        "ndp_pct": 2.55,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.94
      }
    },
    {
      "riding_id": "35066",
      "name_en": "Mississauga--Streetsville",
      "name_fr": "Mississauga--Streetsville",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 17.15,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.53,
          "con": 36.38,
          "ndp": 5.67,
          "bq": 0.0,
          "grn": 2.02,
          "ppc": 1.35
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 6.65,
        "turnout_pct": 70.0,
        "lib_pct": 51.29,
        "con_pct": 44.64,
        "ndp_pct": 2.27,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 0.6
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 6.65,
        "turnout_pct": 70.0,
        "lib_pct": 51.29,
        "con_pct": 44.64,
        "ndp_pct": 2.27,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 0.6
      }
    },
    {
      "riding_id": "35067",
      "name_en": "Nepean",
      "name_fr": "Nepean",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 41.77,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.39,
          "con": 24.63,
          "ndp": 6.05,
          "bq": 0.0,
          "grn": 1.93,
          "ppc": 1.13
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 30.36,
        "turnout_pct": 77.19,
        "lib_pct": 63.41,
        "con_pct": 33.06,
        "ndp_pct": 1.96,
        "bq_pct": 0.0,
        "grn_pct": 0.64,
        "ppc_pct": 0.36
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 30.36,
        "turnout_pct": 77.19,
        "lib_pct": 63.41,
        "con_pct": 33.06,
        "ndp_pct": 1.96,
        "bq_pct": 0.0,
        "grn_pct": 0.64,
        "ppc_pct": 0.36
      }
    },
    {
      "riding_id": "35068",
      "name_en": "Newmarket--Aurora",
      "name_fr": "Newmarket--Aurora",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9979,
        "mean_margin": 6.94,
        "p_close_race": 0.2158,
        "vote_mean": {
          "lib": 48.82,
          "con": 41.89,
          "ndp": 5.73,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.9979,
          "con": 0.0021,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 3.56,
        "turnout_pct": 70.82,
        "lib_pct": 46.58,
        "con_pct": 50.15,
        "ndp_pct": 2.34,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 3.56,
        "turnout_pct": 70.82,
        "lib_pct": 46.58,
        "con_pct": 50.15,
        "ndp_pct": 2.34,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35069",
      "name_en": "New Tecumseth--Gwillimbury",
      "name_fr": "New Tecumseth--Gwillimbury",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 12.41,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 37.74,
          "con": 50.15,
          "ndp": 4.24,
          "bq": 0.0,
          "grn": 2.38,
          "ppc": 1.49
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 22.24,
        "turnout_pct": 68.45,
        "lib_pct": 36.72,
        "con_pct": 58.96,
        "ndp_pct": 1.84,
        "bq_pct": 0.0,
        "grn_pct": 1.07,
        "ppc_pct": 0.75
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 22.24,
        "turnout_pct": 68.45,
        "lib_pct": 36.72,
        "con_pct": 58.96,
        "ndp_pct": 1.84,
        "bq_pct": 0.0,
        "grn_pct": 1.07,
        "ppc_pct": 0.75
      }
    },
    {
      "riding_id": "35070",
      "name_en": "Niagara Falls--Niagara-on-the-Lake",
      "name_fr": "Niagara Falls--Niagara-on-the-Lake",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9946,
        "mean_margin": 6.3,
        "p_close_race": 0.3015,
        "vote_mean": {
          "lib": 46.79,
          "con": 40.5,
          "ndp": 7.21,
          "bq": 0.0,
          "grn": 2.15,
          "ppc": 1.52
        },
        "win_prob": {
          "lib": 0.9946,
          "con": 0.0054,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 4.22,
        "turnout_pct": 67.05,
        "lib_pct": 44.55,
        "con_pct": 48.76,
        "ndp_pct": 3.82,
        "bq_pct": 0.0,
        "grn_pct": 0.85,
        "ppc_pct": 0.79
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 4.22,
        "turnout_pct": 67.05,
        "lib_pct": 44.55,
        "con_pct": 48.76,
        "ndp_pct": 3.82,
        "bq_pct": 0.0,
        "grn_pct": 0.85,
        "ppc_pct": 0.79
      }
    },
    {
      "riding_id": "35071",
      "name_en": "Niagara South",
      "name_fr": "Niagara-Sud",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9963,
        "mean_margin": 6.64,
        "p_close_race": 0.2557,
        "vote_mean": {
          "lib": 45.92,
          "con": 39.29,
          "ndp": 8.97,
          "bq": 0.0,
          "grn": 2.18,
          "ppc": 2.21
        },
        "win_prob": {
          "lib": 0.9963,
          "con": 0.0037,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 3.88,
        "turnout_pct": 67.73,
        "lib_pct": 43.68,
        "con_pct": 47.55,
        "ndp_pct": 5.58,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 1.49
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 3.88,
        "turnout_pct": 67.73,
        "lib_pct": 43.68,
        "con_pct": 47.55,
        "ndp_pct": 5.58,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 1.49
      }
    },
    {
      "riding_id": "35072",
      "name_en": "Niagara West",
      "name_fr": "Niagara-Ouest",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.794,
        "mean_margin": 2.6,
        "p_close_race": 0.8819,
        "vote_mean": {
          "lib": 45.24,
          "con": 43.21,
          "ndp": 6.59,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.55
        },
        "win_prob": {
          "lib": 0.794,
          "con": 0.206,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 8.47,
        "turnout_pct": 75.75,
        "lib_pct": 43.0,
        "con_pct": 51.47,
        "ndp_pct": 3.2,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.82
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 8.47,
        "turnout_pct": 75.75,
        "lib_pct": 43.0,
        "con_pct": 51.47,
        "ndp_pct": 3.2,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.82
      }
    },
    {
      "riding_id": "35073",
      "name_en": "Nipissing--Timiskaming",
      "name_fr": "Nipissing--Timiskaming",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.47,
        "p_close_race": 0.0001,
        "vote_mean": {
          "lib": 48.05,
          "con": 35.58,
          "ndp": 8.43,
          "bq": 0.0,
          "grn": 2.3,
          "ppc": 1.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 2.64,
        "turnout_pct": 69.26,
        "lib_pct": 47.03,
        "con_pct": 44.39,
        "ndp_pct": 6.03,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 1.1
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 2.64,
        "turnout_pct": 69.26,
        "lib_pct": 47.03,
        "con_pct": 44.39,
        "ndp_pct": 6.03,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 1.1
      }
    },
    {
      "riding_id": "35074",
      "name_en": "Northumberland--Clarke",
      "name_fr": "Northumberland--Clarke",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9996,
        "mean_margin": 6.73,
        "p_close_race": 0.1981,
        "vote_mean": {
          "lib": 46.67,
          "con": 39.94,
          "ndp": 5.32,
          "bq": 0.0,
          "grn": 2.19,
          "ppc": 1.47
        },
        "win_prob": {
          "lib": 0.9996,
          "con": 0.0004,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 3.1,
        "turnout_pct": 74.99,
        "lib_pct": 45.65,
        "con_pct": 48.75,
        "ndp_pct": 2.92,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 0.73
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 3.1,
        "turnout_pct": 74.99,
        "lib_pct": 45.65,
        "con_pct": 48.75,
        "ndp_pct": 2.92,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 0.73
      }
    },
    {
      "riding_id": "35075",
      "name_en": "Oakville East",
      "name_fr": "Oakville-Est",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 16.76,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.1,
          "con": 36.34,
          "ndp": 6.17,
          "bq": 0.0,
          "grn": 1.87,
          "ppc": 1.3
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 6.25,
        "turnout_pct": 72.96,
        "lib_pct": 50.86,
        "con_pct": 44.6,
        "ndp_pct": 2.77,
        "bq_pct": 0.0,
        "grn_pct": 0.57,
        "ppc_pct": 0.55
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 6.25,
        "turnout_pct": 72.96,
        "lib_pct": 50.86,
        "con_pct": 44.6,
        "ndp_pct": 2.77,
        "bq_pct": 0.0,
        "grn_pct": 0.57,
        "ppc_pct": 0.55
      }
    },
    {
      "riding_id": "35076",
      "name_en": "Oakville West",
      "name_fr": "Oakville-Ouest",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 19.11,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.98,
          "con": 35.87,
          "ndp": 4.78,
          "bq": 0.0,
          "grn": 1.9,
          "ppc": 1.19
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 8.61,
        "turnout_pct": 74.48,
        "lib_pct": 52.74,
        "con_pct": 44.13,
        "ndp_pct": 1.38,
        "bq_pct": 0.0,
        "grn_pct": 0.6,
        "ppc_pct": 0.42
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 8.61,
        "turnout_pct": 74.48,
        "lib_pct": 52.74,
        "con_pct": 44.13,
        "ndp_pct": 1.38,
        "bq_pct": 0.0,
        "grn_pct": 0.6,
        "ppc_pct": 0.42
      }
    },
    {
      "riding_id": "35077",
      "name_en": "Orléans",
      "name_fr": "Orléans",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 50.58,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 69.96,
          "con": 19.39,
          "ndp": 6.69,
          "bq": 0.0,
          "grn": 2.11,
          "ppc": 1.18
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 39.16,
        "turnout_pct": 76.9,
        "lib_pct": 66.98,
        "con_pct": 27.82,
        "ndp_pct": 2.6,
        "bq_pct": 0.0,
        "grn_pct": 0.82,
        "ppc_pct": 0.42
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 39.16,
        "turnout_pct": 76.9,
        "lib_pct": 66.98,
        "con_pct": 27.82,
        "ndp_pct": 2.6,
        "bq_pct": 0.0,
        "grn_pct": 0.82,
        "ppc_pct": 0.42
      }
    },
    {
      "riding_id": "35078",
      "name_en": "Oshawa",
      "name_fr": "Oshawa",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9844,
        "mean_margin": 5.35,
        "p_close_race": 0.4502,
        "vote_mean": {
          "lib": 44.86,
          "con": 39.54,
          "ndp": 10.99,
          "bq": 0.0,
          "grn": 2.5,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.9844,
          "con": 0.0156,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 5.17,
        "turnout_pct": 64.12,
        "lib_pct": 42.62,
        "con_pct": 47.8,
        "ndp_pct": 7.6,
        "bq_pct": 0.0,
        "grn_pct": 1.2,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 5.17,
        "turnout_pct": 64.12,
        "lib_pct": 42.62,
        "con_pct": 47.8,
        "ndp_pct": 7.6,
        "bq_pct": 0.0,
        "grn_pct": 1.2,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35079",
      "name_en": "Ottawa Centre",
      "name_fr": "Ottawa-Centre",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 42.08,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 65.73,
          "con": 7.2,
          "ndp": 23.65,
          "bq": 0.0,
          "grn": 2.42,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 42.82,
        "turnout_pct": 77.43,
        "lib_pct": 62.75,
        "con_pct": 15.63,
        "ndp_pct": 19.56,
        "bq_pct": 0.0,
        "grn_pct": 1.13,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 42.82,
        "turnout_pct": 77.43,
        "lib_pct": 62.75,
        "con_pct": 15.63,
        "ndp_pct": 19.56,
        "bq_pct": 0.0,
        "grn_pct": 1.13,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35080",
      "name_en": "Ottawa South",
      "name_fr": "Ottawa-Sud",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 49.26,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 67.67,
          "con": 18.42,
          "ndp": 10.08,
          "bq": 0.0,
          "grn": 2.25,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 37.84,
        "turnout_pct": 69.17,
        "lib_pct": 64.69,
        "con_pct": 26.85,
        "ndp_pct": 5.99,
        "bq_pct": 0.0,
        "grn_pct": 0.96,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 37.84,
        "turnout_pct": 69.17,
        "lib_pct": 64.69,
        "con_pct": 26.85,
        "ndp_pct": 5.99,
        "bq_pct": 0.0,
        "grn_pct": 0.96,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35081",
      "name_en": "Ottawa--Vanier--Gloucester",
      "name_fr": "Ottawa--Vanier--Gloucester",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 56.52,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 69.66,
          "con": 12.81,
          "ndp": 11.59,
          "bq": 0.0,
          "grn": 3.24,
          "ppc": 1.26
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 45.44,
        "turnout_pct": 69.34,
        "lib_pct": 66.68,
        "con_pct": 21.24,
        "ndp_pct": 7.5,
        "bq_pct": 0.0,
        "grn_pct": 1.95,
        "ppc_pct": 0.51
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 45.44,
        "turnout_pct": 69.34,
        "lib_pct": 66.68,
        "con_pct": 21.24,
        "ndp_pct": 7.5,
        "bq_pct": 0.0,
        "grn_pct": 1.95,
        "ppc_pct": 0.51
      }
    },
    {
      "riding_id": "35082",
      "name_en": "Ottawa West--Nepean",
      "name_fr": "Ottawa-Ouest--Nepean",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 47.74,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.16,
          "con": 18.43,
          "ndp": 11.12,
          "bq": 0.0,
          "grn": 2.42,
          "ppc": 1.48
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 36.32,
        "turnout_pct": 72.25,
        "lib_pct": 63.18,
        "con_pct": 26.86,
        "ndp_pct": 7.03,
        "bq_pct": 0.0,
        "grn_pct": 1.13,
        "ppc_pct": 0.75
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 36.32,
        "turnout_pct": 72.25,
        "lib_pct": 63.18,
        "con_pct": 26.86,
        "ndp_pct": 7.03,
        "bq_pct": 0.0,
        "grn_pct": 1.13,
        "ppc_pct": 0.75
      }
    },
    {
      "riding_id": "35083",
      "name_en": "Oxford",
      "name_fr": "Oxford",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.9916,
        "mean_margin": 5.46,
        "p_close_race": 0.4269,
        "vote_mean": {
          "lib": 39.83,
          "con": 45.28,
          "ndp": 7.23,
          "bq": 0.0,
          "grn": 2.55,
          "ppc": 1.62
        },
        "win_prob": {
          "lib": 0.0084,
          "con": 0.9916,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 15.14,
        "turnout_pct": 71.5,
        "lib_pct": 38.01,
        "con_pct": 53.15,
        "ndp_pct": 4.24,
        "bq_pct": 0.0,
        "grn_pct": 1.25,
        "ppc_pct": 0.89
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 15.14,
        "turnout_pct": 71.5,
        "lib_pct": 38.01,
        "con_pct": 53.15,
        "ndp_pct": 4.24,
        "bq_pct": 0.0,
        "grn_pct": 1.25,
        "ppc_pct": 0.89
      }
    },
    {
      "riding_id": "35084",
      "name_en": "Parry Sound--Muskoka",
      "name_fr": "Parry Sound--Muskoka",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.5638,
        "mean_margin": 1.65,
        "p_close_race": 0.9873,
        "vote_mean": {
          "lib": 43.42,
          "con": 43.1,
          "ndp": 5.94,
          "bq": 0.0,
          "grn": 1.32,
          "ppc": 2.33
        },
        "win_prob": {
          "lib": 0.5638,
          "con": 0.4362,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 9.51,
        "turnout_pct": 71.43,
        "lib_pct": 42.4,
        "con_pct": 51.91,
        "ndp_pct": 3.54,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.61
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 9.51,
        "turnout_pct": 71.43,
        "lib_pct": 42.4,
        "con_pct": 51.91,
        "ndp_pct": 3.54,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.61
      }
    },
    {
      "riding_id": "35085",
      "name_en": "Perth--Wellington",
      "name_fr": "Perth--Wellington",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.8734,
        "mean_margin": 2.58,
        "p_close_race": 0.9037,
        "vote_mean": {
          "lib": 41.59,
          "con": 43.93,
          "ndp": 6.9,
          "bq": 0.0,
          "grn": 1.32,
          "ppc": 2.38
        },
        "win_prob": {
          "lib": 0.1266,
          "con": 0.8734,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 12.15,
        "turnout_pct": 71.21,
        "lib_pct": 40.57,
        "con_pct": 52.73,
        "ndp_pct": 4.51,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.66
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 12.15,
        "turnout_pct": 71.21,
        "lib_pct": 40.57,
        "con_pct": 52.73,
        "ndp_pct": 4.51,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.66
      }
    },
    {
      "riding_id": "35086",
      "name_en": "Peterborough",
      "name_fr": "Peterborough",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.86,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.87,
          "con": 33.01,
          "ndp": 6.02,
          "bq": 0.0,
          "grn": 2.13,
          "ppc": 1.12
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 13.16,
        "turnout_pct": 74.1,
        "lib_pct": 54.04,
        "con_pct": 40.88,
        "ndp_pct": 3.03,
        "bq_pct": 0.0,
        "grn_pct": 0.83,
        "ppc_pct": 0.34
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 13.16,
        "turnout_pct": 74.1,
        "lib_pct": 54.04,
        "con_pct": 40.88,
        "ndp_pct": 3.03,
        "bq_pct": 0.0,
        "grn_pct": 0.83,
        "ppc_pct": 0.34
      }
    },
    {
      "riding_id": "35087",
      "name_en": "Pickering--Brooklin",
      "name_fr": "Pickering--Brooklin",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 23.44,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.12,
          "con": 32.69,
          "ndp": 5.96,
          "bq": 0.0,
          "grn": 2.05,
          "ppc": 1.62
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 12.93,
        "turnout_pct": 70.4,
        "lib_pct": 53.88,
        "con_pct": 40.95,
        "ndp_pct": 2.57,
        "bq_pct": 0.0,
        "grn_pct": 0.75,
        "ppc_pct": 0.89
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 12.93,
        "turnout_pct": 70.4,
        "lib_pct": 53.88,
        "con_pct": 40.95,
        "ndp_pct": 2.57,
        "bq_pct": 0.0,
        "grn_pct": 0.75,
        "ppc_pct": 0.89
      }
    },
    {
      "riding_id": "35088",
      "name_en": "Prescott--Russell--Cumberland",
      "name_fr": "Prescott--Russell--Cumberland",
      "province": "ON",
      "region": "ottawa_region",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 24.16,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.41,
          "con": 31.25,
          "ndp": 4.81,
          "bq": 0.0,
          "grn": 2.4,
          "ppc": 1.73
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 14.33,
        "turnout_pct": 75.78,
        "lib_pct": 54.38,
        "con_pct": 40.05,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 1.09,
        "ppc_pct": 1.01
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 14.33,
        "turnout_pct": 75.78,
        "lib_pct": 54.38,
        "con_pct": 40.05,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 1.09,
        "ppc_pct": 1.01
      }
    },
    {
      "riding_id": "35089",
      "name_en": "Richmond Hill South",
      "name_fr": "Richmond Hill-Sud",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.864,
        "mean_margin": 3.06,
        "p_close_race": 0.8205,
        "vote_mean": {
          "lib": 46.24,
          "con": 43.53,
          "ndp": 5.17,
          "bq": 0.0,
          "grn": 2.14,
          "ppc": 1.17
        },
        "win_prob": {
          "lib": 0.864,
          "con": 0.136,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.79,
        "turnout_pct": 62.98,
        "lib_pct": 44.0,
        "con_pct": 51.79,
        "ndp_pct": 1.78,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.41
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.79,
        "turnout_pct": 62.98,
        "lib_pct": 44.0,
        "con_pct": 51.79,
        "ndp_pct": 1.78,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.41
      }
    },
    {
      "riding_id": "35090",
      "name_en": "Sarnia--Lambton--Bkejwanong",
      "name_fr": "Sarnia--Lambton--Bkejwanong",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.9924,
        "mean_margin": 5.5,
        "p_close_race": 0.4202,
        "vote_mean": {
          "lib": 39.52,
          "con": 45.01,
          "ndp": 8.32,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 2.2
        },
        "win_prob": {
          "lib": 0.0076,
          "con": 0.9924,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 15.19,
        "turnout_pct": 71.65,
        "lib_pct": 37.7,
        "con_pct": 52.88,
        "ndp_pct": 5.33,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.48
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 15.19,
        "turnout_pct": 71.65,
        "lib_pct": 37.7,
        "con_pct": 52.88,
        "ndp_pct": 5.33,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.48
      }
    },
    {
      "riding_id": "35091",
      "name_en": "Sault Ste. Marie--Algoma",
      "name_fr": "Sault Ste. Marie--Algoma",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.33,
        "p_close_race": 0.0008,
        "vote_mean": {
          "lib": 48.94,
          "con": 36.61,
          "ndp": 9.58,
          "bq": 0.0,
          "grn": 2.12,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 2.63,
        "turnout_pct": 67.92,
        "lib_pct": 47.11,
        "con_pct": 44.48,
        "ndp_pct": 6.59,
        "bq_pct": 0.0,
        "grn_pct": 0.82,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 2.63,
        "turnout_pct": 67.92,
        "lib_pct": 47.11,
        "con_pct": 44.48,
        "ndp_pct": 6.59,
        "bq_pct": 0.0,
        "grn_pct": 0.82,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35092",
      "name_en": "Scarborough--Agincourt",
      "name_fr": "Scarborough--Agincourt",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.78,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.8,
          "con": 34.02,
          "ndp": 6.92,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 11.37,
        "turnout_pct": 60.79,
        "lib_pct": 53.81,
        "con_pct": 42.45,
        "ndp_pct": 2.83,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 11.37,
        "turnout_pct": 60.79,
        "lib_pct": 53.81,
        "con_pct": 42.45,
        "ndp_pct": 2.83,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35093",
      "name_en": "Scarborough Centre--Don Valley East",
      "name_fr": "Scarborough-Centre--Don Valley-Est",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 30.46,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 59.72,
          "con": 29.26,
          "ndp": 7.31,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 2.08
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.04,
        "turnout_pct": 61.87,
        "lib_pct": 56.73,
        "con_pct": 37.69,
        "ndp_pct": 3.22,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.36
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.04,
        "turnout_pct": 61.87,
        "lib_pct": 56.73,
        "con_pct": 37.69,
        "ndp_pct": 3.22,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.36
      }
    },
    {
      "riding_id": "35094",
      "name_en": "Scarborough--Guildwood--Rouge Park",
      "name_fr": "Scarborough--Guildwood--Rouge Park",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 43.51,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.58,
          "con": 23.07,
          "ndp": 7.28,
          "bq": 0.0,
          "grn": 2.43,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 32.09,
        "turnout_pct": 65.42,
        "lib_pct": 63.59,
        "con_pct": 31.5,
        "ndp_pct": 3.19,
        "bq_pct": 0.0,
        "grn_pct": 1.14,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 32.09,
        "turnout_pct": 65.42,
        "lib_pct": 63.59,
        "con_pct": 31.5,
        "ndp_pct": 3.19,
        "bq_pct": 0.0,
        "grn_pct": 1.14,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35095",
      "name_en": "Scarborough North",
      "name_fr": "Scarborough-Nord",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 40.95,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 65.35,
          "con": 24.4,
          "ndp": 7.96,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 29.53,
        "turnout_pct": 60.03,
        "lib_pct": 62.36,
        "con_pct": 32.83,
        "ndp_pct": 3.87,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 29.53,
        "turnout_pct": 60.03,
        "lib_pct": 62.36,
        "con_pct": 32.83,
        "ndp_pct": 3.87,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35096",
      "name_en": "Scarborough Southwest",
      "name_fr": "Scarborough-Sud-Ouest",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 42.19,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 64.18,
          "con": 21.99,
          "ndp": 9.08,
          "bq": 0.0,
          "grn": 2.67,
          "ppc": 1.76
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 30.77,
        "turnout_pct": 63.32,
        "lib_pct": 61.19,
        "con_pct": 30.42,
        "ndp_pct": 4.99,
        "bq_pct": 0.0,
        "grn_pct": 1.38,
        "ppc_pct": 1.04
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 30.77,
        "turnout_pct": 63.32,
        "lib_pct": 61.19,
        "con_pct": 30.42,
        "ndp_pct": 4.99,
        "bq_pct": 0.0,
        "grn_pct": 1.38,
        "ppc_pct": 1.04
      }
    },
    {
      "riding_id": "35097",
      "name_en": "Scarborough--Woburn",
      "name_fr": "Scarborough--Woburn",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 37.43,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 62.82,
          "con": 25.39,
          "ndp": 7.56,
          "bq": 0.0,
          "grn": 2.47,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 26.01,
        "turnout_pct": 59.37,
        "lib_pct": 59.83,
        "con_pct": 33.82,
        "ndp_pct": 3.47,
        "bq_pct": 0.0,
        "grn_pct": 1.18,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 26.01,
        "turnout_pct": 59.37,
        "lib_pct": 59.83,
        "con_pct": 33.82,
        "ndp_pct": 3.47,
        "bq_pct": 0.0,
        "grn_pct": 1.18,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35098",
      "name_en": "Simcoe--Grey",
      "name_fr": "Simcoe--Grey",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.7169,
        "mean_margin": 1.89,
        "p_close_race": 0.9716,
        "vote_mean": {
          "lib": 44.14,
          "con": 42.97,
          "ndp": 4.69,
          "bq": 0.0,
          "grn": 2.76,
          "ppc": 1.5
        },
        "win_prob": {
          "lib": 0.7169,
          "con": 0.2831,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 8.65,
        "turnout_pct": 71.45,
        "lib_pct": 43.12,
        "con_pct": 51.77,
        "ndp_pct": 2.3,
        "bq_pct": 0.0,
        "grn_pct": 1.45,
        "ppc_pct": 0.77
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 8.65,
        "turnout_pct": 71.45,
        "lib_pct": 43.12,
        "con_pct": 51.77,
        "ndp_pct": 2.3,
        "bq_pct": 0.0,
        "grn_pct": 1.45,
        "ppc_pct": 0.77
      }
    },
    {
      "riding_id": "35099",
      "name_en": "Simcoe North",
      "name_fr": "Simcoe-Nord",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9988,
        "mean_margin": 6.13,
        "p_close_race": 0.2898,
        "vote_mean": {
          "lib": 45.39,
          "con": 39.26,
          "ndp": 6.13,
          "bq": 0.0,
          "grn": 3.19,
          "ppc": 1.68
        },
        "win_prob": {
          "lib": 0.9988,
          "con": 0.0012,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 3.69,
        "turnout_pct": 68.61,
        "lib_pct": 44.37,
        "con_pct": 48.06,
        "ndp_pct": 3.74,
        "bq_pct": 0.0,
        "grn_pct": 1.88,
        "ppc_pct": 0.95
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 3.69,
        "turnout_pct": 68.61,
        "lib_pct": 44.37,
        "con_pct": 48.06,
        "ndp_pct": 3.74,
        "bq_pct": 0.0,
        "grn_pct": 1.88,
        "ppc_pct": 0.95
      }
    },
    {
      "riding_id": "35100",
      "name_en": "Spadina--Harbourfront",
      "name_fr": "Spadina--Harbourfront",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 40.58,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 62.71,
          "con": 22.13,
          "ndp": 11.8,
          "bq": 0.0,
          "grn": 2.13,
          "ppc": 1.13
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 29.17,
        "turnout_pct": 64.87,
        "lib_pct": 59.72,
        "con_pct": 30.56,
        "ndp_pct": 7.71,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.36
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 29.17,
        "turnout_pct": 64.87,
        "lib_pct": 59.72,
        "con_pct": 30.56,
        "ndp_pct": 7.71,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.36
      }
    },
    {
      "riding_id": "35101",
      "name_en": "St. Catharines",
      "name_fr": "St. Catharines",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.0,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.91,
          "con": 31.91,
          "ndp": 9.37,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.51
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 11.51,
        "turnout_pct": 69.26,
        "lib_pct": 51.67,
        "con_pct": 40.17,
        "ndp_pct": 5.98,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.78
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 11.51,
        "turnout_pct": 69.26,
        "lib_pct": 51.67,
        "con_pct": 40.17,
        "ndp_pct": 5.98,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.78
      }
    },
    {
      "riding_id": "35102",
      "name_en": "Stormont--Dundas--Glengarry",
      "name_fr": "Stormont--Dundas--Glengarry",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.9999,
        "mean_margin": 6.63,
        "p_close_race": 0.2148,
        "vote_mean": {
          "lib": 40.54,
          "con": 47.17,
          "ndp": 4.87,
          "bq": 0.0,
          "grn": 2.32,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.0001,
          "con": 0.9999,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 16.45,
        "turnout_pct": 68.59,
        "lib_pct": 39.52,
        "con_pct": 55.97,
        "ndp_pct": 2.47,
        "bq_pct": 0.0,
        "grn_pct": 1.01,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 16.45,
        "turnout_pct": 68.59,
        "lib_pct": 39.52,
        "con_pct": 55.97,
        "ndp_pct": 2.47,
        "bq_pct": 0.0,
        "grn_pct": 1.01,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35103",
      "name_en": "Sudbury",
      "name_fr": "Sudbury",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 22.28,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.25,
          "con": 30.97,
          "ndp": 10.62,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.98
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 12.57,
        "turnout_pct": 68.98,
        "lib_pct": 51.42,
        "con_pct": 38.84,
        "ndp_pct": 7.63,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.26
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 12.57,
        "turnout_pct": 68.98,
        "lib_pct": 51.42,
        "con_pct": 38.84,
        "ndp_pct": 7.63,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.26
      }
    },
    {
      "riding_id": "35104",
      "name_en": "Sudbury East--Manitoulin--Nickel Belt",
      "name_fr": "Sudbury-Est--Manitoulin--Nickel Belt",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8957,
        "mean_margin": 3.21,
        "p_close_race": 0.8024,
        "vote_mean": {
          "lib": 43.15,
          "con": 40.17,
          "ndp": 10.94,
          "bq": 0.0,
          "grn": 2.07,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.8957,
          "con": 0.1043,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.72,
        "turnout_pct": 70.12,
        "lib_pct": 41.32,
        "con_pct": 48.04,
        "ndp_pct": 7.95,
        "bq_pct": 0.0,
        "grn_pct": 0.77,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.72,
        "turnout_pct": 70.12,
        "lib_pct": 41.32,
        "con_pct": 48.04,
        "ndp_pct": 7.95,
        "bq_pct": 0.0,
        "grn_pct": 0.77,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35105",
      "name_en": "Taiaiako'n--Parkdale--High Park",
      "name_fr": "Taiaiako'n--Parkdale--High Park",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 31.3,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.57,
          "con": 10.5,
          "ndp": 25.27,
          "bq": 0.0,
          "grn": 2.38,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 32.67,
        "turnout_pct": 70.68,
        "lib_pct": 55.54,
        "con_pct": 19.3,
        "ndp_pct": 22.87,
        "bq_pct": 0.0,
        "grn_pct": 1.07,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 32.67,
        "turnout_pct": 70.68,
        "lib_pct": 55.54,
        "con_pct": 19.3,
        "ndp_pct": 22.87,
        "bq_pct": 0.0,
        "grn_pct": 1.07,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35106",
      "name_en": "Thornhill",
      "name_fr": "Thornhill",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 23.42,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 33.88,
          "con": 57.3,
          "ndp": 5.32,
          "bq": 0.0,
          "grn": 1.81,
          "ppc": 1.39
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 34.84,
        "turnout_pct": 68.86,
        "lib_pct": 30.89,
        "con_pct": 65.73,
        "ndp_pct": 1.23,
        "bq_pct": 0.0,
        "grn_pct": 0.52,
        "ppc_pct": 0.65
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 34.84,
        "turnout_pct": 68.86,
        "lib_pct": 30.89,
        "con_pct": 65.73,
        "ndp_pct": 1.23,
        "bq_pct": 0.0,
        "grn_pct": 0.52,
        "ppc_pct": 0.65
      }
    },
    {
      "riding_id": "35107",
      "name_en": "Thunder Bay--Rainy River",
      "name_fr": "Thunder Bay--Rainy River",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 15.27,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 50.08,
          "con": 34.81,
          "ndp": 9.74,
          "bq": 0.0,
          "grn": 2.06,
          "ppc": 1.72
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 5.57,
        "turnout_pct": 66.38,
        "lib_pct": 48.25,
        "con_pct": 42.68,
        "ndp_pct": 6.75,
        "bq_pct": 0.0,
        "grn_pct": 0.76,
        "ppc_pct": 0.99
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 5.57,
        "turnout_pct": 66.38,
        "lib_pct": 48.25,
        "con_pct": 42.68,
        "ndp_pct": 6.75,
        "bq_pct": 0.0,
        "grn_pct": 0.76,
        "ppc_pct": 0.99
      }
    },
    {
      "riding_id": "35108",
      "name_en": "Thunder Bay--Superior North",
      "name_fr": "Thunder Bay--Supérieur-Nord",
      "province": "ON",
      "region": "eastern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 29.07,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.73,
          "con": 27.66,
          "ndp": 10.06,
          "bq": 0.0,
          "grn": 2.21,
          "ppc": 1.73
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.37,
        "turnout_pct": 67.78,
        "lib_pct": 54.9,
        "con_pct": 35.53,
        "ndp_pct": 7.07,
        "bq_pct": 0.0,
        "grn_pct": 0.91,
        "ppc_pct": 1.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.37,
        "turnout_pct": 67.78,
        "lib_pct": 54.9,
        "con_pct": 35.53,
        "ndp_pct": 7.07,
        "bq_pct": 0.0,
        "grn_pct": 0.91,
        "ppc_pct": 1.0
      }
    },
    {
      "riding_id": "35109",
      "name_en": "Toronto Centre",
      "name_fr": "Toronto-Centre",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 50.34,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.85,
          "con": 12.33,
          "ndp": 16.49,
          "bq": 0.0,
          "grn": 2.41,
          "ppc": 1.16
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 43.1,
        "turnout_pct": 63.92,
        "lib_pct": 63.86,
        "con_pct": 20.76,
        "ndp_pct": 12.4,
        "bq_pct": 0.0,
        "grn_pct": 1.12,
        "ppc_pct": 0.4
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 43.1,
        "turnout_pct": 63.92,
        "lib_pct": 63.86,
        "con_pct": 20.76,
        "ndp_pct": 12.4,
        "bq_pct": 0.0,
        "grn_pct": 1.12,
        "ppc_pct": 0.4
      }
    },
    {
      "riding_id": "35110",
      "name_en": "Toronto--Danforth",
      "name_fr": "Toronto--Danforth",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 52.18,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 69.16,
          "con": 10.46,
          "ndp": 16.97,
          "bq": 0.0,
          "grn": 2.35,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 47.28,
        "turnout_pct": 71.64,
        "lib_pct": 66.17,
        "con_pct": 18.89,
        "ndp_pct": 12.88,
        "bq_pct": 0.0,
        "grn_pct": 1.06,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 47.28,
        "turnout_pct": 71.64,
        "lib_pct": 66.17,
        "con_pct": 18.89,
        "ndp_pct": 12.88,
        "bq_pct": 0.0,
        "grn_pct": 1.06,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35111",
      "name_en": "Toronto--St. Paul's",
      "name_fr": "Toronto--St. Paul's",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 40.06,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 64.56,
          "con": 24.5,
          "ndp": 7.56,
          "bq": 0.0,
          "grn": 2.06,
          "ppc": 1.22
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 28.64,
        "turnout_pct": 73.7,
        "lib_pct": 61.57,
        "con_pct": 32.93,
        "ndp_pct": 3.47,
        "bq_pct": 0.0,
        "grn_pct": 0.77,
        "ppc_pct": 0.46
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 28.64,
        "turnout_pct": 73.7,
        "lib_pct": 61.57,
        "con_pct": 32.93,
        "ndp_pct": 3.47,
        "bq_pct": 0.0,
        "grn_pct": 0.77,
        "ppc_pct": 0.46
      }
    },
    {
      "riding_id": "35112",
      "name_en": "University--Rosedale",
      "name_fr": "University--Rosedale",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 51.22,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.51,
          "con": 14.88,
          "ndp": 13.92,
          "bq": 0.0,
          "grn": 2.99,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 40.21,
        "turnout_pct": 65.42,
        "lib_pct": 63.52,
        "con_pct": 23.31,
        "ndp_pct": 9.83,
        "bq_pct": 0.0,
        "grn_pct": 1.7,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 40.21,
        "turnout_pct": 65.42,
        "lib_pct": 63.52,
        "con_pct": 23.31,
        "ndp_pct": 9.83,
        "bq_pct": 0.0,
        "grn_pct": 1.7,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35113",
      "name_en": "Vaughan--Woodbridge",
      "name_fr": "Vaughan--Woodbridge",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 11.31,
        "p_close_race": 0.0043,
        "vote_mean": {
          "lib": 40.01,
          "con": 51.33,
          "ndp": 4.7,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 1.37
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 21.83,
        "turnout_pct": 70.87,
        "lib_pct": 37.77,
        "con_pct": 59.59,
        "ndp_pct": 1.31,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.63
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 21.83,
        "turnout_pct": 70.87,
        "lib_pct": 37.77,
        "con_pct": 59.59,
        "ndp_pct": 1.31,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.63
      }
    },
    {
      "riding_id": "35114",
      "name_en": "Waterloo",
      "name_fr": "Waterloo",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 37.28,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 61.41,
          "con": 24.13,
          "ndp": 7.52,
          "bq": 0.0,
          "grn": 3.82,
          "ppc": 1.3
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 26.78,
        "turnout_pct": 72.76,
        "lib_pct": 59.17,
        "con_pct": 32.39,
        "ndp_pct": 4.12,
        "bq_pct": 0.0,
        "grn_pct": 2.52,
        "ppc_pct": 0.55
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 26.78,
        "turnout_pct": 72.76,
        "lib_pct": 59.17,
        "con_pct": 32.39,
        "ndp_pct": 4.12,
        "bq_pct": 0.0,
        "grn_pct": 2.52,
        "ppc_pct": 0.55
      }
    },
    {
      "riding_id": "35115",
      "name_en": "Wellington--Halton Hills North",
      "name_fr": "Wellington--Halton Hills-Nord",
      "province": "ON",
      "region": "toronto_suburbs_peel_halton",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9226,
        "mean_margin": 3.66,
        "p_close_race": 0.7293,
        "vote_mean": {
          "lib": 46.24,
          "con": 42.75,
          "ndp": 5.18,
          "bq": 0.0,
          "grn": 3.37,
          "ppc": 1.58
        },
        "win_prob": {
          "lib": 0.9226,
          "con": 0.0774,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.16,
        "turnout_pct": 76.02,
        "lib_pct": 44.18,
        "con_pct": 50.34,
        "ndp_pct": 2.01,
        "bq_pct": 0.0,
        "grn_pct": 2.07,
        "ppc_pct": 0.84
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.16,
        "turnout_pct": 76.02,
        "lib_pct": 44.18,
        "con_pct": 50.34,
        "ndp_pct": 2.01,
        "bq_pct": 0.0,
        "grn_pct": 2.07,
        "ppc_pct": 0.84
      }
    },
    {
      "riding_id": "35116",
      "name_en": "Whitby",
      "name_fr": "Whitby",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 19.33,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.59,
          "con": 35.27,
          "ndp": 5.8,
          "bq": 0.0,
          "grn": 2.04,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 8.82,
        "turnout_pct": 71.85,
        "lib_pct": 52.35,
        "con_pct": 43.53,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 0.74,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 8.82,
        "turnout_pct": 71.85,
        "lib_pct": 52.35,
        "con_pct": 43.53,
        "ndp_pct": 2.41,
        "bq_pct": 0.0,
        "grn_pct": 0.74,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35117",
      "name_en": "Willowdale",
      "name_fr": "Willowdale",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 20.78,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.92,
          "con": 35.14,
          "ndp": 6.63,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 9.37,
        "turnout_pct": 60.55,
        "lib_pct": 52.93,
        "con_pct": 43.57,
        "ndp_pct": 2.54,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 9.37,
        "turnout_pct": 60.55,
        "lib_pct": 52.93,
        "con_pct": 43.57,
        "ndp_pct": 2.54,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35118",
      "name_en": "Windsor--Tecumseh--Lakeshore",
      "name_fr": "Windsor--Tecumseh--Lakeshore",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 9.68,
        "p_close_race": 0.023,
        "vote_mean": {
          "lib": 47.27,
          "con": 37.59,
          "ndp": 9.0,
          "bq": 0.0,
          "grn": 1.96,
          "ppc": 1.89
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 0.01,
        "turnout_pct": 66.51,
        "lib_pct": 45.45,
        "con_pct": 45.46,
        "ndp_pct": 6.01,
        "bq_pct": 0.0,
        "grn_pct": 0.66,
        "ppc_pct": 1.17
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 0.01,
        "turnout_pct": 66.51,
        "lib_pct": 45.45,
        "con_pct": 45.46,
        "ndp_pct": 6.01,
        "bq_pct": 0.0,
        "grn_pct": 0.66,
        "ppc_pct": 1.17
      }
    },
    {
      "riding_id": "35119",
      "name_en": "Windsor West",
      "name_fr": "Windsor-Ouest",
      "province": "ON",
      "region": "southwestern_on",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.6937,
        "mean_margin": 1.76,
        "p_close_race": 0.9741,
        "vote_mean": {
          "lib": 32.52,
          "con": 30.83,
          "ndp": 30.56,
          "bq": 0.0,
          "grn": 2.02,
          "ppc": 1.72
        },
        "win_prob": {
          "lib": 0.6937,
          "con": 0.2044,
          "ndp": 0.1019,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 8.0,
        "turnout_pct": 58.2,
        "lib_pct": 30.7,
        "con_pct": 38.7,
        "ndp_pct": 27.57,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 1.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 8.0,
        "turnout_pct": 58.2,
        "lib_pct": 30.7,
        "con_pct": 38.7,
        "ndp_pct": 27.57,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 1.0
      }
    },
    {
      "riding_id": "35120",
      "name_en": "York Centre",
      "name_fr": "York-Centre",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 0.5832,
        "mean_margin": 2.24,
        "p_close_race": 0.9274,
        "vote_mean": {
          "lib": 45.09,
          "con": 45.67,
          "ndp": 6.56,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 0.4168,
          "con": 0.5832,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 12.0,
        "turnout_pct": 63.75,
        "lib_pct": 42.1,
        "con_pct": 54.1,
        "ndp_pct": 2.47,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 12.0,
        "turnout_pct": 63.75,
        "lib_pct": 42.1,
        "con_pct": 54.1,
        "ndp_pct": 2.47,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "35121",
      "name_en": "York--Durham",
      "name_fr": "York--Durham",
      "province": "ON",
      "region": "toronto_suburbs_york_durham",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.9992,
        "mean_margin": 6.05,
        "p_close_race": 0.3066,
        "vote_mean": {
          "lib": 40.32,
          "con": 46.38,
          "ndp": 4.89,
          "bq": 0.0,
          "grn": 2.4,
          "ppc": 1.95
        },
        "win_prob": {
          "lib": 0.0008,
          "con": 0.9992,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 15.88,
        "turnout_pct": 72.75,
        "lib_pct": 39.3,
        "con_pct": 55.18,
        "ndp_pct": 2.5,
        "bq_pct": 0.0,
        "grn_pct": 1.09,
        "ppc_pct": 1.23
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 15.88,
        "turnout_pct": 72.75,
        "lib_pct": 39.3,
        "con_pct": 55.18,
        "ndp_pct": 2.5,
        "bq_pct": 0.0,
        "grn_pct": 1.09,
        "ppc_pct": 1.23
      }
    },
    {
      "riding_id": "35122",
      "name_en": "York South--Weston--Etobicoke",
      "name_fr": "York-Sud--Weston--Etobicoke",
      "province": "ON",
      "region": "toronto_core",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 26.74,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 57.64,
          "con": 30.9,
          "ndp": 8.94,
          "bq": 0.0,
          "grn": 1.3,
          "ppc": 0.83
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 15.33,
        "turnout_pct": 57.62,
        "lib_pct": 54.65,
        "con_pct": 39.33,
        "ndp_pct": 4.85,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 15.33,
        "turnout_pct": 57.62,
        "lib_pct": 54.65,
        "con_pct": 39.33,
        "ndp_pct": 4.85,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "46001",
      "name_en": "Brandon--Souris",
      "name_fr": "Brandon--Souris",
      "province": "MB",
      "region": "mb_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 26.96,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 26.55,
          "con": 53.51,
          "ndp": 16.38,
          "bq": 0.0,
          "grn": 1.52,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 38.48,
        "turnout_pct": 68.74,
        "lib_pct": 23.2,
        "con_pct": 61.69,
        "ndp_pct": 14.3,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 38.48,
        "turnout_pct": 68.74,
        "lib_pct": 23.2,
        "con_pct": 61.69,
        "ndp_pct": 14.3,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "46002",
      "name_en": "Churchill--Keewatinook Aski",
      "name_fr": "Churchill--Keewatinook Aski",
      "province": "MB",
      "region": "mb_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 16.78,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 46.8,
          "con": 14.61,
          "ndp": 30.02,
          "bq": 0.0,
          "grn": 1.53,
          "ppc": 2.47
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 16.56,
        "turnout_pct": 41.46,
        "lib_pct": 44.92,
        "con_pct": 23.76,
        "ndp_pct": 28.36,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.68
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 16.56,
        "turnout_pct": 41.46,
        "lib_pct": 44.92,
        "con_pct": 23.76,
        "ndp_pct": 28.36,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.68
      }
    },
    {
      "riding_id": "46003",
      "name_en": "Elmwood--Transcona",
      "name_fr": "Elmwood--Transcona",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "urban",
      "projection": {
        "winner": "ndp",
        "p_winner": 0.9572,
        "mean_margin": 4.2,
        "p_close_race": 0.6412,
        "vote_mean": {
          "lib": 27.36,
          "con": 32.95,
          "ndp": 37.1,
          "bq": 0.0,
          "grn": 2.17,
          "ppc": 1.64
        },
        "win_prob": {
          "lib": 0.0002,
          "con": 0.0425,
          "ndp": 0.9572,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.05,
        "turnout_pct": 65.58,
        "lib_pct": 22.3,
        "con_pct": 41.28,
        "ndp_pct": 34.23,
        "bq_pct": 0.0,
        "grn_pct": 0.68,
        "ppc_pct": 0.84
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.05,
        "turnout_pct": 65.58,
        "lib_pct": 22.3,
        "con_pct": 41.28,
        "ndp_pct": 34.23,
        "bq_pct": 0.0,
        "grn_pct": 0.68,
        "ppc_pct": 0.84
      }
    },
    {
      "riding_id": "46004",
      "name_en": "Kildonan--St. Paul",
      "name_fr": "Kildonan--St. Paul",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9997,
        "mean_margin": 10.6,
        "p_close_race": 0.0385,
        "vote_mean": {
          "lib": 49.46,
          "con": 38.86,
          "ndp": 9.78,
          "bq": 0.0,
          "grn": 1.5,
          "ppc": 1.67
        },
        "win_prob": {
          "lib": 0.9997,
          "con": 0.0003,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 2.78,
        "turnout_pct": 71.85,
        "lib_pct": 44.4,
        "con_pct": 47.19,
        "ndp_pct": 6.91,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.87
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 2.78,
        "turnout_pct": 71.85,
        "lib_pct": 44.4,
        "con_pct": 47.19,
        "ndp_pct": 6.91,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.87
      }
    },
    {
      "riding_id": "46005",
      "name_en": "Portage--Lisgar",
      "name_fr": "Portage--Lisgar",
      "province": "MB",
      "region": "mb_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 34.68,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 26.01,
          "con": 60.69,
          "ndp": 6.42,
          "bq": 0.0,
          "grn": 2.8,
          "ppc": 2.9
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 46.21,
        "turnout_pct": 67.94,
        "lib_pct": 22.66,
        "con_pct": 68.87,
        "ndp_pct": 4.34,
        "bq_pct": 0.0,
        "grn_pct": 1.29,
        "ppc_pct": 2.11
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 46.21,
        "turnout_pct": 67.94,
        "lib_pct": 22.66,
        "con_pct": 68.87,
        "ndp_pct": 4.34,
        "bq_pct": 0.0,
        "grn_pct": 1.29,
        "ppc_pct": 2.11
      }
    },
    {
      "riding_id": "46006",
      "name_en": "Provencher",
      "name_fr": "Provencher",
      "province": "MB",
      "region": "mb_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 28.65,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 29.02,
          "con": 57.67,
          "ndp": 6.68,
          "bq": 0.0,
          "grn": 2.86,
          "ppc": 2.6
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 40.18,
        "turnout_pct": 70.46,
        "lib_pct": 25.67,
        "con_pct": 65.85,
        "ndp_pct": 4.6,
        "bq_pct": 0.0,
        "grn_pct": 1.35,
        "ppc_pct": 1.81
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 40.18,
        "turnout_pct": 70.46,
        "lib_pct": 25.67,
        "con_pct": 65.85,
        "ndp_pct": 4.6,
        "bq_pct": 0.0,
        "grn_pct": 1.35,
        "ppc_pct": 1.81
      }
    },
    {
      "riding_id": "46007",
      "name_en": "Riding Mountain",
      "name_fr": "Mont-Riding",
      "province": "MB",
      "region": "mb_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 34.36,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 23.91,
          "con": 58.27,
          "ndp": 8.95,
          "bq": 0.0,
          "grn": 2.82,
          "ppc": 2.13
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 45.39,
        "turnout_pct": 65.03,
        "lib_pct": 22.03,
        "con_pct": 67.42,
        "ndp_pct": 7.29,
        "bq_pct": 0.0,
        "grn_pct": 1.3,
        "ppc_pct": 1.34
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 45.39,
        "turnout_pct": 65.03,
        "lib_pct": 22.03,
        "con_pct": 67.42,
        "ndp_pct": 7.29,
        "bq_pct": 0.0,
        "grn_pct": 1.3,
        "ppc_pct": 1.34
      }
    },
    {
      "riding_id": "46008",
      "name_en": "St. Boniface--St. Vital",
      "name_fr": "Saint-Boniface--Saint-Vital",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 39.23,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 64.11,
          "con": 24.88,
          "ndp": 9.37,
          "bq": 0.0,
          "grn": 1.5,
          "ppc": 1.75
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 27.26,
        "turnout_pct": 72.26,
        "lib_pct": 59.35,
        "con_pct": 32.09,
        "ndp_pct": 6.87,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.95
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 27.26,
        "turnout_pct": 72.26,
        "lib_pct": 59.35,
        "con_pct": 32.09,
        "ndp_pct": 6.87,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.95
      }
    },
    {
      "riding_id": "46009",
      "name_en": "Selkirk--Interlake--Eastman",
      "name_fr": "Selkirk--Interlake--Eastman",
      "province": "MB",
      "region": "mb_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 18.56,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 32.11,
          "con": 50.67,
          "ndp": 8.11,
          "bq": 0.0,
          "grn": 2.81,
          "ppc": 1.66
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 29.59,
        "turnout_pct": 70.75,
        "lib_pct": 30.23,
        "con_pct": 59.82,
        "ndp_pct": 6.45,
        "bq_pct": 0.0,
        "grn_pct": 1.29,
        "ppc_pct": 0.86
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 29.59,
        "turnout_pct": 70.75,
        "lib_pct": 30.23,
        "con_pct": 59.82,
        "ndp_pct": 6.45,
        "bq_pct": 0.0,
        "grn_pct": 1.29,
        "ppc_pct": 0.86
      }
    },
    {
      "riding_id": "46010",
      "name_en": "Winnipeg Centre",
      "name_fr": "Winnipeg-Centre",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.874,
        "mean_margin": 5.76,
        "p_close_race": 0.474,
        "vote_mean": {
          "lib": 44.57,
          "con": 13.76,
          "ndp": 39.39,
          "bq": 0.0,
          "grn": 2.61,
          "ppc": 1.86
        },
        "win_prob": {
          "lib": 0.874,
          "con": 0.0,
          "ndp": 0.126,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "ndp",
        "margin": 4.0,
        "turnout_pct": 53.67,
        "lib_pct": 35.02,
        "con_pct": 22.09,
        "ndp_pct": 39.02,
        "bq_pct": 0.0,
        "grn_pct": 1.12,
        "ppc_pct": 1.06
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "ndp",
        "margin": 4.0,
        "turnout_pct": 53.67,
        "lib_pct": 35.02,
        "con_pct": 22.09,
        "ndp_pct": 39.02,
        "bq_pct": 0.0,
        "grn_pct": 1.12,
        "ppc_pct": 1.06
      }
    },
    {
      "riding_id": "46011",
      "name_en": "Winnipeg North",
      "name_fr": "Winnipeg-Nord",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 36.76,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 62.52,
          "con": 25.76,
          "ndp": 8.85,
          "bq": 0.0,
          "grn": 2.05,
          "ppc": 1.6
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 23.38,
        "turnout_pct": 58.48,
        "lib_pct": 57.46,
        "con_pct": 34.09,
        "ndp_pct": 5.98,
        "bq_pct": 0.0,
        "grn_pct": 0.56,
        "ppc_pct": 0.8
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 23.38,
        "turnout_pct": 58.48,
        "lib_pct": 57.46,
        "con_pct": 34.09,
        "ndp_pct": 5.98,
        "bq_pct": 0.0,
        "grn_pct": 0.56,
        "ppc_pct": 0.8
      }
    },
    {
      "riding_id": "46012",
      "name_en": "Winnipeg South",
      "name_fr": "Winnipeg-Sud",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 37.15,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 63.65,
          "con": 26.5,
          "ndp": 7.4,
          "bq": 0.0,
          "grn": 1.99,
          "ppc": 1.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 23.76,
        "turnout_pct": 72.21,
        "lib_pct": 58.59,
        "con_pct": 34.83,
        "ndp_pct": 4.53,
        "bq_pct": 0.0,
        "grn_pct": 0.5,
        "ppc_pct": 0.83
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 23.76,
        "turnout_pct": 72.21,
        "lib_pct": 58.59,
        "con_pct": 34.83,
        "ndp_pct": 4.53,
        "bq_pct": 0.0,
        "grn_pct": 0.5,
        "ppc_pct": 0.83
      }
    },
    {
      "riding_id": "46013",
      "name_en": "Winnipeg South Centre",
      "name_fr": "Winnipeg-Centre-Sud",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 49.08,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 68.33,
          "con": 19.25,
          "ndp": 9.35,
          "bq": 0.0,
          "grn": 2.33,
          "ppc": 1.33
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 35.69,
        "turnout_pct": 74.81,
        "lib_pct": 63.27,
        "con_pct": 27.58,
        "ndp_pct": 6.48,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.51
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 35.69,
        "turnout_pct": 74.81,
        "lib_pct": 63.27,
        "con_pct": 27.58,
        "ndp_pct": 6.48,
        "bq_pct": 0.0,
        "grn_pct": 0.84,
        "ppc_pct": 0.51
      }
    },
    {
      "riding_id": "46014",
      "name_en": "Winnipeg West",
      "name_fr": "Winnipeg-Ouest",
      "province": "MB",
      "region": "winnipeg",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 27.02,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 59.21,
          "con": 32.19,
          "ndp": 6.84,
          "bq": 0.0,
          "grn": 2.27,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 13.62,
        "turnout_pct": 75.49,
        "lib_pct": 54.15,
        "con_pct": 40.52,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.78,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 13.62,
        "turnout_pct": 75.49,
        "lib_pct": 54.15,
        "con_pct": 40.52,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.78,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47001",
      "name_en": "Battlefords--Lloydminster--Meadow Lake",
      "name_fr": "Battlefords--Lloydminster--Meadow Lake",
      "province": "SK",
      "region": "sk_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 45.59,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 20.47,
          "con": 66.05,
          "ndp": 6.44,
          "bq": 0.0,
          "grn": 1.52,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 56.62,
        "turnout_pct": 63.4,
        "lib_pct": 18.58,
        "con_pct": 75.2,
        "ndp_pct": 4.77,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 56.62,
        "turnout_pct": 63.4,
        "lib_pct": 18.58,
        "con_pct": 75.2,
        "ndp_pct": 4.77,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47002",
      "name_en": "Carlton Trail--Eagle Creek",
      "name_fr": "Sentier Carlton--Eagle Creek",
      "province": "SK",
      "region": "sk_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 48.97,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 18.8,
          "con": 67.76,
          "ndp": 7.19,
          "bq": 0.0,
          "grn": 1.52,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 60.0,
        "turnout_pct": 75.24,
        "lib_pct": 16.91,
        "con_pct": 76.91,
        "ndp_pct": 5.52,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 60.0,
        "turnout_pct": 75.24,
        "lib_pct": 16.91,
        "con_pct": 76.91,
        "ndp_pct": 5.52,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47003",
      "name_en": "Desnethé--Missinippi--Churchill River",
      "name_fr": "Desnethé--Missinippi--Rivière Churchill",
      "province": "SK",
      "region": "sk_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 50.23,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.34,
          "con": 16.09,
          "ndp": 10.99,
          "bq": 0.0,
          "grn": 1.52,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 39.21,
        "turnout_pct": 36.29,
        "lib_pct": 64.45,
        "con_pct": 25.24,
        "ndp_pct": 9.32,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 39.21,
        "turnout_pct": 36.29,
        "lib_pct": 64.45,
        "con_pct": 25.24,
        "ndp_pct": 9.32,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47004",
      "name_en": "Moose Jaw--Lake Centre--Lanigan",
      "name_fr": "Moose Jaw--Lake Centre--Lanigan",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 43.87,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 18.5,
          "con": 62.36,
          "ndp": 9.16,
          "bq": 0.0,
          "grn": 2.41,
          "ppc": 3.73
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 54.9,
        "turnout_pct": 73.1,
        "lib_pct": 16.61,
        "con_pct": 71.51,
        "ndp_pct": 7.5,
        "bq_pct": 0.0,
        "grn_pct": 0.89,
        "ppc_pct": 2.94
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 54.9,
        "turnout_pct": 73.1,
        "lib_pct": 16.61,
        "con_pct": 71.51,
        "ndp_pct": 7.5,
        "bq_pct": 0.0,
        "grn_pct": 0.89,
        "ppc_pct": 2.94
      }
    },
    {
      "riding_id": "47005",
      "name_en": "Prince Albert",
      "name_fr": "Prince Albert",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 40.8,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 20.9,
          "con": 61.69,
          "ndp": 10.92,
          "bq": 0.0,
          "grn": 1.53,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 51.83,
        "turnout_pct": 61.69,
        "lib_pct": 19.01,
        "con_pct": 70.84,
        "ndp_pct": 9.26,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 51.83,
        "turnout_pct": 61.69,
        "lib_pct": 19.01,
        "con_pct": 70.84,
        "ndp_pct": 9.26,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47006",
      "name_en": "Regina--Lewvan",
      "name_fr": "Regina--Lewvan",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9411,
        "mean_margin": 5.12,
        "p_close_race": 0.5039,
        "vote_mean": {
          "lib": 47.43,
          "con": 42.46,
          "ndp": 8.3,
          "bq": 0.0,
          "grn": 2.11,
          "ppc": 1.37
        },
        "win_prob": {
          "lib": 0.9411,
          "con": 0.0589,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.99,
        "turnout_pct": 71.68,
        "lib_pct": 42.68,
        "con_pct": 49.67,
        "ndp_pct": 5.81,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 0.55
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.99,
        "turnout_pct": 71.68,
        "lib_pct": 42.68,
        "con_pct": 49.67,
        "ndp_pct": 5.81,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 0.55
      }
    },
    {
      "riding_id": "47007",
      "name_en": "Regina--Qu'Appelle",
      "name_fr": "Regina--Qu'Appelle",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 24.76,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 31.51,
          "con": 56.27,
          "ndp": 10.45,
          "bq": 0.0,
          "grn": 1.5,
          "ppc": 1.84
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 36.72,
        "turnout_pct": 65.17,
        "lib_pct": 26.76,
        "con_pct": 63.48,
        "ndp_pct": 7.96,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.04
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 36.72,
        "turnout_pct": 65.17,
        "lib_pct": 26.76,
        "con_pct": 63.48,
        "ndp_pct": 7.96,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.04
      }
    },
    {
      "riding_id": "47008",
      "name_en": "Regina--Wascana",
      "name_fr": "Regina--Wascana",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.962,
        "mean_margin": 5.7,
        "p_close_race": 0.4242,
        "vote_mean": {
          "lib": 48.14,
          "con": 42.53,
          "ndp": 7.31,
          "bq": 0.0,
          "grn": 2.15,
          "ppc": 1.54
        },
        "win_prob": {
          "lib": 0.962,
          "con": 0.038,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.36,
        "turnout_pct": 69.94,
        "lib_pct": 43.39,
        "con_pct": 49.74,
        "ndp_pct": 4.82,
        "bq_pct": 0.0,
        "grn_pct": 0.65,
        "ppc_pct": 0.73
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.36,
        "turnout_pct": 69.94,
        "lib_pct": 43.39,
        "con_pct": 49.74,
        "ndp_pct": 4.82,
        "bq_pct": 0.0,
        "grn_pct": 0.65,
        "ppc_pct": 0.73
      }
    },
    {
      "riding_id": "47009",
      "name_en": "Saskatoon South",
      "name_fr": "Saskatoon-Sud",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8399,
        "mean_margin": 3.69,
        "p_close_race": 0.7125,
        "vote_mean": {
          "lib": 44.83,
          "con": 41.66,
          "ndp": 11.49,
          "bq": 0.0,
          "grn": 2.12,
          "ppc": 1.43
        },
        "win_prob": {
          "lib": 0.8399,
          "con": 0.1601,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 8.79,
        "turnout_pct": 72.41,
        "lib_pct": 40.08,
        "con_pct": 48.87,
        "ndp_pct": 9.0,
        "bq_pct": 0.0,
        "grn_pct": 0.62,
        "ppc_pct": 0.61
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 8.79,
        "turnout_pct": 72.41,
        "lib_pct": 40.08,
        "con_pct": 48.87,
        "ndp_pct": 9.0,
        "bq_pct": 0.0,
        "grn_pct": 0.62,
        "ppc_pct": 0.61
      }
    },
    {
      "riding_id": "47010",
      "name_en": "Saskatoon--University",
      "name_fr": "Saskatoon--University",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9228,
        "mean_margin": 4.73,
        "p_close_race": 0.5579,
        "vote_mean": {
          "lib": 45.84,
          "con": 41.33,
          "ndp": 10.94,
          "bq": 0.0,
          "grn": 2.05,
          "ppc": 1.49
        },
        "win_prob": {
          "lib": 0.9228,
          "con": 0.0772,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.45,
        "turnout_pct": 72.74,
        "lib_pct": 41.09,
        "con_pct": 48.54,
        "ndp_pct": 8.45,
        "bq_pct": 0.0,
        "grn_pct": 0.55,
        "ppc_pct": 0.68
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.45,
        "turnout_pct": 72.74,
        "lib_pct": 41.09,
        "con_pct": 48.54,
        "ndp_pct": 8.45,
        "bq_pct": 0.0,
        "grn_pct": 0.55,
        "ppc_pct": 0.68
      }
    },
    {
      "riding_id": "47011",
      "name_en": "Saskatoon West",
      "name_fr": "Saskatoon-Ouest",
      "province": "SK",
      "region": "sk_urban",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 13.18,
        "p_close_race": 0.0042,
        "vote_mean": {
          "lib": 31.72,
          "con": 44.9,
          "ndp": 21.39,
          "bq": 0.0,
          "grn": 2.49,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 25.14,
        "turnout_pct": 59.09,
        "lib_pct": 26.97,
        "con_pct": 52.11,
        "ndp_pct": 18.9,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 25.14,
        "turnout_pct": 59.09,
        "lib_pct": 26.97,
        "con_pct": 52.11,
        "ndp_pct": 18.9,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47012",
      "name_en": "Souris--Moose Mountain",
      "name_fr": "Souris--Moose Mountain",
      "province": "SK",
      "region": "sk_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 62.76,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 11.61,
          "con": 74.36,
          "ndp": 6.2,
          "bq": 0.0,
          "grn": 2.07,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 73.78,
        "turnout_pct": 74.18,
        "lib_pct": 9.72,
        "con_pct": 83.51,
        "ndp_pct": 4.53,
        "bq_pct": 0.0,
        "grn_pct": 0.56,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 73.78,
        "turnout_pct": 74.18,
        "lib_pct": 9.72,
        "con_pct": 83.51,
        "ndp_pct": 4.53,
        "bq_pct": 0.0,
        "grn_pct": 0.56,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47013",
      "name_en": "Swift Current--Grasslands--Kindersley",
      "name_fr": "Swift Current--Grasslands--Kindersley",
      "province": "SK",
      "region": "sk_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 59.25,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 13.03,
          "con": 72.27,
          "ndp": 7.34,
          "bq": 0.0,
          "grn": 1.52,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 70.28,
        "turnout_pct": 70.7,
        "lib_pct": 11.14,
        "con_pct": 81.42,
        "ndp_pct": 5.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 70.28,
        "turnout_pct": 70.7,
        "lib_pct": 11.14,
        "con_pct": 81.42,
        "ndp_pct": 5.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "47014",
      "name_en": "Yorkton--Melville",
      "name_fr": "Yorkton--Melville",
      "province": "SK",
      "region": "sk_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 51.63,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 16.21,
          "con": 67.83,
          "ndp": 7.13,
          "bq": 0.0,
          "grn": 3.42,
          "ppc": 0.89
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 62.66,
        "turnout_pct": 65.98,
        "lib_pct": 14.32,
        "con_pct": 76.98,
        "ndp_pct": 5.46,
        "bq_pct": 0.0,
        "grn_pct": 1.91,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 62.66,
        "turnout_pct": 65.98,
        "lib_pct": 14.32,
        "con_pct": 76.98,
        "ndp_pct": 5.46,
        "bq_pct": 0.0,
        "grn_pct": 1.91,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48001",
      "name_en": "Airdrie--Cochrane",
      "name_fr": "Airdrie--Cochrane",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 32.16,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 28.74,
          "con": 60.9,
          "ndp": 5.82,
          "bq": 0.0,
          "grn": 1.85,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 47.23,
        "turnout_pct": 74.69,
        "lib_pct": 23.54,
        "con_pct": 70.76,
        "ndp_pct": 3.65,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 47.23,
        "turnout_pct": 74.69,
        "lib_pct": 23.54,
        "con_pct": 70.76,
        "ndp_pct": 3.65,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48002",
      "name_en": "Battle River--Crowfoot",
      "name_fr": "Battle River--Crowfoot",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 56.72,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 14.18,
          "con": 70.9,
          "ndp": 4.8,
          "bq": 0.0,
          "grn": 2.61,
          "ppc": 3.41
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 70.74,
        "turnout_pct": 74.45,
        "lib_pct": 11.6,
        "con_pct": 82.34,
        "ndp_pct": 3.16,
        "bq_pct": 0.0,
        "grn_pct": 0.73,
        "ppc_pct": 1.57
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 70.74,
        "turnout_pct": 74.45,
        "lib_pct": 11.6,
        "con_pct": 82.34,
        "ndp_pct": 3.16,
        "bq_pct": 0.0,
        "grn_pct": 0.73,
        "ppc_pct": 1.57
      }
    },
    {
      "riding_id": "48003",
      "name_en": "Bow River",
      "name_fr": "Bow River",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 47.52,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 19.37,
          "con": 66.89,
          "ndp": 4.61,
          "bq": 0.0,
          "grn": 1.88,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 61.54,
        "turnout_pct": 66.55,
        "lib_pct": 16.79,
        "con_pct": 78.33,
        "ndp_pct": 2.97,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 61.54,
        "turnout_pct": 66.55,
        "lib_pct": 16.79,
        "con_pct": 78.33,
        "ndp_pct": 2.97,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48004",
      "name_en": "Calgary Centre",
      "name_fr": "Calgary-Centre",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9997,
        "mean_margin": 11.12,
        "p_close_race": 0.0308,
        "vote_mean": {
          "lib": 52.01,
          "con": 40.89,
          "ndp": 5.08,
          "bq": 0.0,
          "grn": 2.41,
          "ppc": 2.42
        },
        "win_prob": {
          "lib": 0.9997,
          "con": 0.0003,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 4.39,
        "turnout_pct": 68.61,
        "lib_pct": 45.51,
        "con_pct": 49.9,
        "ndp_pct": 2.63,
        "bq_pct": 0.0,
        "grn_pct": 0.57,
        "ppc_pct": 0.58
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 4.39,
        "turnout_pct": 68.61,
        "lib_pct": 45.51,
        "con_pct": 49.9,
        "ndp_pct": 2.63,
        "bq_pct": 0.0,
        "grn_pct": 0.57,
        "ppc_pct": 0.58
      }
    },
    {
      "riding_id": "48005",
      "name_en": "Calgary Confederation",
      "name_fr": "Calgary Confederation",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 17.35,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.27,
          "con": 36.92,
          "ndp": 6.55,
          "bq": 0.0,
          "grn": 2.42,
          "ppc": 2.28
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 1.84,
        "turnout_pct": 74.48,
        "lib_pct": 47.77,
        "con_pct": 45.93,
        "ndp_pct": 4.1,
        "bq_pct": 0.0,
        "grn_pct": 0.58,
        "ppc_pct": 0.44
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 1.84,
        "turnout_pct": 74.48,
        "lib_pct": 47.77,
        "con_pct": 45.93,
        "ndp_pct": 4.1,
        "bq_pct": 0.0,
        "grn_pct": 0.58,
        "ppc_pct": 0.44
      }
    },
    {
      "riding_id": "48006",
      "name_en": "Calgary Crowfoot",
      "name_fr": "Calgary Crowfoot",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 0.9625,
        "mean_margin": 5.94,
        "p_close_race": 0.3976,
        "vote_mean": {
          "lib": 43.67,
          "con": 49.52,
          "ndp": 5.0,
          "bq": 0.0,
          "grn": 2.35,
          "ppc": 2.37
        },
        "win_prob": {
          "lib": 0.0375,
          "con": 0.9625,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 21.36,
        "turnout_pct": 73.94,
        "lib_pct": 37.17,
        "con_pct": 58.53,
        "ndp_pct": 2.55,
        "bq_pct": 0.0,
        "grn_pct": 0.51,
        "ppc_pct": 0.53
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 21.36,
        "turnout_pct": 73.94,
        "lib_pct": 37.17,
        "con_pct": 58.53,
        "ndp_pct": 2.55,
        "bq_pct": 0.0,
        "grn_pct": 0.51,
        "ppc_pct": 0.53
      }
    },
    {
      "riding_id": "48007",
      "name_en": "Calgary East",
      "name_fr": "Calgary-Est",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 12.99,
        "p_close_race": 0.0068,
        "vote_mean": {
          "lib": 38.01,
          "con": 51.0,
          "ndp": 6.31,
          "bq": 0.0,
          "grn": 3.07,
          "ppc": 3.52
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 28.49,
        "turnout_pct": 60.16,
        "lib_pct": 31.51,
        "con_pct": 60.01,
        "ndp_pct": 3.86,
        "bq_pct": 0.0,
        "grn_pct": 1.23,
        "ppc_pct": 1.68
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 28.49,
        "turnout_pct": 60.16,
        "lib_pct": 31.51,
        "con_pct": 60.01,
        "ndp_pct": 3.86,
        "bq_pct": 0.0,
        "grn_pct": 1.23,
        "ppc_pct": 1.68
      }
    },
    {
      "riding_id": "48008",
      "name_en": "Calgary Heritage",
      "name_fr": "Calgary Heritage",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 0.9998,
        "mean_margin": 11.23,
        "p_close_race": 0.0286,
        "vote_mean": {
          "lib": 40.88,
          "con": 52.11,
          "ndp": 4.91,
          "bq": 0.0,
          "grn": 2.56,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.0002,
          "con": 0.9998,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 26.74,
        "turnout_pct": 73.64,
        "lib_pct": 34.38,
        "con_pct": 61.12,
        "ndp_pct": 2.46,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 26.74,
        "turnout_pct": 73.64,
        "lib_pct": 34.38,
        "con_pct": 61.12,
        "ndp_pct": 2.46,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48009",
      "name_en": "Calgary McKnight",
      "name_fr": "Calgary McKnight",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.45,
        "p_close_race": 0.0108,
        "vote_mean": {
          "lib": 51.85,
          "con": 39.4,
          "ndp": 5.24,
          "bq": 0.0,
          "grn": 2.47,
          "ppc": 2.59
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 3.06,
        "turnout_pct": 56.52,
        "lib_pct": 45.35,
        "con_pct": 48.41,
        "ndp_pct": 2.79,
        "bq_pct": 0.0,
        "grn_pct": 0.63,
        "ppc_pct": 0.75
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 3.06,
        "turnout_pct": 56.52,
        "lib_pct": 45.35,
        "con_pct": 48.41,
        "ndp_pct": 2.79,
        "bq_pct": 0.0,
        "grn_pct": 0.63,
        "ppc_pct": 0.75
      }
    },
    {
      "riding_id": "48010",
      "name_en": "Calgary Midnapore",
      "name_fr": "Calgary Midnapore",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 19.91,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 36.27,
          "con": 56.18,
          "ndp": 5.53,
          "bq": 0.0,
          "grn": 2.51,
          "ppc": 2.59
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 35.42,
        "turnout_pct": 73.53,
        "lib_pct": 29.77,
        "con_pct": 65.19,
        "ndp_pct": 3.08,
        "bq_pct": 0.0,
        "grn_pct": 0.67,
        "ppc_pct": 0.75
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 35.42,
        "turnout_pct": 73.53,
        "lib_pct": 29.77,
        "con_pct": 65.19,
        "ndp_pct": 3.08,
        "bq_pct": 0.0,
        "grn_pct": 0.67,
        "ppc_pct": 0.75
      }
    },
    {
      "riding_id": "48011",
      "name_en": "Calgary Nose Hill",
      "name_fr": "Calgary Nose Hill",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 0.9908,
        "mean_margin": 7.65,
        "p_close_race": 0.2119,
        "vote_mean": {
          "lib": 42.49,
          "con": 50.12,
          "ndp": 5.64,
          "bq": 0.0,
          "grn": 2.53,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.0092,
          "con": 0.9908,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 23.14,
        "turnout_pct": 69.21,
        "lib_pct": 35.99,
        "con_pct": 59.13,
        "ndp_pct": 3.19,
        "bq_pct": 0.0,
        "grn_pct": 0.69,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 23.14,
        "turnout_pct": 69.21,
        "lib_pct": 35.99,
        "con_pct": 59.13,
        "ndp_pct": 3.19,
        "bq_pct": 0.0,
        "grn_pct": 0.69,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48012",
      "name_en": "Calgary Shepard",
      "name_fr": "Calgary Shepard",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 24.07,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 34.61,
          "con": 58.68,
          "ndp": 5.17,
          "bq": 0.0,
          "grn": 2.3,
          "ppc": 2.42
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 39.58,
        "turnout_pct": 71.97,
        "lib_pct": 28.11,
        "con_pct": 67.69,
        "ndp_pct": 2.72,
        "bq_pct": 0.0,
        "grn_pct": 0.46,
        "ppc_pct": 0.58
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 39.58,
        "turnout_pct": 71.97,
        "lib_pct": 28.11,
        "con_pct": 67.69,
        "ndp_pct": 2.72,
        "bq_pct": 0.0,
        "grn_pct": 0.46,
        "ppc_pct": 0.58
      }
    },
    {
      "riding_id": "48013",
      "name_en": "Calgary Signal Hill",
      "name_fr": "Calgary Signal Hill",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 0.9941,
        "mean_margin": 8.15,
        "p_close_race": 0.17,
        "vote_mean": {
          "lib": 42.67,
          "con": 50.81,
          "ndp": 4.83,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 2.55
        },
        "win_prob": {
          "lib": 0.0059,
          "con": 0.9941,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 23.65,
        "turnout_pct": 74.25,
        "lib_pct": 36.17,
        "con_pct": 59.82,
        "ndp_pct": 2.38,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.71
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 23.65,
        "turnout_pct": 74.25,
        "lib_pct": 36.17,
        "con_pct": 59.82,
        "ndp_pct": 2.38,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.71
      }
    },
    {
      "riding_id": "48014",
      "name_en": "Calgary Skyview",
      "name_fr": "Calgary Skyview",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 0.7519,
        "mean_margin": 3.21,
        "p_close_race": 0.7858,
        "vote_mean": {
          "lib": 43.8,
          "con": 46.04,
          "ndp": 5.12,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.2481,
          "con": 0.7519,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 17.75,
        "turnout_pct": 61.52,
        "lib_pct": 37.3,
        "con_pct": 55.05,
        "ndp_pct": 2.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 17.75,
        "turnout_pct": 61.52,
        "lib_pct": 37.3,
        "con_pct": 55.05,
        "ndp_pct": 2.67,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48015",
      "name_en": "Edmonton Centre",
      "name_fr": "Edmonton-Centre",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 21.9,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 50.47,
          "con": 28.57,
          "ndp": 17.82,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 2.69
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 6.4,
        "turnout_pct": 63.06,
        "lib_pct": 43.96,
        "con_pct": 37.57,
        "ndp_pct": 15.37,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.85
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 6.4,
        "turnout_pct": 63.06,
        "lib_pct": 43.96,
        "con_pct": 37.57,
        "ndp_pct": 15.37,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.85
      }
    },
    {
      "riding_id": "48016",
      "name_en": "Edmonton Gateway",
      "name_fr": "Edmonton Gateway",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.7297,
        "mean_margin": 3.08,
        "p_close_race": 0.8038,
        "vote_mean": {
          "lib": 43.65,
          "con": 41.64,
          "ndp": 7.41,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 2.75
        },
        "win_prob": {
          "lib": 0.7297,
          "con": 0.2703,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 13.21,
        "turnout_pct": 68.06,
        "lib_pct": 37.14,
        "con_pct": 50.64,
        "ndp_pct": 4.96,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.91
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 13.21,
        "turnout_pct": 68.06,
        "lib_pct": 37.14,
        "con_pct": 50.64,
        "ndp_pct": 4.96,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.91
      }
    },
    {
      "riding_id": "48017",
      "name_en": "Edmonton Griesbach",
      "name_fr": "Edmonton Griesbach",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "ndp",
        "p_winner": 0.5422,
        "mean_margin": 1.91,
        "p_close_race": 0.9657,
        "vote_mean": {
          "lib": 24.67,
          "con": 36.04,
          "ndp": 36.28,
          "bq": 0.0,
          "grn": 2.45,
          "ppc": 2.48
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.4578,
          "ndp": 0.5422,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 11.21,
        "turnout_pct": 56.75,
        "lib_pct": 18.16,
        "con_pct": 45.04,
        "ndp_pct": 33.83,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 0.64
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 11.21,
        "turnout_pct": 56.75,
        "lib_pct": 18.16,
        "con_pct": 45.04,
        "ndp_pct": 33.83,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 0.64
      }
    },
    {
      "riding_id": "48018",
      "name_en": "Edmonton Manning",
      "name_fr": "Edmonton Manning",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "con",
        "p_winner": 0.7359,
        "mean_margin": 3.11,
        "p_close_race": 0.7999,
        "vote_mean": {
          "lib": 41.5,
          "con": 43.56,
          "ndp": 12.26,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 3.48
        },
        "win_prob": {
          "lib": 0.2641,
          "con": 0.7359,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 17.57,
        "turnout_pct": 61.18,
        "lib_pct": 34.99,
        "con_pct": 52.56,
        "ndp_pct": 9.81,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.64
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 17.57,
        "turnout_pct": 61.18,
        "lib_pct": 34.99,
        "con_pct": 52.56,
        "ndp_pct": 9.81,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.64
      }
    },
    {
      "riding_id": "48019",
      "name_en": "Edmonton Northwest",
      "name_fr": "Edmonton-Nord-Ouest",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.552,
        "mean_margin": 2.63,
        "p_close_race": 0.8698,
        "vote_mean": {
          "lib": 44.53,
          "con": 44.1,
          "ndp": 8.99,
          "bq": 0.0,
          "grn": 2.45,
          "ppc": 2.92
        },
        "win_prob": {
          "lib": 0.552,
          "con": 0.448,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 15.07,
        "turnout_pct": 64.39,
        "lib_pct": 38.02,
        "con_pct": 53.1,
        "ndp_pct": 6.54,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 1.08
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 15.07,
        "turnout_pct": 64.39,
        "lib_pct": 38.02,
        "con_pct": 53.1,
        "ndp_pct": 6.54,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 1.08
      }
    },
    {
      "riding_id": "48020",
      "name_en": "Edmonton Riverbend",
      "name_fr": "Edmonton Riverbend",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9992,
        "mean_margin": 10.14,
        "p_close_race": 0.0572,
        "vote_mean": {
          "lib": 51.03,
          "con": 40.89,
          "ndp": 6.66,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 2.51
        },
        "win_prob": {
          "lib": 0.9992,
          "con": 0.0008,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 5.37,
        "turnout_pct": 70.43,
        "lib_pct": 44.52,
        "con_pct": 49.89,
        "ndp_pct": 4.21,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.67
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 5.37,
        "turnout_pct": 70.43,
        "lib_pct": 44.52,
        "con_pct": 49.89,
        "ndp_pct": 4.21,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.67
      }
    },
    {
      "riding_id": "48021",
      "name_en": "Edmonton Southeast",
      "name_fr": "Edmonton-Sud-Est",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.6791,
        "mean_margin": 2.89,
        "p_close_race": 0.8316,
        "vote_mean": {
          "lib": 44.92,
          "con": 43.39,
          "ndp": 7.72,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 3.67
        },
        "win_prob": {
          "lib": 0.6791,
          "con": 0.3209,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 13.98,
        "turnout_pct": 66.56,
        "lib_pct": 38.41,
        "con_pct": 52.39,
        "ndp_pct": 5.27,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.83
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 13.98,
        "turnout_pct": 66.56,
        "lib_pct": 38.41,
        "con_pct": 52.39,
        "ndp_pct": 5.27,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.83
      }
    },
    {
      "riding_id": "48022",
      "name_en": "Edmonton Strathcona",
      "name_fr": "Edmonton Strathcona",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "ndp",
        "p_winner": 1.0,
        "mean_margin": 23.67,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 24.34,
          "con": 23.92,
          "ndp": 49.12,
          "bq": 0.0,
          "grn": 2.45,
          "ppc": 2.48
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 1.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "ndp",
        "margin": 13.75,
        "turnout_pct": 72.0,
        "lib_pct": 17.83,
        "con_pct": 32.92,
        "ndp_pct": 46.67,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 0.64
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "ndp",
        "margin": 13.75,
        "turnout_pct": 72.0,
        "lib_pct": 17.83,
        "con_pct": 32.92,
        "ndp_pct": 46.67,
        "bq_pct": 0.0,
        "grn_pct": 0.61,
        "ppc_pct": 0.64
      }
    },
    {
      "riding_id": "48023",
      "name_en": "Edmonton West",
      "name_fr": "Edmonton-Ouest",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8487,
        "mean_margin": 3.88,
        "p_close_race": 0.6856,
        "vote_mean": {
          "lib": 46.92,
          "con": 43.55,
          "ndp": 7.78,
          "bq": 0.0,
          "grn": 1.84,
          "ppc": 2.74
        },
        "win_prob": {
          "lib": 0.8487,
          "con": 0.1513,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 12.14,
        "turnout_pct": 69.9,
        "lib_pct": 40.41,
        "con_pct": 52.55,
        "ndp_pct": 5.33,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.9
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 12.14,
        "turnout_pct": 69.9,
        "lib_pct": 40.41,
        "con_pct": 52.55,
        "ndp_pct": 5.33,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.9
      }
    },
    {
      "riding_id": "48024",
      "name_en": "Foothills",
      "name_fr": "Foothills",
      "province": "AB",
      "region": "calgary",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 42.98,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 21.56,
          "con": 64.54,
          "ndp": 4.3,
          "bq": 0.0,
          "grn": 2.69,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 57.0,
        "turnout_pct": 74.34,
        "lib_pct": 18.98,
        "con_pct": 75.98,
        "ndp_pct": 2.66,
        "bq_pct": 0.0,
        "grn_pct": 0.82,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 57.0,
        "turnout_pct": 74.34,
        "lib_pct": 18.98,
        "con_pct": 75.98,
        "ndp_pct": 2.66,
        "bq_pct": 0.0,
        "grn_pct": 0.82,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48025",
      "name_en": "Fort McMurray--Cold Lake",
      "name_fr": "Fort McMurray--Cold Lake",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 51.16,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 17.03,
          "con": 68.19,
          "ndp": 4.33,
          "bq": 0.0,
          "grn": 2.46,
          "ppc": 3.64
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 65.18,
        "turnout_pct": 61.99,
        "lib_pct": 14.45,
        "con_pct": 79.63,
        "ndp_pct": 2.69,
        "bq_pct": 0.0,
        "grn_pct": 0.58,
        "ppc_pct": 1.8
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 65.18,
        "turnout_pct": 61.99,
        "lib_pct": 14.45,
        "con_pct": 79.63,
        "ndp_pct": 2.69,
        "bq_pct": 0.0,
        "grn_pct": 0.58,
        "ppc_pct": 1.8
      }
    },
    {
      "riding_id": "48026",
      "name_en": "Grande Prairie",
      "name_fr": "Grande Prairie",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 55.4,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 14.35,
          "con": 69.75,
          "ndp": 5.81,
          "bq": 0.0,
          "grn": 1.88,
          "ppc": 3.24
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 69.42,
        "turnout_pct": 69.44,
        "lib_pct": 11.77,
        "con_pct": 81.19,
        "ndp_pct": 4.17,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.4
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 69.42,
        "turnout_pct": 69.44,
        "lib_pct": 11.77,
        "con_pct": 81.19,
        "ndp_pct": 4.17,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.4
      }
    },
    {
      "riding_id": "48027",
      "name_en": "Lakeland",
      "name_fr": "Lakeland",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 54.53,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 14.7,
          "con": 69.23,
          "ndp": 5.43,
          "bq": 0.0,
          "grn": 2.6,
          "ppc": 3.57
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 68.55,
        "turnout_pct": 69.64,
        "lib_pct": 12.12,
        "con_pct": 80.67,
        "ndp_pct": 3.79,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 1.73
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 68.55,
        "turnout_pct": 69.64,
        "lib_pct": 12.12,
        "con_pct": 80.67,
        "ndp_pct": 3.79,
        "bq_pct": 0.0,
        "grn_pct": 0.72,
        "ppc_pct": 1.73
      }
    },
    {
      "riding_id": "48028",
      "name_en": "Leduc--Wetaskiwin",
      "name_fr": "Leduc--Wetaskiwin",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 43.05,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 19.84,
          "con": 62.89,
          "ndp": 7.73,
          "bq": 0.0,
          "grn": 1.88,
          "ppc": 2.91
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 57.07,
        "turnout_pct": 71.44,
        "lib_pct": 17.26,
        "con_pct": 74.33,
        "ndp_pct": 6.09,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.07
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 57.07,
        "turnout_pct": 71.44,
        "lib_pct": 17.26,
        "con_pct": 74.33,
        "ndp_pct": 6.09,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.07
      }
    },
    {
      "riding_id": "48029",
      "name_en": "Lethbridge",
      "name_fr": "Lethbridge",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 14.21,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 35.18,
          "con": 49.39,
          "ndp": 5.26,
          "bq": 0.0,
          "grn": 2.56,
          "ppc": 2.55
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 28.23,
        "turnout_pct": 70.34,
        "lib_pct": 32.6,
        "con_pct": 60.83,
        "ndp_pct": 3.62,
        "bq_pct": 0.0,
        "grn_pct": 0.68,
        "ppc_pct": 0.71
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 28.23,
        "turnout_pct": 70.34,
        "lib_pct": 32.6,
        "con_pct": 60.83,
        "ndp_pct": 3.62,
        "bq_pct": 0.0,
        "grn_pct": 0.68,
        "ppc_pct": 0.71
      }
    },
    {
      "riding_id": "48030",
      "name_en": "Medicine Hat--Cardston--Warner",
      "name_fr": "Medicine Hat--Cardston--Warner",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 44.7,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 20.13,
          "con": 64.83,
          "ndp": 6.39,
          "bq": 0.0,
          "grn": 2.69,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 58.72,
        "turnout_pct": 67.45,
        "lib_pct": 17.55,
        "con_pct": 76.27,
        "ndp_pct": 4.75,
        "bq_pct": 0.0,
        "grn_pct": 0.81,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 58.72,
        "turnout_pct": 67.45,
        "lib_pct": 17.55,
        "con_pct": 76.27,
        "ndp_pct": 4.75,
        "bq_pct": 0.0,
        "grn_pct": 0.81,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48031",
      "name_en": "Parkland",
      "name_fr": "Parkland",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 43.01,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 20.33,
          "con": 63.34,
          "ndp": 5.76,
          "bq": 0.0,
          "grn": 2.51,
          "ppc": 3.33
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 57.03,
        "turnout_pct": 74.8,
        "lib_pct": 17.75,
        "con_pct": 74.78,
        "ndp_pct": 4.12,
        "bq_pct": 0.0,
        "grn_pct": 0.63,
        "ppc_pct": 1.49
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 57.03,
        "turnout_pct": 74.8,
        "lib_pct": 17.75,
        "con_pct": 74.78,
        "ndp_pct": 4.12,
        "bq_pct": 0.0,
        "grn_pct": 0.63,
        "ppc_pct": 1.49
      }
    },
    {
      "riding_id": "48032",
      "name_en": "Peace River--Westlock",
      "name_fr": "Peace River--Westlock",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 50.68,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 14.58,
          "con": 65.26,
          "ndp": 6.94,
          "bq": 0.0,
          "grn": 1.88,
          "ppc": 1.85
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 64.82,
        "turnout_pct": 64.96,
        "lib_pct": 12.0,
        "con_pct": 76.7,
        "ndp_pct": 5.3,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 64.82,
        "turnout_pct": 64.96,
        "lib_pct": 12.0,
        "con_pct": 76.7,
        "ndp_pct": 5.3,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "48033",
      "name_en": "Ponoka--Didsbury",
      "name_fr": "Ponoka--Didsbury",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 57.92,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 2.58,
          "con": 70.36,
          "ndp": 12.44,
          "bq": 0.0,
          "grn": 1.88,
          "ppc": 3.74
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 70.43,
        "turnout_pct": 75.13,
        "lib_pct": 0.0,
        "con_pct": 81.8,
        "ndp_pct": 10.8,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.9
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 70.43,
        "turnout_pct": 75.13,
        "lib_pct": 0.0,
        "con_pct": 81.8,
        "ndp_pct": 10.8,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.9
      }
    },
    {
      "riding_id": "48034",
      "name_en": "Red Deer",
      "name_fr": "Red Deer",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 35.35,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 24.41,
          "con": 59.76,
          "ndp": 5.46,
          "bq": 0.0,
          "grn": 2.87,
          "ppc": 3.15
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 49.37,
        "turnout_pct": 70.29,
        "lib_pct": 21.83,
        "con_pct": 71.2,
        "ndp_pct": 3.82,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 1.31
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 49.37,
        "turnout_pct": 70.29,
        "lib_pct": 21.83,
        "con_pct": 71.2,
        "ndp_pct": 3.82,
        "bq_pct": 0.0,
        "grn_pct": 0.99,
        "ppc_pct": 1.31
      }
    },
    {
      "riding_id": "48035",
      "name_en": "Sherwood Park--Fort Saskatchewan",
      "name_fr": "Sherwood Park--Fort Saskatchewan",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 24.99,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 29.65,
          "con": 54.64,
          "ndp": 6.68,
          "bq": 0.0,
          "grn": 2.42,
          "ppc": 2.45
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 39.0,
        "turnout_pct": 77.98,
        "lib_pct": 27.07,
        "con_pct": 66.07,
        "ndp_pct": 5.05,
        "bq_pct": 0.0,
        "grn_pct": 0.55,
        "ppc_pct": 0.61
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 39.0,
        "turnout_pct": 77.98,
        "lib_pct": 27.07,
        "con_pct": 66.07,
        "ndp_pct": 5.05,
        "bq_pct": 0.0,
        "grn_pct": 0.55,
        "ppc_pct": 0.61
      }
    },
    {
      "riding_id": "48036",
      "name_en": "St. Albert--Sturgeon River",
      "name_fr": "St. Albert--Sturgeon River",
      "province": "AB",
      "region": "edmonton",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 18.88,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 34.92,
          "con": 53.81,
          "ndp": 6.93,
          "bq": 0.0,
          "grn": 1.85,
          "ppc": 2.9
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 33.94,
        "turnout_pct": 76.8,
        "lib_pct": 29.72,
        "con_pct": 63.66,
        "ndp_pct": 4.77,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.06
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 33.94,
        "turnout_pct": 76.8,
        "lib_pct": 29.72,
        "con_pct": 63.66,
        "ndp_pct": 4.77,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.06
      }
    },
    {
      "riding_id": "48037",
      "name_en": "Yellowhead",
      "name_fr": "Yellowhead",
      "province": "AB",
      "region": "ab_rural",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 29.54,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 27.62,
          "con": 57.16,
          "ndp": 5.59,
          "bq": 0.0,
          "grn": 1.88,
          "ppc": 3.2
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 43.56,
        "turnout_pct": 74.15,
        "lib_pct": 25.04,
        "con_pct": 68.6,
        "ndp_pct": 3.95,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.36
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 43.56,
        "turnout_pct": 74.15,
        "lib_pct": 25.04,
        "con_pct": 68.6,
        "ndp_pct": 3.95,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 1.36
      }
    },
    {
      "riding_id": "59001",
      "name_en": "Abbotsford--South Langley",
      "name_fr": "Abbotsford--Langley-Sud",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 0.5929,
        "mean_margin": 2.02,
        "p_close_race": 0.9532,
        "vote_mean": {
          "lib": 37.22,
          "con": 37.81,
          "ndp": 4.84,
          "bq": 0.0,
          "grn": 1.59,
          "ppc": 1.3
        },
        "win_prob": {
          "lib": 0.4071,
          "con": 0.5929,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 9.12,
        "turnout_pct": 66.74,
        "lib_pct": 33.89,
        "con_pct": 43.09,
        "ndp_pct": 3.76,
        "bq_pct": 0.0,
        "grn_pct": 1.03,
        "ppc_pct": 0.82
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 9.12,
        "turnout_pct": 66.74,
        "lib_pct": 33.89,
        "con_pct": 43.09,
        "ndp_pct": 3.76,
        "bq_pct": 0.0,
        "grn_pct": 1.03,
        "ppc_pct": 0.82
      }
    },
    {
      "riding_id": "59002",
      "name_en": "Burnaby Central",
      "name_fr": "Burnaby Central",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 13.63,
        "p_close_race": 0.0004,
        "vote_mean": {
          "lib": 46.22,
          "con": 32.59,
          "ndp": 19.48,
          "bq": 0.0,
          "grn": 0.65,
          "ppc": 1.44
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 3.57,
        "turnout_pct": 61.27,
        "lib_pct": 41.88,
        "con_pct": 38.3,
        "ndp_pct": 18.01,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.97
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 3.57,
        "turnout_pct": 61.27,
        "lib_pct": 41.88,
        "con_pct": 38.3,
        "ndp_pct": 18.01,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.97
      }
    },
    {
      "riding_id": "59003",
      "name_en": "Burnaby North--Seymour",
      "name_fr": "Burnaby-Nord--Seymour",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 35.0,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 63.02,
          "con": 28.02,
          "ndp": 7.86,
          "bq": 0.0,
          "grn": 0.65,
          "ppc": 1.07
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 24.95,
        "turnout_pct": 71.68,
        "lib_pct": 58.68,
        "con_pct": 33.73,
        "ndp_pct": 6.39,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.57
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 24.95,
        "turnout_pct": 71.68,
        "lib_pct": 58.68,
        "con_pct": 33.73,
        "ndp_pct": 6.39,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.57
      }
    },
    {
      "riding_id": "59004",
      "name_en": "Cariboo--Prince George",
      "name_fr": "Cariboo--Prince George",
      "province": "BC",
      "region": "bc_north",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 22.83,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 31.79,
          "con": 54.62,
          "ndp": 6.77,
          "bq": 0.0,
          "grn": 2.37,
          "ppc": 1.19
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 29.75,
        "turnout_pct": 68.03,
        "lib_pct": 30.23,
        "con_pct": 59.98,
        "ndp_pct": 6.13,
        "bq_pct": 0.0,
        "grn_pct": 1.81,
        "ppc_pct": 0.69
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 29.75,
        "turnout_pct": 68.03,
        "lib_pct": 30.23,
        "con_pct": 59.98,
        "ndp_pct": 6.13,
        "bq_pct": 0.0,
        "grn_pct": 1.81,
        "ppc_pct": 0.69
      }
    },
    {
      "riding_id": "59005",
      "name_en": "Chilliwack--Hope",
      "name_fr": "Chilliwack--Hope",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 11.78,
        "p_close_race": 0.0012,
        "vote_mean": {
          "lib": 37.98,
          "con": 49.76,
          "ndp": 8.04,
          "bq": 0.0,
          "grn": 2.19,
          "ppc": 1.21
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 19.34,
        "turnout_pct": 67.83,
        "lib_pct": 35.2,
        "con_pct": 54.54,
        "ndp_pct": 7.23,
        "bq_pct": 0.0,
        "grn_pct": 1.64,
        "ppc_pct": 0.73
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 19.34,
        "turnout_pct": 67.83,
        "lib_pct": 35.2,
        "con_pct": 54.54,
        "ndp_pct": 7.23,
        "bq_pct": 0.0,
        "grn_pct": 1.64,
        "ppc_pct": 0.73
      }
    },
    {
      "riding_id": "59006",
      "name_en": "Cloverdale--Langley City",
      "name_fr": "Cloverdale--Langley City",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9981,
        "mean_margin": 7.17,
        "p_close_race": 0.1898,
        "vote_mean": {
          "lib": 49.38,
          "con": 42.21,
          "ndp": 5.44,
          "bq": 0.0,
          "grn": 1.47,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 0.9981,
          "con": 0.0019,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 1.44,
        "turnout_pct": 64.75,
        "lib_pct": 46.05,
        "con_pct": 47.49,
        "ndp_pct": 4.36,
        "bq_pct": 0.0,
        "grn_pct": 0.91,
        "ppc_pct": 0.54
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 1.44,
        "turnout_pct": 64.75,
        "lib_pct": 46.05,
        "con_pct": 47.49,
        "ndp_pct": 4.36,
        "bq_pct": 0.0,
        "grn_pct": 0.91,
        "ppc_pct": 0.54
      }
    },
    {
      "riding_id": "59007",
      "name_en": "Columbia--Kootenay--Southern Rockies",
      "name_fr": "Columbia--Kootenay--Southern Rockies",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 15.21,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 29.65,
          "con": 44.86,
          "ndp": 18.56,
          "bq": 0.0,
          "grn": 2.04,
          "ppc": 1.17
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 22.12,
        "turnout_pct": 73.3,
        "lib_pct": 28.09,
        "con_pct": 50.21,
        "ndp_pct": 17.91,
        "bq_pct": 0.0,
        "grn_pct": 1.48,
        "ppc_pct": 0.68
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 22.12,
        "turnout_pct": 73.3,
        "lib_pct": 28.09,
        "con_pct": 50.21,
        "ndp_pct": 17.91,
        "bq_pct": 0.0,
        "grn_pct": 1.48,
        "ppc_pct": 0.68
      }
    },
    {
      "riding_id": "59008",
      "name_en": "Coquitlam--Port Coquitlam",
      "name_fr": "Coquitlam--Port Coquitlam",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.41,
        "p_close_race": 0.0001,
        "vote_mean": {
          "lib": 51.48,
          "con": 37.07,
          "ndp": 8.83,
          "bq": 0.0,
          "grn": 1.43,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 4.36,
        "turnout_pct": 69.42,
        "lib_pct": 47.14,
        "con_pct": 42.78,
        "ndp_pct": 7.36,
        "bq_pct": 0.0,
        "grn_pct": 0.87,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 4.36,
        "turnout_pct": 69.42,
        "lib_pct": 47.14,
        "con_pct": 42.78,
        "ndp_pct": 7.36,
        "bq_pct": 0.0,
        "grn_pct": 0.87,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59009",
      "name_en": "Courtenay--Alberni",
      "name_fr": "Courtenay--Alberni",
      "province": "BC",
      "region": "bc_island",
      "urban_rural": "mixed",
      "projection": {
        "winner": "ndp",
        "p_winner": 1.0,
        "mean_margin": 10.04,
        "p_close_race": 0.0129,
        "vote_mean": {
          "lib": 25.34,
          "con": 30.2,
          "ndp": 40.26,
          "bq": 0.0,
          "grn": 2.24,
          "ppc": 1.04
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.0,
          "ndp": 1.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "ndp",
        "margin": 4.48,
        "turnout_pct": 73.89,
        "lib_pct": 22.56,
        "con_pct": 34.98,
        "ndp_pct": 39.46,
        "bq_pct": 0.0,
        "grn_pct": 1.69,
        "ppc_pct": 0.53
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "ndp",
        "margin": 4.48,
        "turnout_pct": 73.89,
        "lib_pct": 22.56,
        "con_pct": 34.98,
        "ndp_pct": 39.46,
        "bq_pct": 0.0,
        "grn_pct": 1.69,
        "ppc_pct": 0.53
      }
    },
    {
      "riding_id": "59010",
      "name_en": "Cowichan--Malahat--Langford",
      "name_fr": "Cowichan--Malahat--Langford",
      "province": "BC",
      "region": "bc_island",
      "urban_rural": "mixed",
      "projection": {
        "winner": "ndp",
        "p_winner": 0.6251,
        "mean_margin": 1.6,
        "p_close_race": 0.989,
        "vote_mean": {
          "lib": 30.84,
          "con": 32.29,
          "ndp": 33.24,
          "bq": 0.0,
          "grn": 2.51,
          "ppc": 0.64
        },
        "win_prob": {
          "lib": 0.0491,
          "con": 0.3258,
          "ndp": 0.6251,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 4.63,
        "turnout_pct": 72.41,
        "lib_pct": 28.06,
        "con_pct": 37.07,
        "ndp_pct": 32.44,
        "bq_pct": 0.0,
        "grn_pct": 1.96,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 4.63,
        "turnout_pct": 72.41,
        "lib_pct": 28.06,
        "con_pct": 37.07,
        "ndp_pct": 32.44,
        "bq_pct": 0.0,
        "grn_pct": 1.96,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59011",
      "name_en": "Delta",
      "name_fr": "Delta",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 18.68,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 55.89,
          "con": 37.21,
          "ndp": 5.85,
          "bq": 0.0,
          "grn": 0.65,
          "ppc": 1.11
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 8.62,
        "turnout_pct": 74.12,
        "lib_pct": 51.55,
        "con_pct": 42.92,
        "ndp_pct": 4.38,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.61
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 8.62,
        "turnout_pct": 74.12,
        "lib_pct": 51.55,
        "con_pct": 42.92,
        "ndp_pct": 4.38,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.61
      }
    },
    {
      "riding_id": "59012",
      "name_en": "Esquimalt--Saanich--Sooke",
      "name_fr": "Esquimalt--Saanich--Sooke",
      "province": "BC",
      "region": "bc_island",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 28.01,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 51.85,
          "con": 23.82,
          "ndp": 19.34,
          "bq": 0.0,
          "grn": 3.21,
          "ppc": 0.64
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 20.48,
        "turnout_pct": 74.18,
        "lib_pct": 49.07,
        "con_pct": 28.6,
        "ndp_pct": 18.54,
        "bq_pct": 0.0,
        "grn_pct": 2.66,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 20.48,
        "turnout_pct": 74.18,
        "lib_pct": 49.07,
        "con_pct": 28.6,
        "ndp_pct": 18.54,
        "bq_pct": 0.0,
        "grn_pct": 2.66,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59013",
      "name_en": "Fleetwood--Port Kells",
      "name_fr": "Fleetwood--Port Kells",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.31,
        "p_close_race": 0.0015,
        "vote_mean": {
          "lib": 50.84,
          "con": 38.53,
          "ndp": 6.98,
          "bq": 0.0,
          "grn": 1.5,
          "ppc": 1.48
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 3.7,
        "turnout_pct": 63.72,
        "lib_pct": 47.51,
        "con_pct": 43.81,
        "ndp_pct": 5.9,
        "bq_pct": 0.0,
        "grn_pct": 0.94,
        "ppc_pct": 1.02
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 3.7,
        "turnout_pct": 63.72,
        "lib_pct": 47.51,
        "con_pct": 43.81,
        "ndp_pct": 5.9,
        "bq_pct": 0.0,
        "grn_pct": 0.94,
        "ppc_pct": 1.02
      }
    },
    {
      "riding_id": "59014",
      "name_en": "Kamloops--Shuswap--Central Rockies",
      "name_fr": "Kamloops--Shuswap--Central Rockies",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.9932,
        "mean_margin": 5.65,
        "p_close_race": 0.3977,
        "vote_mean": {
          "lib": 41.58,
          "con": 47.22,
          "ndp": 6.27,
          "bq": 0.0,
          "grn": 2.95,
          "ppc": 1.35
        },
        "win_prob": {
          "lib": 0.0068,
          "con": 0.9932,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 13.2,
        "turnout_pct": 73.69,
        "lib_pct": 38.8,
        "con_pct": 52.0,
        "ndp_pct": 5.46,
        "bq_pct": 0.0,
        "grn_pct": 2.4,
        "ppc_pct": 0.88
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 13.2,
        "turnout_pct": 73.69,
        "lib_pct": 38.8,
        "con_pct": 52.0,
        "ndp_pct": 5.46,
        "bq_pct": 0.0,
        "grn_pct": 2.4,
        "ppc_pct": 0.88
      }
    },
    {
      "riding_id": "59015",
      "name_en": "Kamloops--Thompson--Nicola",
      "name_fr": "Kamloops--Thompson--Nicola",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.9412,
        "mean_margin": 3.84,
        "p_close_race": 0.7025,
        "vote_mean": {
          "lib": 42.77,
          "con": 46.5,
          "ndp": 6.71,
          "bq": 0.0,
          "grn": 2.05,
          "ppc": 1.3
        },
        "win_prob": {
          "lib": 0.0588,
          "con": 0.9412,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 11.29,
        "turnout_pct": 69.35,
        "lib_pct": 39.99,
        "con_pct": 51.28,
        "ndp_pct": 5.9,
        "bq_pct": 0.0,
        "grn_pct": 1.5,
        "ppc_pct": 0.83
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 11.29,
        "turnout_pct": 69.35,
        "lib_pct": 39.99,
        "con_pct": 51.28,
        "ndp_pct": 5.9,
        "bq_pct": 0.0,
        "grn_pct": 1.5,
        "ppc_pct": 0.83
      }
    },
    {
      "riding_id": "59016",
      "name_en": "Kelowna",
      "name_fr": "Kelowna",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 9.39,
        "p_close_race": 0.0339,
        "vote_mean": {
          "lib": 51.24,
          "con": 41.85,
          "ndp": 4.09,
          "bq": 0.0,
          "grn": 1.54,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 1.83,
        "turnout_pct": 70.2,
        "lib_pct": 48.46,
        "con_pct": 46.63,
        "ndp_pct": 3.28,
        "bq_pct": 0.0,
        "grn_pct": 0.98,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 1.83,
        "turnout_pct": 70.2,
        "lib_pct": 48.46,
        "con_pct": 46.63,
        "ndp_pct": 3.28,
        "bq_pct": 0.0,
        "grn_pct": 0.98,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59017",
      "name_en": "Langley Township--Fraser Heights",
      "name_fr": "Langley Township--Fraser Heights",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.5306,
        "mean_margin": 1.97,
        "p_close_race": 0.959,
        "vote_mean": {
          "lib": 45.97,
          "con": 45.78,
          "ndp": 5.05,
          "bq": 0.0,
          "grn": 1.31,
          "ppc": 0.98
        },
        "win_prob": {
          "lib": 0.5306,
          "con": 0.4694,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 8.43,
        "turnout_pct": 70.57,
        "lib_pct": 42.64,
        "con_pct": 51.06,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.75,
        "ppc_pct": 0.46
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 8.43,
        "turnout_pct": 70.57,
        "lib_pct": 42.64,
        "con_pct": 51.06,
        "ndp_pct": 3.97,
        "bq_pct": 0.0,
        "grn_pct": 0.75,
        "ppc_pct": 0.46
      }
    },
    {
      "riding_id": "59018",
      "name_en": "Mission--Matsqui--Abbotsford",
      "name_fr": "Mission--Matsqui--Abbotsford",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "suburban",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 11.33,
        "p_close_race": 0.0039,
        "vote_mean": {
          "lib": 39.76,
          "con": 51.09,
          "ndp": 5.66,
          "bq": 0.0,
          "grn": 1.76,
          "ppc": 1.31
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 19.94,
        "turnout_pct": 70.25,
        "lib_pct": 36.43,
        "con_pct": 56.37,
        "ndp_pct": 4.58,
        "bq_pct": 0.0,
        "grn_pct": 1.21,
        "ppc_pct": 0.84
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 19.94,
        "turnout_pct": 70.25,
        "lib_pct": 36.43,
        "con_pct": 56.37,
        "ndp_pct": 4.58,
        "bq_pct": 0.0,
        "grn_pct": 1.21,
        "ppc_pct": 0.84
      }
    },
    {
      "riding_id": "59019",
      "name_en": "Nanaimo--Ladysmith",
      "name_fr": "Nanaimo--Ladysmith",
      "province": "BC",
      "region": "bc_island",
      "urban_rural": "mixed",
      "projection": {
        "winner": "con",
        "p_winner": 0.5187,
        "mean_margin": 1.92,
        "p_close_race": 0.9655,
        "vote_mean": {
          "lib": 30.45,
          "con": 30.56,
          "ndp": 19.0,
          "bq": 0.0,
          "grn": 18.61,
          "ppc": 0.93
        },
        "win_prob": {
          "lib": 0.4813,
          "con": 0.5187,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.67,
        "turnout_pct": 72.58,
        "lib_pct": 27.67,
        "con_pct": 35.34,
        "ndp_pct": 18.2,
        "bq_pct": 0.0,
        "grn_pct": 18.06,
        "ppc_pct": 0.39
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.67,
        "turnout_pct": 72.58,
        "lib_pct": 27.67,
        "con_pct": 35.34,
        "ndp_pct": 18.2,
        "bq_pct": 0.0,
        "grn_pct": 18.06,
        "ppc_pct": 0.39
      }
    },
    {
      "riding_id": "59020",
      "name_en": "New Westminster--Burnaby--Maillardville",
      "name_fr": "New Westminster--Burnaby--Maillardville",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9976,
        "mean_margin": 6.4,
        "p_close_race": 0.2736,
        "vote_mean": {
          "lib": 39.22,
          "con": 25.53,
          "ndp": 32.83,
          "bq": 0.0,
          "grn": 1.78,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 0.9976,
          "con": 0.0,
          "ndp": 0.0024,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 3.52,
        "turnout_pct": 67.09,
        "lib_pct": 34.88,
        "con_pct": 31.24,
        "ndp_pct": 31.36,
        "bq_pct": 0.0,
        "grn_pct": 1.23,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 3.52,
        "turnout_pct": 67.09,
        "lib_pct": 34.88,
        "con_pct": 31.24,
        "ndp_pct": 31.36,
        "bq_pct": 0.0,
        "grn_pct": 1.23,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59021",
      "name_en": "North Island--Powell River",
      "name_fr": "North Island--Powell River",
      "province": "BC",
      "region": "bc_island",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.6009,
        "mean_margin": 1.85,
        "p_close_race": 0.9718,
        "vote_mean": {
          "lib": 28.9,
          "con": 33.82,
          "ndp": 33.24,
          "bq": 0.0,
          "grn": 2.4,
          "ppc": 0.95
        },
        "win_prob": {
          "lib": 0.0012,
          "con": 0.6009,
          "ndp": 0.3979,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.15,
        "turnout_pct": 73.84,
        "lib_pct": 26.12,
        "con_pct": 38.6,
        "ndp_pct": 32.44,
        "bq_pct": 0.0,
        "grn_pct": 1.85,
        "ppc_pct": 0.42
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.15,
        "turnout_pct": 73.84,
        "lib_pct": 26.12,
        "con_pct": 38.6,
        "ndp_pct": 32.44,
        "bq_pct": 0.0,
        "grn_pct": 1.85,
        "ppc_pct": 0.42
      }
    },
    {
      "riding_id": "59022",
      "name_en": "North Vancouver--Capilano",
      "name_fr": "North Vancouver--Capilano",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 36.04,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 63.8,
          "con": 27.76,
          "ndp": 5.68,
          "bq": 0.0,
          "grn": 2.24,
          "ppc": 0.93
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 25.99,
        "turnout_pct": 71.65,
        "lib_pct": 59.46,
        "con_pct": 33.47,
        "ndp_pct": 4.21,
        "bq_pct": 0.0,
        "grn_pct": 1.69,
        "ppc_pct": 0.4
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 25.99,
        "turnout_pct": 71.65,
        "lib_pct": 59.46,
        "con_pct": 33.47,
        "ndp_pct": 4.21,
        "bq_pct": 0.0,
        "grn_pct": 1.69,
        "ppc_pct": 0.4
      }
    },
    {
      "riding_id": "59023",
      "name_en": "Okanagan Lake West--South Kelowna",
      "name_fr": "Okanagan Lake-Ouest--Kelowna-Sud",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.64,
        "mean_margin": 2.04,
        "p_close_race": 0.9521,
        "vote_mean": {
          "lib": 46.71,
          "con": 45.85,
          "ndp": 4.15,
          "bq": 0.0,
          "grn": 1.48,
          "ppc": 0.99
        },
        "win_prob": {
          "lib": 0.64,
          "con": 0.36,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.69,
        "turnout_pct": 72.83,
        "lib_pct": 43.93,
        "con_pct": 50.63,
        "ndp_pct": 3.34,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.47
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.69,
        "turnout_pct": 72.83,
        "lib_pct": 43.93,
        "con_pct": 50.63,
        "ndp_pct": 3.34,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.47
      }
    },
    {
      "riding_id": "59024",
      "name_en": "Pitt Meadows--Maple Ridge",
      "name_fr": "Pitt Meadows--Maple Ridge",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "suburban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9973,
        "mean_margin": 6.84,
        "p_close_race": 0.2289,
        "vote_mean": {
          "lib": 48.75,
          "con": 41.91,
          "ndp": 7.2,
          "bq": 0.0,
          "grn": 0.66,
          "ppc": 1.05
        },
        "win_prob": {
          "lib": 0.9973,
          "con": 0.0027,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 1.77,
        "turnout_pct": 71.95,
        "lib_pct": 45.42,
        "con_pct": 47.19,
        "ndp_pct": 6.12,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.54
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 1.77,
        "turnout_pct": 71.95,
        "lib_pct": 45.42,
        "con_pct": 47.19,
        "ndp_pct": 6.12,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.54
      }
    },
    {
      "riding_id": "59025",
      "name_en": "Port Moody--Coquitlam",
      "name_fr": "Port Moody--Coquitlam",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 13.17,
        "p_close_race": 0.0009,
        "vote_mean": {
          "lib": 47.59,
          "con": 34.42,
          "ndp": 16.42,
          "bq": 0.0,
          "grn": 1.39,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 3.11,
        "turnout_pct": 70.26,
        "lib_pct": 43.25,
        "con_pct": 40.13,
        "ndp_pct": 14.95,
        "bq_pct": 0.0,
        "grn_pct": 0.83,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 3.11,
        "turnout_pct": 70.26,
        "lib_pct": 43.25,
        "con_pct": 40.13,
        "ndp_pct": 14.95,
        "bq_pct": 0.0,
        "grn_pct": 0.83,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59026",
      "name_en": "Prince George--Peace River--Northern Rockies",
      "name_fr": "Prince George--Peace River--Northern Rockies",
      "province": "BC",
      "region": "bc_north",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 1.0,
        "mean_margin": 44.31,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 21.01,
          "con": 65.32,
          "ndp": 6.61,
          "bq": 0.0,
          "grn": 2.68,
          "ppc": 1.62
        },
        "win_prob": {
          "lib": 0.0,
          "con": 1.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 51.23,
        "turnout_pct": 66.68,
        "lib_pct": 19.45,
        "con_pct": 70.68,
        "ndp_pct": 5.97,
        "bq_pct": 0.0,
        "grn_pct": 2.12,
        "ppc_pct": 1.16
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 51.23,
        "turnout_pct": 66.68,
        "lib_pct": 19.45,
        "con_pct": 70.68,
        "ndp_pct": 5.97,
        "bq_pct": 0.0,
        "grn_pct": 2.12,
        "ppc_pct": 1.16
      }
    },
    {
      "riding_id": "59027",
      "name_en": "Richmond Centre--Marpole",
      "name_fr": "Richmond-Centre--Marpole",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.9783,
        "mean_margin": 5.28,
        "p_close_race": 0.4652,
        "vote_mean": {
          "lib": 48.74,
          "con": 43.5,
          "ndp": 5.88,
          "bq": 0.0,
          "grn": 1.44,
          "ppc": 0.93
        },
        "win_prob": {
          "lib": 0.9783,
          "con": 0.0217,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 4.81,
        "turnout_pct": 59.2,
        "lib_pct": 44.4,
        "con_pct": 49.21,
        "ndp_pct": 4.41,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 0.4
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 4.81,
        "turnout_pct": 59.2,
        "lib_pct": 44.4,
        "con_pct": 49.21,
        "ndp_pct": 4.41,
        "bq_pct": 0.0,
        "grn_pct": 0.88,
        "ppc_pct": 0.4
      }
    },
    {
      "riding_id": "59028",
      "name_en": "Richmond East--Steveston",
      "name_fr": "Richmond-Est--Steveston",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 12.11,
        "p_close_race": 0.0032,
        "vote_mean": {
          "lib": 52.46,
          "con": 40.35,
          "ndp": 5.68,
          "bq": 0.0,
          "grn": 1.48,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 2.06,
        "turnout_pct": 63.58,
        "lib_pct": 48.12,
        "con_pct": 46.06,
        "ndp_pct": 4.21,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 2.06,
        "turnout_pct": 63.58,
        "lib_pct": 48.12,
        "con_pct": 46.06,
        "ndp_pct": 4.21,
        "bq_pct": 0.0,
        "grn_pct": 0.92,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59029",
      "name_en": "Saanich--Gulf Islands",
      "name_fr": "Saanich--Gulf Islands",
      "province": "BC",
      "region": "bc_island",
      "urban_rural": "mixed",
      "projection": {
        "winner": "grn",
        "p_winner": 0.9998,
        "mean_margin": 5.0,
        "p_close_race": 0.4983,
        "vote_mean": {
          "lib": 34.49,
          "con": 20.2,
          "ndp": 4.75,
          "bq": 0.0,
          "grn": 39.49,
          "ppc": 0.64
        },
        "win_prob": {
          "lib": 0.0002,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.9998,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "grn",
        "margin": 7.23,
        "turnout_pct": 77.87,
        "lib_pct": 31.71,
        "con_pct": 24.98,
        "ndp_pct": 3.95,
        "bq_pct": 0.0,
        "grn_pct": 38.94,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "grn",
        "margin": 7.23,
        "turnout_pct": 77.87,
        "lib_pct": 31.71,
        "con_pct": 24.98,
        "ndp_pct": 3.95,
        "bq_pct": 0.0,
        "grn_pct": 38.94,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59030",
      "name_en": "Similkameen--South Okanagan--West Kootenay",
      "name_fr": "Similkameen--Okanagan-Sud--Kootenay-Ouest",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 0.5317,
        "mean_margin": 1.81,
        "p_close_race": 0.9763,
        "vote_mean": {
          "lib": 38.67,
          "con": 38.5,
          "ndp": 16.75,
          "bq": 0.0,
          "grn": 2.08,
          "ppc": 1.42
        },
        "win_prob": {
          "lib": 0.5317,
          "con": 0.4683,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 6.75,
        "turnout_pct": 71.53,
        "lib_pct": 37.11,
        "con_pct": 43.85,
        "ndp_pct": 16.1,
        "bq_pct": 0.0,
        "grn_pct": 1.52,
        "ppc_pct": 0.95
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 6.75,
        "turnout_pct": 71.53,
        "lib_pct": 37.11,
        "con_pct": 43.85,
        "ndp_pct": 16.1,
        "bq_pct": 0.0,
        "grn_pct": 1.52,
        "ppc_pct": 0.95
      }
    },
    {
      "riding_id": "59031",
      "name_en": "Skeena--Bulkley Valley",
      "name_fr": "Skeena--Bulkley Valley",
      "province": "BC",
      "region": "bc_north",
      "urban_rural": "rural",
      "projection": {
        "winner": "con",
        "p_winner": 0.7749,
        "mean_margin": 2.37,
        "p_close_race": 0.9172,
        "vote_mean": {
          "lib": 12.44,
          "con": 41.51,
          "ndp": 39.72,
          "bq": 0.0,
          "grn": 1.73,
          "ppc": 0.64
        },
        "win_prob": {
          "lib": 0.0,
          "con": 0.7749,
          "ndp": 0.2251,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.79,
        "turnout_pct": 64.64,
        "lib_pct": 10.88,
        "con_pct": 46.87,
        "ndp_pct": 39.08,
        "bq_pct": 0.0,
        "grn_pct": 1.17,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.79,
        "turnout_pct": 64.64,
        "lib_pct": 10.88,
        "con_pct": 46.87,
        "ndp_pct": 39.08,
        "bq_pct": 0.0,
        "grn_pct": 1.17,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59032",
      "name_en": "South Surrey--White Rock",
      "name_fr": "Surrey-Sud--White Rock",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.86,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.56,
          "con": 39.7,
          "ndp": 3.95,
          "bq": 0.0,
          "grn": 1.88,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 4.81,
        "turnout_pct": 71.59,
        "lib_pct": 50.22,
        "con_pct": 45.41,
        "ndp_pct": 2.48,
        "bq_pct": 0.0,
        "grn_pct": 1.33,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 4.81,
        "turnout_pct": 71.59,
        "lib_pct": 50.22,
        "con_pct": 45.41,
        "ndp_pct": 2.48,
        "bq_pct": 0.0,
        "grn_pct": 1.33,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59033",
      "name_en": "Surrey Centre",
      "name_fr": "Surrey-Centre",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 14.78,
        "p_close_race": 0.0001,
        "vote_mean": {
          "lib": 51.9,
          "con": 37.12,
          "ndp": 8.19,
          "bq": 0.0,
          "grn": 1.5,
          "ppc": 1.09
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 4.73,
        "turnout_pct": 58.5,
        "lib_pct": 47.56,
        "con_pct": 42.83,
        "ndp_pct": 6.72,
        "bq_pct": 0.0,
        "grn_pct": 0.94,
        "ppc_pct": 0.59
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 4.73,
        "turnout_pct": 58.5,
        "lib_pct": 47.56,
        "con_pct": 42.83,
        "ndp_pct": 6.72,
        "bq_pct": 0.0,
        "grn_pct": 0.94,
        "ppc_pct": 0.59
      }
    },
    {
      "riding_id": "59034",
      "name_en": "Surrey Newton",
      "name_fr": "Surrey Newton",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 15.47,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 53.33,
          "con": 37.86,
          "ndp": 7.43,
          "bq": 0.0,
          "grn": 0.65,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 5.42,
        "turnout_pct": 63.66,
        "lib_pct": 48.99,
        "con_pct": 43.57,
        "ndp_pct": 5.96,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 5.42,
        "turnout_pct": 63.66,
        "lib_pct": 48.99,
        "con_pct": 43.57,
        "ndp_pct": 5.96,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59035",
      "name_en": "Vancouver Centre",
      "name_fr": "Vancouver-Centre",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 34.81,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 59.14,
          "con": 24.33,
          "ndp": 13.96,
          "bq": 0.0,
          "grn": 1.94,
          "ppc": 0.92
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 24.75,
        "turnout_pct": 63.17,
        "lib_pct": 54.8,
        "con_pct": 30.04,
        "ndp_pct": 12.49,
        "bq_pct": 0.0,
        "grn_pct": 1.39,
        "ppc_pct": 0.39
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 24.75,
        "turnout_pct": 63.17,
        "lib_pct": 54.8,
        "con_pct": 30.04,
        "ndp_pct": 12.49,
        "bq_pct": 0.0,
        "grn_pct": 1.39,
        "ppc_pct": 0.39
      }
    },
    {
      "riding_id": "59036",
      "name_en": "Vancouver East",
      "name_fr": "Vancouver-Est",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "ndp",
        "p_winner": 0.9878,
        "mean_margin": 5.25,
        "p_close_race": 0.4578,
        "vote_mean": {
          "lib": 39.62,
          "con": 11.96,
          "ndp": 44.85,
          "bq": 0.0,
          "grn": 2.46,
          "ppc": 1.07
        },
        "win_prob": {
          "lib": 0.0122,
          "con": 0.0,
          "ndp": 0.9878,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "ndp",
        "margin": 8.1,
        "turnout_pct": 62.7,
        "lib_pct": 35.28,
        "con_pct": 17.67,
        "ndp_pct": 43.38,
        "bq_pct": 0.0,
        "grn_pct": 1.91,
        "ppc_pct": 0.57
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "ndp",
        "margin": 8.1,
        "turnout_pct": 62.7,
        "lib_pct": 35.28,
        "con_pct": 17.67,
        "ndp_pct": 43.38,
        "bq_pct": 0.0,
        "grn_pct": 1.91,
        "ppc_pct": 0.57
      }
    },
    {
      "riding_id": "59037",
      "name_en": "Vancouver Fraserview--South Burnaby",
      "name_fr": "Vancouver Fraserview--Burnaby-Sud",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 26.55,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 56.27,
          "con": 29.72,
          "ndp": 11.21,
          "bq": 0.0,
          "grn": 1.81,
          "ppc": 1.39
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 16.5,
        "turnout_pct": 61.81,
        "lib_pct": 51.93,
        "con_pct": 35.43,
        "ndp_pct": 9.74,
        "bq_pct": 0.0,
        "grn_pct": 1.26,
        "ppc_pct": 0.92
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 16.5,
        "turnout_pct": 61.81,
        "lib_pct": 51.93,
        "con_pct": 35.43,
        "ndp_pct": 9.74,
        "bq_pct": 0.0,
        "grn_pct": 1.26,
        "ppc_pct": 0.92
      }
    },
    {
      "riding_id": "59038",
      "name_en": "Vancouver Granville",
      "name_fr": "Vancouver Granville",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 43.2,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 66.06,
          "con": 22.86,
          "ndp": 8.96,
          "bq": 0.0,
          "grn": 2.13,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 33.15,
        "turnout_pct": 69.07,
        "lib_pct": 61.72,
        "con_pct": 28.57,
        "ndp_pct": 7.49,
        "bq_pct": 0.0,
        "grn_pct": 1.58,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 33.15,
        "turnout_pct": 69.07,
        "lib_pct": 61.72,
        "con_pct": 28.57,
        "ndp_pct": 7.49,
        "bq_pct": 0.0,
        "grn_pct": 1.58,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59039",
      "name_en": "Vancouver Kingsway",
      "name_fr": "Vancouver Kingsway",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 0.8372,
        "mean_margin": 2.66,
        "p_close_race": 0.8801,
        "vote_mean": {
          "lib": 40.74,
          "con": 18.62,
          "ndp": 38.47,
          "bq": 0.0,
          "grn": 1.53,
          "ppc": 1.13
        },
        "win_prob": {
          "lib": 0.8372,
          "con": 0.0,
          "ndp": 0.1628,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "ndp",
        "margin": 0.6,
        "turnout_pct": 62.99,
        "lib_pct": 36.4,
        "con_pct": 24.33,
        "ndp_pct": 37.0,
        "bq_pct": 0.0,
        "grn_pct": 0.98,
        "ppc_pct": 0.63
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "ndp",
        "margin": 0.6,
        "turnout_pct": 62.99,
        "lib_pct": 36.4,
        "con_pct": 24.33,
        "ndp_pct": 37.0,
        "bq_pct": 0.0,
        "grn_pct": 0.98,
        "ppc_pct": 0.63
      }
    },
    {
      "riding_id": "59040",
      "name_en": "Vancouver Quadra",
      "name_fr": "Vancouver Quadra",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 42.63,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 67.07,
          "con": 24.44,
          "ndp": 5.71,
          "bq": 0.0,
          "grn": 2.38,
          "ppc": 0.87
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 32.58,
        "turnout_pct": 68.82,
        "lib_pct": 62.73,
        "con_pct": 30.15,
        "ndp_pct": 4.24,
        "bq_pct": 0.0,
        "grn_pct": 1.83,
        "ppc_pct": 0.32
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 32.58,
        "turnout_pct": 68.82,
        "lib_pct": 62.73,
        "con_pct": 30.15,
        "ndp_pct": 4.24,
        "bq_pct": 0.0,
        "grn_pct": 1.83,
        "ppc_pct": 0.32
      }
    },
    {
      "riding_id": "59041",
      "name_en": "Vernon--Lake Country--Monashee",
      "name_fr": "Vernon--Lake Country--Monashee",
      "province": "BC",
      "region": "bc_interior",
      "urban_rural": "mixed",
      "projection": {
        "winner": "lib",
        "p_winner": 0.5072,
        "mean_margin": 1.92,
        "p_close_race": 0.9656,
        "vote_mean": {
          "lib": 45.35,
          "con": 45.31,
          "ndp": 5.87,
          "bq": 0.0,
          "grn": 2.19,
          "ppc": 0.63
        },
        "win_prob": {
          "lib": 0.5072,
          "con": 0.4928,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "con",
        "margin": 7.52,
        "turnout_pct": 72.72,
        "lib_pct": 42.57,
        "con_pct": 50.09,
        "ndp_pct": 5.06,
        "bq_pct": 0.0,
        "grn_pct": 1.64,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "con",
        "margin": 7.52,
        "turnout_pct": 72.72,
        "lib_pct": 42.57,
        "con_pct": 50.09,
        "ndp_pct": 5.06,
        "bq_pct": 0.0,
        "grn_pct": 1.64,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "59042",
      "name_en": "Victoria",
      "name_fr": "Victoria",
      "province": "BC",
      "region": "bc_island",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 31.11,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 57.2,
          "con": 10.62,
          "ndp": 26.09,
          "bq": 0.0,
          "grn": 3.64,
          "ppc": 0.91
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 29.22,
        "turnout_pct": 74.41,
        "lib_pct": 54.02,
        "con_pct": 16.9,
        "ndp_pct": 24.79,
        "bq_pct": 0.0,
        "grn_pct": 3.09,
        "ppc_pct": 0.37
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 29.22,
        "turnout_pct": 74.41,
        "lib_pct": 54.02,
        "con_pct": 16.9,
        "ndp_pct": 24.79,
        "bq_pct": 0.0,
        "grn_pct": 3.09,
        "ppc_pct": 0.37
      }
    },
    {
      "riding_id": "59043",
      "name_en": "West Vancouver--Sunshine Coast--Sea to Sky Country",
      "name_fr": "West Vancouver--Sunshine Coast--Sea to Sky Country",
      "province": "BC",
      "region": "vancouver_metro",
      "urban_rural": "urban",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 36.71,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 63.84,
          "con": 27.13,
          "ndp": 4.68,
          "bq": 0.0,
          "grn": 3.97,
          "ppc": 1.0
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 26.67,
        "turnout_pct": 71.12,
        "lib_pct": 59.5,
        "con_pct": 32.84,
        "ndp_pct": 3.21,
        "bq_pct": 0.0,
        "grn_pct": 3.42,
        "ppc_pct": 0.48
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 26.67,
        "turnout_pct": 71.12,
        "lib_pct": 59.5,
        "con_pct": 32.84,
        "ndp_pct": 3.21,
        "bq_pct": 0.0,
        "grn_pct": 3.42,
        "ppc_pct": 0.48
      }
    },
    {
      "riding_id": "60001",
      "name_en": "Yukon",
      "name_fr": "Yukon",
      "province": "YT",
      "region": "territories",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 29.08,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.69,
          "con": 25.61,
          "ndp": 9.32,
          "bq": 0.0,
          "grn": 3.68,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 14.45,
        "turnout_pct": 72.51,
        "lib_pct": 52.76,
        "con_pct": 38.31,
        "ndp_pct": 6.3,
        "bq_pct": 0.0,
        "grn_pct": 2.08,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 14.45,
        "turnout_pct": 72.51,
        "lib_pct": 52.76,
        "con_pct": 38.31,
        "ndp_pct": 6.3,
        "bq_pct": 0.0,
        "grn_pct": 2.08,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "61001",
      "name_en": "Northwest Territories",
      "name_fr": "Territoires du Nord-Ouest",
      "province": "NT",
      "region": "territories",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 34.56,
        "p_close_race": 0.0,
        "vote_mean": {
          "lib": 54.8,
          "con": 20.22,
          "ndp": 15.03,
          "bq": 0.0,
          "grn": 2.62,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "lib",
        "margin": 19.95,
        "turnout_pct": 54.92,
        "lib_pct": 52.87,
        "con_pct": 32.92,
        "ndp_pct": 12.01,
        "bq_pct": 0.0,
        "grn_pct": 1.02,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "lib",
        "margin": 19.95,
        "turnout_pct": 54.92,
        "lib_pct": 52.87,
        "con_pct": 32.92,
        "ndp_pct": 12.01,
        "bq_pct": 0.0,
        "grn_pct": 1.02,
        "ppc_pct": 0.0
      }
    },
    {
      "riding_id": "62001",
      "name_en": "Nunavut",
      "name_fr": "Nunavut",
      "province": "NU",
      "region": "territories",
      "urban_rural": "rural",
      "projection": {
        "winner": "lib",
        "p_winner": 1.0,
        "mean_margin": 6.89,
        "p_close_race": 0.1505,
        "vote_mean": {
          "lib": 42.23,
          "con": 13.01,
          "ndp": 35.35,
          "bq": 0.0,
          "grn": 1.6,
          "ppc": 0.32
        },
        "win_prob": {
          "lib": 1.0,
          "con": 0.0,
          "ndp": 0.0,
          "bq": 0.0,
          "grn": 0.0,
          "ppc": 0.0
        },
        "projection_cycle": "fed_46"
      },
      "baseline_result": {
        "winner": "ndp",
        "margin": 0.53,
        "turnout_pct": 35.36,
        "lib_pct": 36.3,
        "con_pct": 25.71,
        "ndp_pct": 36.83,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      },
      "baseline_cycle": "fed_2025",
      "result_2025": {
        "winner": "ndp",
        "margin": 0.53,
        "turnout_pct": 35.36,
        "lib_pct": 36.3,
        "con_pct": 25.71,
        "ndp_pct": 36.83,
        "bq_pct": 0.0,
        "grn_pct": 0.0,
        "ppc_pct": 0.0
      }
    }
  ],
  "race_ratings": [],
  "polls_history": [
    {
      "date": "2025-04-30",
      "firm": "leger",
      "n": 1502,
      "weight": 0.0,
      "lib": 44.0,
      "con": 41.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 1.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-02",
      "firm": "research_co",
      "n": 1001,
      "weight": 0.0,
      "lib": 47.0,
      "con": 37.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-02",
      "firm": "nanos",
      "n": 1297,
      "weight": 0.0,
      "lib": 42.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-08",
      "firm": "abacus",
      "n": 1915,
      "weight": 0.0,
      "lib": 43.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-09",
      "firm": "nanos",
      "n": 1139,
      "weight": 0.0,
      "lib": 42.0,
      "con": 41.0,
      "ndp": 8.0,
      "bq": 5.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-16",
      "firm": "nanos",
      "n": 1127,
      "weight": 0.0,
      "lib": 41.0,
      "con": 40.0,
      "ndp": 9.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-17",
      "firm": "innovative",
      "n": 2517,
      "weight": 0.0,
      "lib": 42.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2025-05-18",
      "firm": "abacus",
      "n": 2273,
      "weight": 0.0,
      "lib": 41.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-23",
      "firm": "leger",
      "n": 1592,
      "weight": 0.0,
      "lib": 47.0,
      "con": 38.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2025-05-23",
      "firm": "nanos",
      "n": 1081,
      "weight": 0.0,
      "lib": 40.0,
      "con": 39.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2025-05-28",
      "firm": "spark",
      "n": 3450,
      "weight": 0.0,
      "lib": 41.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": null,
      "ppc": null
    },
    {
      "date": "2025-05-30",
      "firm": "ipsos",
      "n": 1001,
      "weight": 0.0,
      "lib": 43.0,
      "con": 39.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 1.0,
      "ppc": 2.0
    },
    {
      "date": "2025-05-30",
      "firm": "nanos",
      "n": 1079,
      "weight": 0.0,
      "lib": 42.0,
      "con": 36.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-06-01",
      "firm": "ekos",
      "n": 1529,
      "weight": 0.0,
      "lib": 44.0,
      "con": 32.0,
      "ndp": 13.0,
      "bq": 5.0,
      "grn": 3.0,
      "ppc": 3.0
    },
    {
      "date": "2025-06-04",
      "firm": "abacus",
      "n": 2585,
      "weight": 0.0,
      "lib": 42.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-06-05",
      "firm": "ekos",
      "n": 1614,
      "weight": 0.0,
      "lib": 42.0,
      "con": 34.0,
      "ndp": 13.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2025-06-06",
      "firm": "nanos",
      "n": 1079,
      "weight": 0.0,
      "lib": 43.0,
      "con": 33.0,
      "ndp": 12.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2025-06-13",
      "firm": "nanos",
      "n": 1080,
      "weight": 0.0,
      "lib": 44.0,
      "con": 32.0,
      "ndp": 11.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-06-13",
      "firm": "leger",
      "n": 1562,
      "weight": 0.0,
      "lib": 44.0,
      "con": 38.0,
      "ndp": 6.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-06-18",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.0,
      "lib": 42.0,
      "con": 39.0,
      "ndp": 7.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-06-18",
      "firm": "innovative",
      "n": 4029,
      "weight": 0.0,
      "lib": 43.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2025-06-19",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.0,
      "lib": 42.0,
      "con": 39.0,
      "ndp": 7.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-06-20",
      "firm": "nanos",
      "n": 1090,
      "weight": 0.0,
      "lib": 45.0,
      "con": 31.0,
      "ndp": 12.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-06-26",
      "firm": "mainstreet",
      "n": 1168,
      "weight": 0.0,
      "lib": 47.0,
      "con": 38.0,
      "ndp": 6.0,
      "bq": 3.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-06-27",
      "firm": "nanos",
      "n": 1076,
      "weight": 0.0,
      "lib": 45.0,
      "con": 31.0,
      "ndp": 13.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-06-28",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 44.0,
      "con": 36.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-06-29",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.0,
      "lib": 41.0,
      "con": 40.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-07-01",
      "firm": "research_co",
      "n": 1001,
      "weight": 0.0,
      "lib": 47.0,
      "con": 37.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-07-04",
      "firm": "nanos",
      "n": 1056,
      "weight": 0.0,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 12.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-07-05",
      "firm": "mainstreet",
      "n": 1084,
      "weight": 0.0,
      "lib": 44.0,
      "con": 40.0,
      "ndp": 5.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-07-05",
      "firm": "leger",
      "n": 1546,
      "weight": 0.0,
      "lib": 48.0,
      "con": 35.0,
      "ndp": 7.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2025-07-10",
      "firm": "abacus",
      "n": 2585,
      "weight": 0.0,
      "lib": 42.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-07-11",
      "firm": "nanos",
      "n": 1047,
      "weight": 0.0,
      "lib": 45.0,
      "con": 34.0,
      "ndp": 11.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-07-11",
      "firm": "ekos",
      "n": 1817,
      "weight": 0.0,
      "lib": 43.0,
      "con": 31.0,
      "ndp": 13.0,
      "bq": 6.0,
      "grn": 4.0,
      "ppc": 4.0
    },
    {
      "date": "2025-07-13",
      "firm": "abacus",
      "n": 1915,
      "weight": 0.0,
      "lib": 43.0,
      "con": 40.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-07-18",
      "firm": "ekos",
      "n": 1199,
      "weight": 0.0,
      "lib": 44.0,
      "con": 30.0,
      "ndp": 13.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 3.0
    },
    {
      "date": "2025-07-18",
      "firm": "nanos",
      "n": 1026,
      "weight": 0.0,
      "lib": 44.0,
      "con": 34.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-07-25",
      "firm": "nanos",
      "n": 1027,
      "weight": 0.0,
      "lib": 44.0,
      "con": 34.0,
      "ndp": 12.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-07-31",
      "firm": "pallas",
      "n": 1301,
      "weight": 0.0,
      "lib": 43.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2025-08-01",
      "firm": "nanos",
      "n": 1096,
      "weight": 0.0,
      "lib": 44.0,
      "con": 33.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 3.0,
      "ppc": 3.0
    },
    {
      "date": "2025-08-03",
      "firm": "leger",
      "n": 1617,
      "weight": 0.0,
      "lib": 46.0,
      "con": 36.0,
      "ndp": 6.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2025-08-04",
      "firm": "abacus",
      "n": 1686,
      "weight": 0.0,
      "lib": 43.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-08-07",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 44.0,
      "con": 35.0,
      "ndp": 11.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-08-08",
      "firm": "spark",
      "n": 3450,
      "weight": 0.0,
      "lib": 41.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": null,
      "ppc": null
    },
    {
      "date": "2025-08-08",
      "firm": "nanos",
      "n": 1094,
      "weight": 0.0,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 12.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 3.0
    },
    {
      "date": "2025-08-14",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.0,
      "lib": 40.0,
      "con": 41.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-08-15",
      "firm": "nanos",
      "n": 1050,
      "weight": 0.0,
      "lib": 44.0,
      "con": 32.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 3.0,
      "ppc": 3.0
    },
    {
      "date": "2025-08-17",
      "firm": "abacus",
      "n": 1915,
      "weight": 0.0,
      "lib": 39.0,
      "con": 41.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-08-22",
      "firm": "nanos",
      "n": 1045,
      "weight": 0.0,
      "lib": 44.0,
      "con": 34.0,
      "ndp": 11.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-08-26",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 44.0,
      "con": 35.0,
      "ndp": 10.0,
      "bq": 5.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-08-29",
      "firm": "nanos",
      "n": 1009,
      "weight": 0.0,
      "lib": 43.0,
      "con": 32.0,
      "ndp": 13.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-08-29",
      "firm": "ekos",
      "n": 1529,
      "weight": 0.0,
      "lib": 44.0,
      "con": 32.0,
      "ndp": 13.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 3.0
    },
    {
      "date": "2025-08-30",
      "firm": "mainstreet",
      "n": 1008,
      "weight": 0.0,
      "lib": 42.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 5.0,
      "grn": 1.0,
      "ppc": 2.0
    },
    {
      "date": "2025-08-31",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.0,
      "lib": 43.0,
      "con": 40.0,
      "ndp": 6.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-02",
      "firm": "angus_reid",
      "n": 3656,
      "weight": 0.0,
      "lib": 38.0,
      "con": 40.0,
      "ndp": 10.0,
      "bq": 8.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-05",
      "firm": "nanos",
      "n": 1002,
      "weight": 0.0,
      "lib": 43.0,
      "con": 33.0,
      "ndp": 13.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2025-09-06",
      "firm": "leger",
      "n": 1592,
      "weight": 0.0,
      "lib": 47.0,
      "con": 38.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2025-09-06",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 44.0,
      "con": 39.0,
      "ndp": 6.0,
      "bq": 5.0,
      "grn": 1.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-07",
      "firm": "ipsos",
      "n": 1001,
      "weight": 0.0,
      "lib": 43.0,
      "con": 39.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 1.0,
      "ppc": 2.0
    },
    {
      "date": "2025-09-09",
      "firm": "ekos",
      "n": 1614,
      "weight": 0.0,
      "lib": 42.0,
      "con": 34.0,
      "ndp": 13.0,
      "bq": 5.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-09-11",
      "firm": "research_co",
      "n": 1003,
      "weight": 0.0,
      "lib": 43.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-12",
      "firm": "nanos",
      "n": 1049,
      "weight": 0.0,
      "lib": 42.0,
      "con": 35.0,
      "ndp": 13.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-09-15",
      "firm": "abacus",
      "n": 2230,
      "weight": 0.0,
      "lib": 40.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-18",
      "firm": "abacus",
      "n": 1504,
      "weight": 0.0,
      "lib": 41.0,
      "con": 40.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-19",
      "firm": "nanos",
      "n": 1056,
      "weight": 0.0,
      "lib": 41.0,
      "con": 36.0,
      "ndp": 12.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-09-20",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 43.0,
      "con": 37.0,
      "ndp": 10.0,
      "bq": 5.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-09-21",
      "firm": "angus_reid",
      "n": 1570,
      "weight": 0.0,
      "lib": 38.0,
      "con": 41.0,
      "ndp": 10.0,
      "bq": 8.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-26",
      "firm": "nanos",
      "n": 1030,
      "weight": 0.0,
      "lib": 41.0,
      "con": 37.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2025-09-29",
      "firm": "abacus",
      "n": 1504,
      "weight": 0.0,
      "lib": 40.0,
      "con": 41.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-10-03",
      "firm": "nanos",
      "n": 1027,
      "weight": 0.0,
      "lib": 39.0,
      "con": 38.0,
      "ndp": 12.0,
      "bq": 6.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-04",
      "firm": "leger",
      "n": 1562,
      "weight": 0.0,
      "lib": 44.0,
      "con": 38.0,
      "ndp": 6.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2025-10-04",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 45.0,
      "con": 40.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 1.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-10",
      "firm": "nanos",
      "n": 1002,
      "weight": 0.0,
      "lib": 39.0,
      "con": 37.0,
      "ndp": 12.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-12",
      "firm": "abacus",
      "n": 4501,
      "weight": 0.0,
      "lib": 40.0,
      "con": 41.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-14",
      "firm": "pallas",
      "n": 1206,
      "weight": 0.0,
      "lib": 41.0,
      "con": 37.0,
      "ndp": 11.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2025-10-16",
      "firm": "abacus",
      "n": 2273,
      "weight": 0.0,
      "lib": 40.0,
      "con": 41.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-17",
      "firm": "nanos",
      "n": 1021,
      "weight": 0.0,
      "lib": 39.0,
      "con": 37.0,
      "ndp": 12.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-17",
      "firm": "innovative",
      "n": 4106,
      "weight": 0.0,
      "lib": 40.0,
      "con": 39.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2025-10-18",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 44.0,
      "con": 39.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 1.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-23",
      "firm": "ekos",
      "n": 1199,
      "weight": 0.0,
      "lib": 44.0,
      "con": 32.0,
      "ndp": 12.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-10-24",
      "firm": "nanos",
      "n": 1060,
      "weight": 0.0,
      "lib": 39.0,
      "con": 37.0,
      "ndp": 13.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-27",
      "firm": "abacus",
      "n": 2922,
      "weight": 0.0,
      "lib": 40.0,
      "con": 42.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-30",
      "firm": "research_co",
      "n": 1003,
      "weight": 0.0,
      "lib": 43.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-10-31",
      "firm": "nanos",
      "n": 1060,
      "weight": 0.0,
      "lib": 39.0,
      "con": 37.0,
      "ndp": 13.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-01",
      "firm": "leger",
      "n": 1585,
      "weight": 0.0,
      "lib": 43.0,
      "con": 38.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-11-02",
      "firm": "ekos",
      "n": 1126,
      "weight": 0.0,
      "lib": 43.0,
      "con": 36.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-02",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 42.0,
      "con": 38.0,
      "ndp": 11.0,
      "bq": 5.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-06",
      "firm": "abacus",
      "n": 1916,
      "weight": 0.0,
      "lib": 40.0,
      "con": 41.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-06",
      "firm": "angus_reid",
      "n": 2038,
      "weight": 0.0,
      "lib": 40.0,
      "con": 38.0,
      "ndp": 9.0,
      "bq": 8.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-07",
      "firm": "nanos",
      "n": 1122,
      "weight": 0.0,
      "lib": 40.0,
      "con": 37.0,
      "ndp": 11.0,
      "bq": 8.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-08",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 44.0,
      "con": 36.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-08",
      "firm": "mainstreet",
      "n": 1084,
      "weight": 0.0,
      "lib": 44.0,
      "con": 40.0,
      "ndp": 5.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-09",
      "firm": "ekos",
      "n": 1191,
      "weight": 0.0,
      "lib": 44.0,
      "con": 33.0,
      "ndp": 11.0,
      "bq": 5.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-14",
      "firm": "nanos",
      "n": 1060,
      "weight": 0.0,
      "lib": 40.0,
      "con": 38.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-15",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 41.0,
      "con": 36.0,
      "ndp": 5.0,
      "bq": 12.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-21",
      "firm": "leger",
      "n": 1579,
      "weight": 0.0,
      "lib": 43.0,
      "con": 36.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-11-21",
      "firm": "nanos",
      "n": 1053,
      "weight": 0.0,
      "lib": 42.0,
      "con": 37.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-24",
      "firm": "abacus",
      "n": 2421,
      "weight": 0.0,
      "lib": 41.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-28",
      "firm": "angus_reid",
      "n": 4025,
      "weight": 0.001,
      "lib": 40.0,
      "con": 37.0,
      "ndp": 10.0,
      "bq": 9.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-28",
      "firm": "nanos",
      "n": 1084,
      "weight": 0.0,
      "lib": 42.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-11-28",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.0,
      "lib": 41.0,
      "con": 40.0,
      "ndp": 7.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-29",
      "firm": "innovative",
      "n": 1846,
      "weight": 0.0,
      "lib": 39.0,
      "con": 38.0,
      "ndp": 9.0,
      "bq": 8.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-11-29",
      "firm": "leger",
      "n": 1579,
      "weight": 0.0,
      "lib": 43.0,
      "con": 36.0,
      "ndp": 8.0,
      "bq": 9.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-11-29",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.0,
      "lib": 41.0,
      "con": 36.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-11-30",
      "firm": "abacus",
      "n": 1802,
      "weight": 0.0,
      "lib": 41.0,
      "con": 41.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-12-05",
      "firm": "nanos",
      "n": 1042,
      "weight": 0.0,
      "lib": 39.0,
      "con": 38.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-05",
      "firm": "mainstreet",
      "n": 1098,
      "weight": 0.001,
      "lib": 41.0,
      "con": 42.0,
      "ndp": 6.0,
      "bq": 7.0,
      "grn": 1.0,
      "ppc": 1.0
    },
    {
      "date": "2025-12-07",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.0,
      "lib": 41.0,
      "con": 41.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2025-12-09",
      "firm": "innovative",
      "n": 2159,
      "weight": 0.001,
      "lib": 39.0,
      "con": 39.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-12-10",
      "firm": "mainstreet",
      "n": 1098,
      "weight": 0.001,
      "lib": 41.0,
      "con": 42.0,
      "ndp": 6.0,
      "bq": 7.0,
      "grn": 1.0,
      "ppc": 1.0
    },
    {
      "date": "2025-12-10",
      "firm": "innovative",
      "n": 2159,
      "weight": 0.001,
      "lib": 39.0,
      "con": 39.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-12-12",
      "firm": "ipsos",
      "n": 1502,
      "weight": 0.001,
      "lib": 40.0,
      "con": 37.0,
      "ndp": 9.0,
      "bq": 9.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-12",
      "firm": "nanos",
      "n": 1087,
      "weight": 0.0,
      "lib": 39.0,
      "con": 36.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-14",
      "firm": "pallas",
      "n": 1074,
      "weight": 0.0,
      "lib": 41.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 8.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2025-12-15",
      "firm": "ipsos",
      "n": 1502,
      "weight": 0.001,
      "lib": 40.0,
      "con": 37.0,
      "ndp": 9.0,
      "bq": 9.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-17",
      "firm": "pallas",
      "n": 1120,
      "weight": 0.001,
      "lib": 41.0,
      "con": 37.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-19",
      "firm": "nanos",
      "n": 1059,
      "weight": 0.0,
      "lib": 36.0,
      "con": 36.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": 3.0
    },
    {
      "date": "2025-12-19",
      "firm": "abacus",
      "n": 1850,
      "weight": 0.001,
      "lib": 40.0,
      "con": 40.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2025-12-20",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.001,
      "lib": 38.0,
      "con": 38.0,
      "ndp": 12.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-24",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.001,
      "lib": 39.0,
      "con": 37.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-26",
      "firm": "nanos",
      "n": 1057,
      "weight": 0.001,
      "lib": 38.0,
      "con": 35.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2025-12-30",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.001,
      "lib": 38.0,
      "con": 37.0,
      "ndp": 12.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-01-02",
      "firm": "nanos",
      "n": 1054,
      "weight": 0.001,
      "lib": 38.0,
      "con": 36.0,
      "ndp": 12.0,
      "bq": 8.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-07",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.002,
      "lib": 39.0,
      "con": 36.0,
      "ndp": 12.0,
      "bq": 8.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-01-08",
      "firm": "innovative",
      "n": 2249,
      "weight": 0.002,
      "lib": 41.0,
      "con": 39.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-01-09",
      "firm": "nanos",
      "n": 1054,
      "weight": 0.001,
      "lib": 39.0,
      "con": 36.0,
      "ndp": 11.0,
      "bq": 8.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-11",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.002,
      "lib": 40.0,
      "con": 35.0,
      "ndp": 11.0,
      "bq": 8.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-01-11",
      "firm": "pallas",
      "n": 1120,
      "weight": 0.003,
      "lib": 40.0,
      "con": 37.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-01-12",
      "firm": "abacus",
      "n": 1850,
      "weight": 0.003,
      "lib": 40.0,
      "con": 40.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-01-14",
      "firm": "abacus",
      "n": 2008,
      "weight": 0.003,
      "lib": 41.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-15",
      "firm": "abacus",
      "n": 2008,
      "weight": 0.003,
      "lib": 41.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-16",
      "firm": "nanos",
      "n": 1084,
      "weight": 0.002,
      "lib": 39.0,
      "con": 35.0,
      "ndp": 12.0,
      "bq": 8.0,
      "grn": 5.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-17",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.003,
      "lib": 40.0,
      "con": 35.0,
      "ndp": 11.0,
      "bq": 8.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-01-18",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.003,
      "lib": 42.0,
      "con": 34.0,
      "ndp": 10.0,
      "bq": 8.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-19",
      "firm": "ekos",
      "n": 1453,
      "weight": 0.008,
      "lib": 44.0,
      "con": 30.0,
      "ndp": 14.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-23",
      "firm": "nanos",
      "n": 1053,
      "weight": 0.002,
      "lib": 39.0,
      "con": 35.0,
      "ndp": 12.0,
      "bq": 8.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-24",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.003,
      "lib": 42.0,
      "con": 34.0,
      "ndp": 10.0,
      "bq": 8.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-25",
      "firm": "angus_reid",
      "n": 1420,
      "weight": 0.011,
      "lib": 41.0,
      "con": 38.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2026-01-25",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.003,
      "lib": 43.0,
      "con": 35.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-25",
      "firm": "leger",
      "n": 1611,
      "weight": 0.011,
      "lib": 47.0,
      "con": 38.0,
      "ndp": 5.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2026-01-25",
      "firm": "abacus",
      "n": 2498,
      "weight": 0.005,
      "lib": 43.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-01-28",
      "firm": "innovative",
      "n": 1666,
      "weight": 0.003,
      "lib": 40.0,
      "con": 38.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-01-28",
      "firm": "angus_reid",
      "n": 1420,
      "weight": 0.008,
      "lib": 41.0,
      "con": 38.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2026-01-30",
      "firm": "leger",
      "n": 1611,
      "weight": 0.009,
      "lib": 47.0,
      "con": 38.0,
      "ndp": 5.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2026-01-30",
      "firm": "nanos",
      "n": 1055,
      "weight": 0.003,
      "lib": 39.0,
      "con": 35.0,
      "ndp": 13.0,
      "bq": 9.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-01",
      "firm": "mainstreet",
      "n": 1276,
      "weight": 0.014,
      "lib": 51.0,
      "con": 36.0,
      "ndp": 4.0,
      "bq": 5.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-01",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.004,
      "lib": 42.0,
      "con": 35.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-05",
      "firm": "research_co",
      "n": 1001,
      "weight": 0.018,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-05",
      "firm": "abacus",
      "n": 2498,
      "weight": 0.008,
      "lib": 43.0,
      "con": 39.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-06",
      "firm": "nanos",
      "n": 1049,
      "weight": 0.004,
      "lib": 39.0,
      "con": 35.0,
      "ndp": 13.0,
      "bq": 9.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-02-08",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.007,
      "lib": 43.0,
      "con": 34.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-08",
      "firm": "abacus",
      "n": 1915,
      "weight": 0.009,
      "lib": 44.0,
      "con": 37.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-02-12",
      "firm": "ekos",
      "n": 1453,
      "weight": 0.018,
      "lib": 44.0,
      "con": 30.0,
      "ndp": 14.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-12",
      "firm": "innovative",
      "n": 1838,
      "weight": 0.006,
      "lib": 44.0,
      "con": 37.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-02-13",
      "firm": "nanos",
      "n": 1018,
      "weight": 0.006,
      "lib": 38.0,
      "con": 37.0,
      "ndp": 11.0,
      "bq": 8.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-14",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.008,
      "lib": 43.0,
      "con": 35.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-15",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.009,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-20",
      "firm": "mainstreet",
      "n": 1276,
      "weight": 0.024,
      "lib": 51.0,
      "con": 36.0,
      "ndp": 4.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-20",
      "firm": "nanos",
      "n": 1021,
      "weight": 0.009,
      "lib": 41.0,
      "con": 34.0,
      "ndp": 11.0,
      "bq": 8.0,
      "grn": 5.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-21",
      "firm": "abacus",
      "n": 1500,
      "weight": 0.016,
      "lib": 44.0,
      "con": 38.0,
      "ndp": 7.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-22",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.013,
      "lib": 43.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-22",
      "firm": "angus_reid",
      "n": 1650,
      "weight": 0.026,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2026-02-24",
      "firm": "innovative",
      "n": 1666,
      "weight": 0.016,
      "lib": 40.0,
      "con": 38.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-02-26",
      "firm": "ipsos",
      "n": 1001,
      "weight": 0.019,
      "lib": 44.0,
      "con": 36.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-26",
      "firm": "research_co",
      "n": 1001,
      "weight": 0.033,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-02-27",
      "firm": "nanos",
      "n": 1015,
      "weight": 0.012,
      "lib": 44.0,
      "con": 33.0,
      "ndp": 11.0,
      "bq": 5.0,
      "grn": 5.0,
      "ppc": 1.0
    },
    {
      "date": "2026-02-28",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.016,
      "lib": 42.0,
      "con": 35.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-03-01",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.017,
      "lib": 44.0,
      "con": 30.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 4.0
    },
    {
      "date": "2026-03-01",
      "firm": "leger",
      "n": 1627,
      "weight": 0.037,
      "lib": 49.0,
      "con": 35.0,
      "ndp": 5.0,
      "bq": 5.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-03-02",
      "firm": "mainstreet",
      "n": 1087,
      "weight": 0.013,
      "lib": 46.0,
      "con": 36.0,
      "ndp": 7.0,
      "bq": 4.0,
      "grn": 2.0,
      "ppc": 3.0
    },
    {
      "date": "2026-03-04",
      "firm": "spark",
      "n": 3055,
      "weight": 0.021,
      "lib": 46.0,
      "con": 31.0,
      "ndp": 10.0,
      "bq": 5.0,
      "grn": null,
      "ppc": null
    },
    {
      "date": "2026-03-05",
      "firm": "abacus",
      "n": 1915,
      "weight": 0.032,
      "lib": 44.0,
      "con": 37.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-03-06",
      "firm": "nanos",
      "n": 1023,
      "weight": 0.018,
      "lib": 46.0,
      "con": 33.0,
      "ndp": 10.0,
      "bq": 5.0,
      "grn": 5.0,
      "ppc": 1.0
    },
    {
      "date": "2026-03-07",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.024,
      "lib": 43.0,
      "con": 34.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-03-08",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.024,
      "lib": 45.0,
      "con": 31.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 4.0
    },
    {
      "date": "2026-03-08",
      "firm": "abacus",
      "n": 1931,
      "weight": 0.037,
      "lib": 46.0,
      "con": 35.0,
      "ndp": 7.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-03-11",
      "firm": "innovative",
      "n": 1838,
      "weight": 0.048,
      "lib": 44.0,
      "con": 37.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-03-11",
      "firm": "ekos",
      "n": 1047,
      "weight": 0.027,
      "lib": 48.0,
      "con": 27.0,
      "ndp": 15.0,
      "bq": 4.0,
      "grn": 5.0,
      "ppc": 2.0
    },
    {
      "date": "2026-03-13",
      "firm": "nanos",
      "n": 1015,
      "weight": 0.025,
      "lib": 48.0,
      "con": 31.0,
      "ndp": 11.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-03-14",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.034,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-03-14",
      "firm": "angus_reid",
      "n": 4005,
      "weight": 0.037,
      "lib": 44.0,
      "con": 36.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2026-03-15",
      "firm": "angus_reid",
      "n": 1650,
      "weight": 0.045,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 4.0,
      "ppc": null
    },
    {
      "date": "2026-03-15",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.034,
      "lib": 46.0,
      "con": 32.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-03-20",
      "firm": "nanos",
      "n": 1024,
      "weight": 0.035,
      "lib": 46.0,
      "con": 33.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-03-22",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.014,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-03-22",
      "firm": "abacus",
      "n": 1515,
      "weight": 0.023,
      "lib": 44.0,
      "con": 37.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-03-24",
      "firm": "spark",
      "n": 4000,
      "weight": 0.053,
      "lib": 46.0,
      "con": 30.0,
      "ndp": 11.0,
      "bq": 5.0,
      "grn": null,
      "ppc": null
    },
    {
      "date": "2026-03-27",
      "firm": "nanos",
      "n": 1029,
      "weight": 0.015,
      "lib": 47.0,
      "con": 32.0,
      "ndp": 11.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-03-29",
      "firm": "leger",
      "n": 1618,
      "weight": 0.054,
      "lib": 48.0,
      "con": 34.0,
      "ndp": 6.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": null
    },
    {
      "date": "2026-03-29",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.02,
      "lib": 44.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-03",
      "firm": "nanos",
      "n": 1025,
      "weight": 0.021,
      "lib": 46.0,
      "con": 31.0,
      "ndp": 13.0,
      "bq": 6.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-04-04",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.014,
      "lib": 44.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-05",
      "firm": "ipsos",
      "n": 1000,
      "weight": 0.143,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-05",
      "firm": "abacus",
      "n": 1680,
      "weight": 0.047,
      "lib": 44.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-04-05",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.029,
      "lib": 43.0,
      "con": 33.0,
      "ndp": 10.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-06",
      "firm": "spark",
      "n": 4026,
      "weight": 0.134,
      "lib": 46.0,
      "con": 32.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": null,
      "ppc": null
    },
    {
      "date": "2026-04-09",
      "firm": "ipsos",
      "n": 1000,
      "weight": 0.207,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-10",
      "firm": "nanos",
      "n": 1027,
      "weight": 0.03,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-04-11",
      "firm": "spark",
      "n": 4026,
      "weight": 0.209,
      "lib": 46.0,
      "con": 32.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 0.0,
      "ppc": null
    },
    {
      "date": "2026-04-12",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.041,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-12",
      "firm": "abacus",
      "n": 1515,
      "weight": 0.069,
      "lib": 44.0,
      "con": 38.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-04-17",
      "firm": "nanos",
      "n": 1022,
      "weight": 0.042,
      "lib": 46.0,
      "con": 32.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-04-18",
      "firm": "angus_reid",
      "n": 2013,
      "weight": 0.396,
      "lib": 42.0,
      "con": 35.0,
      "ndp": 12.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2026-04-19",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.077,
      "lib": 45.0,
      "con": 34.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-19",
      "firm": "abacus",
      "n": 2000,
      "weight": 0.199,
      "lib": 45.0,
      "con": 36.0,
      "ndp": 8.0,
      "bq": 7.0,
      "grn": 2.0,
      "ppc": 1.0
    },
    {
      "date": "2026-04-19",
      "firm": "ekos",
      "n": 1916,
      "weight": 0.327,
      "lib": 45.0,
      "con": 31.0,
      "ndp": 13.0,
      "bq": 2.0,
      "grn": 3.0,
      "ppc": 6.0
    },
    {
      "date": "2026-04-24",
      "firm": "nanos",
      "n": 1024,
      "weight": 0.076,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 12.0,
      "bq": 5.0,
      "grn": 4.0,
      "ppc": 1.0
    },
    {
      "date": "2026-04-25",
      "firm": "leger",
      "n": 1521,
      "weight": 0.676,
      "lib": 48.0,
      "con": 37.0,
      "ndp": 6.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": null
    },
    {
      "date": "2026-04-26",
      "firm": "liaison",
      "n": 1000,
      "weight": 0.187,
      "lib": 45.0,
      "con": 33.0,
      "ndp": 9.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-04-27",
      "firm": "ekos",
      "n": 1753,
      "weight": 0.547,
      "lib": 44.5,
      "con": 31.0,
      "ndp": 12.5,
      "bq": 5.8,
      "grn": 3.4,
      "ppc": 1.7
    },
    {
      "date": "2026-05-01",
      "firm": "nanos",
      "n": 1027,
      "weight": 0.174,
      "lib": 45.0,
      "con": 32.0,
      "ndp": 11.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-05-03",
      "firm": "liaison",
      "n": 1526,
      "weight": 0.481,
      "lib": 44.0,
      "con": 33.0,
      "ndp": 10.0,
      "bq": 6.0,
      "grn": 2.0,
      "ppc": 2.0
    },
    {
      "date": "2026-05-03",
      "firm": "abacus",
      "n": 2478,
      "weight": 0.663,
      "lib": 46.0,
      "con": 36.0,
      "ndp": 8.0,
      "bq": 6.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-05-07",
      "firm": "research_co",
      "n": 1003,
      "weight": 1.598,
      "lib": 46.0,
      "con": 31.0,
      "ndp": 11.0,
      "bq": 7.0,
      "grn": 3.0,
      "ppc": 1.0
    },
    {
      "date": "2026-05-12",
      "firm": "nanos",
      "n": 1036,
      "weight": 0.522,
      "lib": 45.5,
      "con": 33.4,
      "ndp": 8.8,
      "bq": 5.3,
      "grn": 3.5,
      "ppc": 2.0
    }
  ],
  "tipping_points": [
    {
      "party": "ppc",
      "score": 0.407,
      "alert_level": "yellow",
      "bimodal": true,
      "momentum": "stable",
      "description": "PPC : 1.1% [0.0–2.3] IC95 | ⚠ distribution bimodale | Alerte YELLOW"
    },
    {
      "party": "ndp",
      "score": 0.326,
      "alert_level": "yellow",
      "bimodal": false,
      "momentum": "stable",
      "description": "NDP : 10.3% [7.5–13.0] IC95 | Alerte YELLOW"
    },
    {
      "party": "grn",
      "score": 0.267,
      "alert_level": "green",
      "bimodal": true,
      "momentum": "accelerating",
      "description": "GRN : 2.9% [1.5–4.2] IC95 | ⚠ distribution bimodale | ↑ momentum en accélération | Alerte GREEN"
    },
    {
      "party": "con",
      "score": 0.212,
      "alert_level": "green",
      "bimodal": true,
      "momentum": "accelerating",
      "description": "CON : 32.8% [29.5–36.0] IC95 | ⚠ distribution bimodale | ↑ momentum en accélération | Alerte GREEN"
    },
    {
      "party": "lib",
      "score": 0.194,
      "alert_level": "green",
      "bimodal": true,
      "momentum": "decelerating",
      "description": "LIB : 46.2% [43.3–49.3] IC95 | ⚠ distribution bimodale | ↓ momentum en décélération | Alerte GREEN"
    },
    {
      "party": "bq",
      "score": 0.132,
      "alert_level": "green",
      "bimodal": false,
      "momentum": "stable",
      "description": "BQ : 6.7% [5.5–8.0] IC95 | Alerte GREEN"
    }
  ],
  "previous_runs": [
    {
      "run_date": "2026-04-29",
      "n_polls": 221,
      "mode": "rich",
      "seats": {
        "lib": 212.8,
        "con": 97.0,
        "bq": 22.5,
        "ndp": 8.8,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-27",
      "n_polls": 218,
      "mode": "rich",
      "seats": {
        "lib": 204.5,
        "con": 110.9,
        "bq": 23.1,
        "ndp": 2.5,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-26",
      "n_polls": 200,
      "mode": "rich",
      "seats": {
        "lib": 221.6,
        "con": 93.7,
        "bq": 22.2,
        "ndp": 3.6,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-21",
      "n_polls": 198,
      "mode": "rich",
      "seats": {
        "lib": 213.5,
        "con": 101.9,
        "bq": 22.4,
        "ndp": 3.2,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-13",
      "n_polls": 196,
      "mode": "rich",
      "seats": {
        "lib": 213.8,
        "con": 103.1,
        "bq": 21.6,
        "ndp": 2.5,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-12",
      "n_polls": 196,
      "mode": "rich",
      "seats": {
        "lib": 204.5,
        "con": 112.5,
        "bq": 21.8,
        "ndp": 2.3,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-10",
      "n_polls": 192,
      "mode": "rich",
      "seats": {
        "lib": 214.3,
        "con": 102.5,
        "bq": 21.8,
        "ndp": 2.4,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-09",
      "n_polls": 192,
      "mode": "rich",
      "seats": {
        "lib": 214.3,
        "con": 102.5,
        "bq": 21.8,
        "ndp": 2.4,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-08",
      "n_polls": 182,
      "mode": "rich",
      "seats": {
        "lib": 214.5,
        "con": 102.2,
        "bq": 21.8,
        "ndp": 2.5,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-07",
      "n_polls": 182,
      "mode": "rich",
      "seats": {
        "lib": 214.5,
        "con": 102.2,
        "bq": 21.8,
        "ndp": 2.5,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-06",
      "n_polls": 182,
      "mode": "rich",
      "seats": {
        "lib": 214.8,
        "con": 101.9,
        "bq": 21.8,
        "ndp": 2.5,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-02",
      "n_polls": 190,
      "mode": "rich",
      "seats": {
        "lib": 217.6,
        "con": 99.6,
        "bq": 21.5,
        "ndp": 2.3,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-04-01",
      "n_polls": 190,
      "mode": "rich",
      "seats": {
        "lib": 218.2,
        "con": 99.0,
        "bq": 21.5,
        "ndp": 2.3,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-31",
      "n_polls": 189,
      "mode": "rich",
      "seats": {
        "lib": 219.4,
        "con": 97.2,
        "bq": 21.6,
        "ndp": 2.8,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-30",
      "n_polls": 185,
      "mode": "rich",
      "seats": {
        "lib": 213.2,
        "con": 103.3,
        "bq": 21.8,
        "ndp": 2.7,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-29",
      "n_polls": 173,
      "mode": "rich",
      "seats": {
        "lib": 201.5,
        "con": 111.9,
        "bq": 23.2,
        "ndp": 4.4,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-28",
      "n_polls": 173,
      "mode": "rich",
      "seats": {
        "lib": 215.8,
        "con": 98.4,
        "bq": 22.5,
        "ndp": 4.3,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-27",
      "n_polls": 173,
      "mode": "rich",
      "seats": {
        "lib": 229.5,
        "con": 82.7,
        "bq": 22.0,
        "ndp": 6.8,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-26",
      "n_polls": 173,
      "mode": "rich",
      "seats": {
        "lib": 227.7,
        "con": 85.0,
        "bq": 21.9,
        "ndp": 6.4,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-25",
      "n_polls": 173,
      "mode": "rich",
      "seats": {
        "lib": 227.0,
        "con": 85.7,
        "bq": 21.9,
        "ndp": 6.4,
        "grn": 2.0
      }
    },
    {
      "run_date": "2026-03-24",
      "n_polls": 65,
      "mode": "rich",
      "seats": {
        "lib": 212.5,
        "con": 100.0,
        "bq": 23.2,
        "ndp": 5.2,
        "grn": 2.0,
        "fed_oth": 0.1
      }
    },
    {
      "run_date": "2026-03-23",
      "n_polls": 66,
      "mode": "rich",
      "seats": {
        "lib": 213.7,
        "con": 99.0,
        "bq": 23.2,
        "ndp": 5.0,
        "grn": 2.0,
        "fed_oth": 0.1
      }
    },
    {
      "run_date": "2026-03-22",
      "n_polls": 41,
      "mode": "rich",
      "seats": {
        "lib": 165.6,
        "con": 143.0,
        "bq": 24.5,
        "ndp": 6.0,
        "fed_oth": 2.6,
        "grn": 1.3
      }
    }
  ],
  "byelections": {
    "seat_changes": [
      {
        "riding_id": "48002",
        "change_type": "byelection",
        "change_date": "2025-08-18",
        "old_party": "con",
        "new_party": "con",
        "notes": "Kurek démissionne pour laisser Poilievre revenir au Parlement"
      },
      {
        "riding_id": "12001",
        "change_type": "floor_crossing",
        "change_date": "2025-11-25",
        "old_party": "con",
        "new_party": "lib",
        "notes": "Crosses the floor from Conservatives to Liberals"
      },
      {
        "riding_id": "35058",
        "change_type": "floor_crossing",
        "change_date": "2025-12-11",
        "old_party": "con",
        "new_party": "lib",
        "notes": "Crosses the floor from Conservatives to Liberals"
      },
      {
        "riding_id": "48020",
        "change_type": "floor_crossing",
        "change_date": "2026-02-24",
        "old_party": "con",
        "new_party": "lib",
        "notes": "Crosses the floor from Conservatives to Liberals"
      },
      {
        "riding_id": "62001",
        "change_type": "floor_crossing",
        "change_date": "2026-03-11",
        "old_party": "ndp",
        "new_party": "lib",
        "notes": "Crosses the floor from NDP to Liberals"
      },
      {
        "riding_id": "35112",
        "change_type": "resignation",
        "change_date": "2026-01-09",
        "old_party": "lib",
        "new_party": null,
        "notes": null
      },
      {
        "riding_id": "35096",
        "change_type": "resignation",
        "change_date": "2026-02-02",
        "old_party": "lib",
        "new_party": null,
        "notes": null
      },
      {
        "riding_id": "24073",
        "change_type": "court_annulment",
        "change_date": "2026-02-13",
        "old_party": "lib",
        "new_party": null,
        "notes": null
      },
      {
        "riding_id": "35112",
        "change_type": "byelection",
        "change_date": "2026-04-13",
        "old_party": "lib",
        "new_party": "lib",
        "notes": "Partielle 13 avril 2026 — LIB 64.3% vs NDP 18.9% vs CON 12.4% (résultats validés)"
      },
      {
        "riding_id": "35096",
        "change_type": "byelection",
        "change_date": "2026-04-13",
        "old_party": "lib",
        "new_party": "lib",
        "notes": "Partielle 13 avril 2026 — LIB 69.6% vs CON 18.8% vs NDP 5.9% (résultats validés)"
      },
      {
        "riding_id": "24073",
        "change_type": "byelection",
        "change_date": "2026-04-13",
        "old_party": "lib",
        "new_party": "lib",
        "notes": "Partielle 13 avril 2026 — LIB 48.3% vs BQ 46.9% (668 voix d'écart; résultats validés)"
      }
    ],
    "pending_byelections": [],
    "n_vacant": 0,
    "vacant_ridings": []
  }
}