SPB Git forge

spb/immo-ka

Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

112commits 1branches 0releases
125.4 MBsize
maindefault branch
13 days agolast push
Python 47.5% HTML 27.9% TypeScript 15.5% CSS 7.2% JavaScript 2%

feat(hypothèque): moteur de taux hypothécaires canadien natif — 12 connecteurs bancaires (RBC, TD, BMO, CIBC, Scotia, BNC, Desjardins, Tangerine, EQ, First National, MCAP, BdC), historisation par périodes de validité, validation anti-aberration, API /api/mortgage/* (best/history/providers/calculate/affordability), calculateur norme canadienne (composition semestrielle, SCHL+TVQ, stress test), section « Financer cette propriété » sur les fiches vente, page /taux-hypothecaires (SEO+sitemap), 61 tests unitaires sur fixtures

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Simon-Pierre Boucher committed 1 mo ago (Aug 24, 2026) parent 2b11439

46 changed files +19,906 −2

added .env.example +27 −0
@@ -0,0 +1,27 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — variables d'environnement (modèle ; copier vers .env, NE PAS COMMITTER .env)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# -----------------------------------------------------------------------------
5 +
6 +# --- Général ------------------------------------------------------------------
7 +IMMOKA_BASE_URL=https://www.immo-ka.com
8 +
9 +# --- Connecteurs immobiliers (scraping) ----------------------------------------
10 +FIRECRAWL_API_KEY=
11 +SCRAPFLY_KEY= # anti-bot — aussi utilisé par les providers de taux (dernier recours)
12 +HQ_CAPTCHA_KEY=
13 +HQ_CAPTCHA_PROVIDER=
14 +
15 +# --- Compte KA (SSO groupe-ka.com) ---------------------------------------------
16 +KA_SSO_SECRET=
17 +KA_HUB_URL=
18 +AUTH_SECRET=
19 +
20 +# --- Vrai-Prix -----------------------------------------------------------------
21 +VRAIPRIX_DB=
22 +
23 +# --- Moteur hypothécaire (immoka/mortgage) ---------------------------------------
24 +# Aucun taux n'est jamais inventé : ces variables ne règlent que la collecte.
25 +IMMOKA_MORTGAGE_INTERVAL_MIN=180 # fréquence de collecte (minutes) — watch/maybe_run
26 +IMMOKA_MORTGAGE_RETRIES=3 # tentatives par provider avant échec
27 +IMMOKA_MORTGAGE_BACKOFF=5 # backoff exponentiel de base (secondes)
modified .gitignore +1 −0
@@ -19,3 +19,4 @@ data/transit.db
19 19 data/commerces.db
20 20 data/hydro.db
21 21 data/rdl.db
22 +data/mortgage.db
added docs/mortgage-engine.md +163 −0
@@ -0,0 +1,163 @@
1 +# Moteur hypothécaire Immo-Ka (Mortgage Intelligence Engine)
2 +
3 +Moteur natif de collecte, d'historisation et de calcul des taux hypothécaires
4 +canadiens, intégré au backend FastAPI d'Immo-Ka. **Aucun taux n'est jamais
5 +inventé, codé en dur ni estimé** : tout taux affiché provient d'une page
6 +officielle d'une institution financière, avec provenance (URL source) et
7 +fraîcheur (horodatage de collecte).
8 +
9 +## Architecture
10 +
11 +```
12 +immoka/mortgage/
13 +├── providers/ # 1 connecteur indépendant par institution (12)
14 +│ ├── base.py # RateProvider : fetch() → produits normalisés
15 +│ └── README.md # comment ajouter une banque
16 +├── validate.py # garde-fous anti-aberration (419 % ≠ 4,19 %…)
17 +├── store.py # SQLite annexe data/mortgage.db — historisation
18 +├── scheduler.py # orchestration : retries, backoff, santé, isolation
19 +├── calc.py # mathématiques hypothécaires canadiennes
20 +├── cmhc.py # assurance prêt (SCHL) + taxe de vente QC
21 +└── api.py # routes /api/mortgage/* (montées dans web.py)
22 +```
23 +
24 +Le flux : `provider.fetch()` → `validate_batch()` → `store.record_observations()`.
25 +Les providers ne touchent jamais la base ; le calculateur ne touche jamais les
26 +scrapers — seule l'API interne les relie.
27 +
28 +## Institutions couvertes (12 connecteurs)
29 +
30 +| slug | Institution | Type de source |
31 +|---|---|---|
32 +| `bank_of_canada` | Banque du Canada | Valet API (JSON officiel) — taux de référence |
33 +| `bmo` | BMO | JSON embarqué |
34 +| `cibc` | CIBC | JSON |
35 +| `desjardins` | Desjardins | HTML |
36 +| `eq_bank` | Banque EQ | HTML |
37 +| `first_national` | First National | HTML |
38 +| `mcap` | MCAP | HTML (taux préférentiel) |
39 +| `national_bank` | Banque Nationale | HTML |
40 +| `rbc` | RBC | JSON |
41 +| `scotiabank` | Banque Scotia | JSON (posted + promos) |
42 +| `tangerine` | Tangerine | JSON |
43 +| `td` | TD Canada Trust | JSON |
44 +
45 +Chaque produit est normalisé par `RateProvider.make_product()` :
46 +`provider, institution, product_name, rate_type (fixed|variable|other),
47 +term_months, kind (posted|special), rate, apr, insured_status
48 +(insured|insurable|uninsured|unknown), purpose (purchase|renewal|refinance|unknown),
49 +amortization_max_years, conditions, source_url, confidence, raw`.
50 +
51 +Les taux **préférentiels/prime** sont stockés en `rate_type="other"` +
52 +`purpose="unknown"` : ils ne peuvent jamais contaminer un classement
53 +« meilleur taux d'achat ».
54 +
55 +## Validation (validate.py)
56 +
57 +Rejette avant enregistrement :
58 +- taux hors bornes plausibles (0,5 %–24 %) — attrape `4.19 → 419` ;
59 +- champs requis manquants, enums invalides, termes hors 3–120 mois ;
60 +- APR incohérent (APR < taux − 0,02 pt) ou aberrant ;
61 +- doublons exacts dans un même lot (silencieusement dédupliqués).
62 +
63 +Un lot partiellement invalide n'est pas jeté : les produits sains sont
64 +enregistrés, les problèmes journalisés.
65 +
66 +## Historisation (store.py — data/mortgage.db, WAL)
67 +
68 +- `rate_observations` : périodes de validité (`valid_from`/`valid_to`,
69 + `is_current`). Taux inchangé → simple mise à jour de `last_checked` ;
70 + taux changé → clôture de la période + nouvelle ligne. Un saut > 2,5 pts en
71 + < 48 h est rejeté **sans écraser** la donnée existante (garde anti-aberration
72 + au niveau BD).
73 +- `provider_runs` : journal de chaque collecte (statut, durée, produits,
74 + changements, rejets) → santé OK / WARNING (> 24 h) / ERROR.
75 +- `product_key` : sha1 tronqué de
76 + `provider|rate_type|term|kind|insured|purpose|name` — identité stable d'un
77 + produit à travers le temps.
78 +
79 +En cas de panne d'une source, **les derniers taux valides restent servis**,
80 +avec leur âge affiché (mention « stale » au-delà de 24 h).
81 +
82 +## Collecte (scheduler.py)
83 +
84 +- `run_provider(slug)` : retries (défaut 3) avec backoff exponentiel ;
85 + une exception d'un provider n'affecte jamais les autres.
86 +- `run()` : séquentiel et poli (`request_delay` par provider — jamais de
87 + martèlement des sites bancaires).
88 +- `watch(min)` : boucle autonome ; `maybe_run()` est appelé depuis la boucle
89 + d'ingestion existante (**process PM2 `immo-ka-sync`**) et ne collecte que si
90 + la dernière passe date de plus de `IMMOKA_MORTGAGE_INTERVAL_MIN` minutes
91 + (défaut 180).
92 +
93 +CLI :
94 +
95 +```bash
96 +python run.py mortgage-sync [slug…] # collecte (toutes ou certaines banques)
97 +python run.py mortgage-watch [min] # boucle autonome
98 +python run.py mortgage-status # santé des providers
99 +```
100 +
101 +Variables d'environnement (voir `.env.example`) :
102 +`IMMOKA_MORTGAGE_INTERVAL_MIN`, `IMMOKA_MORTGAGE_RETRIES`,
103 +`IMMOKA_MORTGAGE_BACKOFF`, `SCRAPFLY_KEY` (anti-bot, dernier recours).
104 +
105 +## Calculateur canadien (calc.py + cmhc.py)
106 +
107 +- **Composition semestrielle** pour les taux fixes (norme légale canadienne) :
108 + taux périodique = `(1 + r/2)^(2/f) − 1`. Valeur étalon vérifiée par test :
109 + 100 000 $ à 6 % sur 25 ans = **639,81 $/mois** (≠ 644,30 $ en composition
110 + mensuelle américaine — testé aussi, pour prouver qu'on n'utilise pas la
111 + mauvaise formule). Taux variables : composition mensuelle.
112 +- 6 fréquences : mensuelle, bimensuelle, aux 2 semaines, hebdomadaire,
113 + accélérée aux 2 semaines (mensualité ÷ 2), accélérée hebdo (÷ 4).
114 +- **Test de résistance** fédéral : qualification à `max(taux + 2, 5,25 %)`.
115 +- **SCHL** (cmhc.py) : mise de fonds légale minimale (5 % / 10 % / 20 %),
116 + primes par tranche RPV (0,60 % → 4,00 %), surprime +0,20 % amortissement
117 + 30 ans (premier acheteur), plafond assurable 1,5 M$, **TVQ 9,975 % sur la
118 + prime payable comptant** (spécificité québécoise) — la prime s'ajoute au
119 + prêt, la taxe non.
120 +- Tableau d'amortissement, résumé de terme (solde au renouvellement),
121 + scénarios de renouvellement (+0/+1/+2/+3 pts), ratios ABD/ATD informatifs,
122 + inverses (prêt max pour un versement, taux requis).
123 +
124 +## API interne (`/api/mortgage/*`)
125 +
126 +| Route | Rôle |
127 +|---|---|
128 +| `GET /rates` | taux courants filtrables (type, terme, kind, provider…) |
129 +| `GET /rates/best` | meilleur taux comparable + classement par institution |
130 +| `GET /rates/history` | périodes de validité (historique réel, jamais extrapolé) |
131 +| `GET /providers` | santé des sources (OK/WARNING/ERROR, âge, produits) |
132 +| `GET /market` | vue marché (meilleur/médiane/variations 7-30 j) |
133 +| `GET /intelligence` | market + taux préférentiels (page /taux-hypothecaires) |
134 +| `POST /calculate` | calcul complet (SCHL, stress, terme, renouvellement…) |
135 +| `POST /affordability` | capacité d'emprunt (ABD/ATD + stress test) |
136 +
137 +Règle absolue : **jamais de comparaison de produits incomparables** — affiché
138 +vs offre spéciale, assuré vs non assuré — sans l'indiquer. Le comparateur ne
139 +garde qu'un produit comparable par institution (l'offre spéciale prime).
140 +
141 +## Frontend
142 +
143 +- **Fiche propriété** (`Financement.tsx`, section « Financer cette propriété »,
144 + ventes seulement) : prix prérempli, mise de fonds $/% synchronisée,
145 + versement + taux utilisé avec provenance/fraîcheur, SCHL détaillée,
146 + coût réel mensuel (+ taxes municipales/scolaires de la fiche), stress test,
147 + renouvellement, comparateur banques, historique SVG, amortissement.
148 +- **Page `/taux-hypothecaires`** (`Taux.tsx`) : vue marché cliquable,
149 + comparateur par institution (nature + fraîcheur + source officielle),
150 + historique, santé des sources. Référencée (seo.py + sitemap).
151 +
152 +## Tests
153 +
154 +```bash
155 +PYTHONPATH=. .venv/bin/python -P -m unittest discover -s tests
156 +```
157 +
158 +61 tests : `test_mortgage_calc.py` (valeurs étalons, fréquences accélérées,
159 +inverses, stress), `test_mortgage_cmhc.py` (primes, TVQ, éligibilité),
160 +`test_mortgage_validate.py` (anti-aberration), `test_mortgage_store.py`
161 +(historisation, garde 2,5 pts, meilleur taux), `test_mortgage_providers.py`
162 +(chaque parseur sur fixtures HTML/JSON committées dans
163 +`tests/fixtures/mortgage/` — aucun réseau).
modified frontend/src/App.tsx +6 −0
@@ -18,6 +18,7 @@ import ListingPage from "./pages/Listing";
18 18 import ProfilPage from "./pages/Profil";
19 19 import SourcesPage from "./pages/Sources";
20 20 import StatsPage from "./pages/Stats";
21 +import TauxPage from "./pages/Taux";
21 22
22 23 function Ticker() {
23 24 const [items, setItems] = useState<string[]>([]);
@@ -53,6 +54,7 @@ function Ticker() {
53 54 const NAV_LINKS = [
54 55 { to: "/", label: "Propriétés", icon: "home", end: true },
55 56 { to: "/?view=carte", label: "Carte", icon: "map", end: false, force: true },
57 + { to: "/taux-hypothecaires", label: "Taux hypothécaires", icon: "trendup", end: false },
56 58 { to: "/stats", label: "Stats", icon: "chart", end: false },
57 59 { to: "/agences", label: "Agences", icon: "building", end: false },
58 60 { to: "/contact", label: "Contact", icon: "arrow", end: false },
@@ -146,6 +148,9 @@ function Header() {
146 148 <NavLink to="/" end className={({ isActive }) => (isActive ? "active" : "")}>
147 149 Propriétés
148 150 </NavLink>
151 + <NavLink to="/taux-hypothecaires" className={({ isActive }) => (isActive ? "active" : "")}>
152 + Taux
153 + </NavLink>
149 154 <NavLink to="/stats" className={({ isActive }) => (isActive ? "active" : "")}>
150 155 Stats
151 156 </NavLink>
@@ -219,6 +224,7 @@ export default function App() {
219 224 sans cette route, tout lien direct/partagé tombait sur la page 404 */}
220 225 <Route path="/propriete/:uid/:slug" element={<ListingPage />} />
221 226 <Route path="/stats" element={<StatsPage />} />
227 + <Route path="/taux-hypothecaires" element={<TauxPage />} />
222 228 <Route path="/agences" element={<SourcesPage />} />
223 229 <Route path="/contact" element={<ContactPage />} />
224 230 <Route path="/profil" element={<ProfilPage />} />
modified frontend/src/api.ts +163 −0
@@ -305,6 +305,169 @@ export async function toggleFavorite(on: boolean, item: FavItem) {
305 305 return (await res.json()) as { ok: boolean; on: boolean };
306 306 }
307 307
308 +// -----------------------------------------------------------------------------
309 +// Taux hypothécaires (immoka/mortgage) — taux réels observés chez les banques
310 +// -----------------------------------------------------------------------------
311 +export interface MortgageRate {
312 + provider: string;
313 + institution: string;
314 + product_key: string;
315 + product_name: string | null;
316 + rate_type: "fixed" | "variable" | "adjustable" | "other";
317 + term_months: number;
318 + kind: "posted" | "special";
319 + rate: number;
320 + apr: number | null;
321 + insured_status: "insured" | "insurable" | "uninsured" | "unknown";
322 + purpose: string;
323 + conditions: string | null;
324 + source_url: string | null;
325 + last_checked: number;
326 + age_minutes: number;
327 + stale: boolean;
328 +}
329 +
330 +export interface MortgageBest extends MortgageRate {
331 + median_rate: number | null;
332 + institutions_count: number;
333 + per_institution: MortgageRate[];
334 +}
335 +
336 +export interface MortgageMarket {
337 + rate_type: string;
338 + term_months: number;
339 + best: number;
340 + best_provider: string;
341 + best_institution: string;
342 + best_kind: string;
343 + median: number | null;
344 + spread: number | null;
345 + institutions_count: number;
346 + var_7d: number | null;
347 + var_30d: number | null;
348 + var_90d: number | null;
349 + lowest_6m: number | null;
350 +}
351 +
352 +export interface MortgageIntelligence {
353 + products: MortgageMarket[];
354 + prime_rates: { institution: string; rate: number; product_name: string;
355 + age_minutes: number }[];
356 +}
357 +
358 +export interface MortgageHistoryRow {
359 + provider: string; institution: string; product_name: string | null;
360 + kind: string; rate: number; insured_status: string;
361 + valid_from: number; valid_to: number | null; last_checked: number;
362 + source_url: string | null;
363 +}
364 +
365 +export interface MortgageProviderHealth {
366 + provider: string; institution: string; source_url: string | null;
367 + level: "OK" | "WARNING" | "ERROR"; status: string | null;
368 + age_minutes: number; current_products: number; last_data_at: number | null;
369 +}
370 +
371 +export interface MortgageRateSource {
372 + provider: string; institution: string; product_name: string | null;
373 + kind: string; rate: number; apr?: number | null; insured_status?: string;
374 + source_url: string | null; last_checked?: number;
375 + age_minutes: number; stale: boolean;
376 +}
377 +
378 +export interface MortgageInsurance {
379 + required: boolean; eligible: boolean; premium: number; premium_rate: number;
380 + loan_before: number; total_mortgage: number; qc_tax: number;
381 + ltv: number | null; issues: string[];
382 +}
383 +
384 +export interface MortgageCalc {
385 + inputs: {
386 + price: number; down_payment: number; down_payment_pct: number;
387 + rate: number; rate_type: string; term_months: number;
388 + amortization_years: number; frequency: string; compounding: string;
389 + };
390 + insurance: MortgageInsurance;
391 + principal: number;
392 + payment: number;
393 + payment_monthly_equivalent: number;
394 + qualifying: { rate: number; payment: number; note: string };
395 + term: {
396 + payment: number; frequency: string; payments_per_year: number;
397 + payments_in_term: number; annual_cost: number; principal_paid: number;
398 + interest_paid: number; balance_end_of_term: number; paid_off: boolean;
399 + };
400 + stress: { bump: number; rate: number; payment: number }[];
401 + renewal: {
402 + balance_at_renewal: number; remaining_amortization_years: number;
403 + scenarios: { bump: number; rate: number; payment: number }[];
404 + };
405 + payoff_years: number;
406 + rate_source: MortgageRateSource | null;
407 + annual: { year: number; payment: number; interest: number;
408 + principal: number; balance: number }[];
409 + ratios?: { gds: number | null; tds: number | null;
410 + gds_ok: boolean | null; tds_ok: boolean | null };
411 +}
412 +
413 +export interface MortgageCalcInput {
414 + price: number;
415 + down_payment?: number;
416 + down_payment_pct?: number;
417 + amortization_years?: number;
418 + term_months?: number;
419 + frequency?: string;
420 + rate_type?: "fixed" | "variable";
421 + rate?: number;
422 + income?: number;
423 + property_tax_monthly?: number;
424 + heating_monthly?: number;
425 + condo_fees_monthly?: number;
426 + other_debts_monthly?: number;
427 +}
428 +
429 +async function post<T>(path: string, body: unknown): Promise<T> {
430 + const ctrl = new AbortController();
431 + const timer = setTimeout(() => ctrl.abort(), 25000);
432 + try {
433 + const res = await fetch(path, {
434 + method: "POST",
435 + headers: { "Content-Type": "application/json" },
436 + body: JSON.stringify(body),
437 + signal: ctrl.signal,
438 + });
439 + if (!res.ok) throw new Error(`API ${res.status} — ${path}`);
440 + return (await res.json()) as T;
441 + } finally {
442 + clearTimeout(timer);
443 + }
444 +}
445 +
446 +export const fetchMortgageIntelligence = () =>
447 + get<MortgageIntelligence>("/api/mortgage/intelligence");
448 +
449 +export const fetchMortgageBest = (rateType: string, termMonths: number) =>
450 + get<MortgageBest>(
451 + `/api/mortgage/rates/best?rate_type=${rateType}&term_months=${termMonths}`);
452 +
453 +export const fetchMortgageHistory = (
454 + rateType: string, termMonths: number, days = 365, kind?: string,
455 +) =>
456 + get<{ count: number; days: number; history: MortgageHistoryRow[] }>(
457 + `/api/mortgage/rates/history?rate_type=${rateType}` +
458 + `&term_months=${termMonths}&days=${days}${kind ? `&kind=${kind}` : ""}`);
459 +
460 +export const fetchMortgageProviders = () =>
461 + get<{ providers: MortgageProviderHealth[]; registered: string[] }>(
462 + "/api/mortgage/providers");
463 +
464 +export const calculateMortgage = (input: MortgageCalcInput) =>
465 + post<MortgageCalc>("/api/mortgage/calculate", input);
466 +
467 +/** 4.19 -> « 4,19 % » */
468 +export const fmtRate = (r: number | null | undefined): string =>
469 + r == null ? "—" : `${r.toFixed(2).replace(".", ",")} %`;
470 +
308 471 export interface InondationZone {
309 472 type: string; severite: "eleve" | "modere" | "present";
310 473 recurrence: string; distance_m: number; date_rapport: string | null;
added frontend/src/components/Financement.tsx +373 −0
@@ -0,0 +1,373 @@
1 +// -----------------------------------------------------------------------------
2 +// Immo-Ka — Agrégateur de propriétés à vendre (province de Québec)
3 +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +// components/Financement.tsx : « Financer cette propriété » (fiche) —
5 +// calculateur hypothécaire canadien branché sur les taux RÉELS observés
6 +// (immoka/mortgage). Composition semestrielle pour les taux fixes,
7 +// SCHL montrée séparément, test de résistance, comparateur par banque,
8 +// historique du taux. Chaque taux affiche sa provenance et sa fraîcheur.
9 +// -----------------------------------------------------------------------------
10 +import { useEffect, useMemo, useRef, useState } from "react";
11 +import { Link } from "react-router-dom";
12 +import {
13 + MortgageBest, MortgageCalc, calculateMortgage, fetchMortgageBest,
14 + fmtPrice, fmtRate,
15 +} from "../api";
16 +import TauxHistorique from "./TauxHistorique";
17 +
18 +const FREQS: [string, string][] = [
19 + ["monthly", "Mensuel"],
20 + ["semimonthly", "Bimensuel (24/an)"],
21 + ["biweekly", "Aux 2 semaines"],
22 + ["accelerated-biweekly", "Aux 2 semaines accéléré"],
23 + ["weekly", "Hebdomadaire"],
24 + ["accelerated-weekly", "Hebdomadaire accéléré"],
25 +];
26 +const TERMES: [number, string][] = [
27 + [12, "1 an"], [24, "2 ans"], [36, "3 ans"], [48, "4 ans"],
28 + [60, "5 ans"], [84, "7 ans"], [120, "10 ans"],
29 +];
30 +const KIND_FR: Record<string, string> = {
31 + posted: "taux affiché", special: "offre spéciale",
32 +};
33 +const INSURED_FR: Record<string, string> = {
34 + insured: "assuré", insurable: "assurable", uninsured: "non assuré",
35 + unknown: "",
36 +};
37 +
38 +const nf = (n: number) => n.toLocaleString("fr-CA", { maximumFractionDigits: 0 });
39 +const money = (n: number | null | undefined) =>
40 + n == null ? "—" : `${n.toLocaleString("fr-CA", { minimumFractionDigits: 2, maximumFractionDigits: 2 })} $`;
41 +
42 +/** Fraîcheur lisible d'une observation de taux. */
43 +function freshness(ageMinutes: number): string {
44 + if (ageMinutes < 60) return `il y a ${ageMinutes} min`;
45 + if (ageMinutes < 48 * 60) return `il y a ${Math.round(ageMinutes / 60)} h`;
46 + return `il y a ${Math.round(ageMinutes / 1440)} j`;
47 +}
48 +
49 +export default function Financement({ prix, taxesMensuelles }:
50 + { prix: number | null; taxesMensuelles: number | null }) {
51 + const [price, setPrice] = useState<number>(prix ?? 0);
52 + const [down, setDown] = useState<number>(Math.round((prix ?? 0) * 0.2));
53 + const [amort, setAmort] = useState(25);
54 + const [term, setTerm] = useState(60);
55 + const [rateType, setRateType] = useState<"fixed" | "variable">("fixed");
56 + const [freq, setFreq] = useState("monthly");
57 + const [res, setRes] = useState<MortgageCalc | null>(null);
58 + const [err, setErr] = useState<string | null>(null);
59 + const [best, setBest] = useState<MortgageBest | null>(null);
60 + const timer = useRef<number>();
61 +
62 + const downPct = price > 0 ? (down / price) * 100 : 0;
63 + const setDownPct = (pct: number) =>
64 + setDown(Math.round((price * Math.min(99, Math.max(0, pct))) / 100));
65 +
66 + // recalcul débobiné : les taux viennent du moteur, jamais du navigateur
67 + useEffect(() => {
68 + if (!price || price <= 0 || down < 0 || down >= price) { setRes(null); return; }
69 + window.clearTimeout(timer.current);
70 + timer.current = window.setTimeout(() => {
71 + calculateMortgage({
72 + price, down_payment: down, amortization_years: amort,
73 + term_months: term, frequency: freq, rate_type: rateType,
74 + })
75 + .then((r) => { setRes(r); setErr(null); })
76 + .catch(() => setErr("Taux momentanément indisponibles — réessayez plus tard."));
77 + }, 350);
78 + return () => window.clearTimeout(timer.current);
79 + }, [price, down, amort, term, rateType, freq]);
80 +
81 + // comparateur par banque (mêmes type/terme que le scénario)
82 + useEffect(() => {
83 + setBest(null);
84 + fetchMortgageBest(rateType, term).then(setBest).catch(() => setBest(null));
85 + }, [rateType, term]);
86 +
87 + const coutReel = useMemo(() => {
88 + if (!res) return null;
89 + const parts: { k: string; v: number }[] = [
90 + { k: "Versement hypothécaire (équiv. mensuel)", v: res.payment_monthly_equivalent },
91 + ];
92 + if (taxesMensuelles != null && taxesMensuelles > 0)
93 + parts.push({ k: "Taxes municipales et scolaires", v: taxesMensuelles });
94 + return { parts, total: parts.reduce((s, p) => s + p.v, 0) };
95 + }, [res, taxesMensuelles]);
96 +
97 + if (prix == null || prix <= 0) return null;
98 + const src = res?.rate_source ?? null;
99 + const ins = res?.insurance;
100 +
101 + return (
102 + <section className="f-bloc f-mtg" id="financement">
103 + <h2>Financer cette propriété</h2>
104 + <p className="mtg-intro">
105 + Simulation avec les <b>taux réels publiés par les banques canadiennes</b>,
106 + collectés en continu par Immo-Ka — composition semestrielle (norme
107 + canadienne) pour les taux fixes.{" "}
108 + <Link to="/taux-hypothecaires">Voir tous les taux ↗</Link>
109 + </p>
110 +
111 + <div className="mtg-form">
112 + <label>
113 + <span>Prix</span>
114 + <input type="number" inputMode="numeric" min={1} value={price || ""}
115 + onChange={(e) => setPrice(Number(e.target.value) || 0)} />
116 + </label>
117 + <label>
118 + <span>Mise de fonds ($)</span>
119 + <input type="number" inputMode="numeric" min={0} value={down || ""}
120 + onChange={(e) => setDown(Number(e.target.value) || 0)} />
121 + </label>
122 + <label>
123 + <span>Mise de fonds (%)</span>
124 + <input type="number" inputMode="decimal" min={0} max={99} step={1}
125 + value={downPct ? Math.round(downPct * 10) / 10 : ""}
126 + onChange={(e) => setDownPct(Number(e.target.value) || 0)} />
127 + </label>
128 + <label>
129 + <span>Amortissement</span>
130 + <select value={amort} onChange={(e) => setAmort(Number(e.target.value))}>
131 + {[10, 15, 20, 25, 30].map((a) => <option key={a} value={a}>{a} ans</option>)}
132 + </select>
133 + </label>
134 + <label>
135 + <span>Terme</span>
136 + <select value={term} onChange={(e) => setTerm(Number(e.target.value))}>
137 + {TERMES.map(([m, l]) => <option key={m} value={m}>{l}</option>)}
138 + </select>
139 + </label>
140 + <label>
141 + <span>Type de taux</span>
142 + <select value={rateType}
143 + onChange={(e) => setRateType(e.target.value as "fixed" | "variable")}>
144 + <option value="fixed">Fixe</option>
145 + <option value="variable">Variable</option>
146 + </select>
147 + </label>
148 + <label>
149 + <span>Fréquence</span>
150 + <select value={freq} onChange={(e) => setFreq(e.target.value)}>
151 + {FREQS.map(([v, l]) => <option key={v} value={v}>{l}</option>)}
152 + </select>
153 + </label>
154 + </div>
155 +
156 + {err && <p className="mtg-err">{err}</p>}
157 +
158 + {res && (
159 + <>
160 + <div className="mtg-resultat">
161 + <div className="mtg-kpi">
162 + <span className="mtg-kpi-k">Versement</span>
163 + <span className="mtg-kpi-v">{money(res.payment)}</span>
164 + <span className="mtg-kpi-sub">
165 + {FREQS.find(([v]) => v === freq)?.[1].toLowerCase()}
166 + {freq !== "monthly" && ` · équiv. ${money(res.payment_monthly_equivalent)}/mois`}
167 + </span>
168 + </div>
169 + <div className="mtg-kpi">
170 + <span className="mtg-kpi-k">Taux utilisé</span>
171 + <span className="mtg-kpi-v">{fmtRate(res.inputs.rate)}</span>
172 + {src && (
173 + <span className="mtg-kpi-sub">
174 + {src.institution} — {src.product_name}{" "}
175 + ({KIND_FR[src.kind] ?? src.kind}
176 + {INSURED_FR[src.insured_status ?? "unknown"]
177 + ? `, ${INSURED_FR[src.insured_status ?? "unknown"]}` : ""})
178 + </span>
179 + )}
180 + </div>
181 + <div className="mtg-kpi">
182 + <span className="mtg-kpi-k">Hypothèque</span>
183 + <span className="mtg-kpi-v">{fmtPrice(res.principal)}</span>
184 + <span className="mtg-kpi-sub">
185 + mise de fonds {fmtPrice(res.inputs.down_payment)} ({res.inputs.down_payment_pct.toLocaleString("fr-CA")} %)
186 + </span>
187 + </div>
188 + <div className="mtg-kpi">
189 + <span className="mtg-kpi-k">Test de résistance</span>
190 + <span className="mtg-kpi-v">{money(res.qualifying.payment)}</span>
191 + <span className="mtg-kpi-sub">qualification à {fmtRate(res.qualifying.rate)}</span>
192 + </div>
193 + </div>
194 +
195 + {src && (
196 + <p className="mtg-source fine">
197 + Taux observé chez <b>{src.institution}</b> {freshness(src.age_minutes)}
198 + {src.stale && " ⚠ donnée de plus de 24 h"} ·{" "}
199 + {src.source_url && (
200 + <a href={src.source_url} target="_blank" rel="noopener noreferrer">
201 + source officielle ↗
202 + </a>
203 + )}
204 + </p>
205 + )}
206 +
207 + {ins && ins.required && (
208 + <div className={`mtg-schl ${ins.eligible ? "" : "mtg-schl-no"}`}>
209 + <b>Assurance prêt hypothécaire (SCHL)</b>
210 + {ins.eligible ? (
211 + <ul>
212 + <li>Prime : <b>{fmtPrice(ins.premium)}</b> ({ins.premium_rate.toLocaleString("fr-CA")} % du prêt, ajoutée à l'hypothèque)</li>
213 + <li>TVQ sur la prime : <b>{money(ins.qc_tax)}</b> — payable comptant à la clôture</li>
214 + <li>Rapport prêt-valeur : {ins.ltv?.toLocaleString("fr-CA")} %</li>
215 + </ul>
216 + ) : null}
217 + {ins.issues.map((i, k) => <p className="mtg-issue" key={k}>⚠ {i}</p>)}
218 + </div>
219 + )}
220 +
221 + {coutReel && (
222 + <details className="mtg-detail">
223 + <summary>Coût réel mensuel estimé</summary>
224 + <div className="dtable">
225 + {coutReel.parts.map((p) => (
226 + <div className="drow" key={p.k}><span>{p.k}</span><b>{money(p.v)}</b></div>
227 + ))}
228 + <div className="drow mtg-total"><span>Total estimé</span><b>{money(coutReel.total)}</b></div>
229 + </div>
230 + <p className="fine">
231 + {taxesMensuelles == null &&
232 + "Taxes non publiées pour cette annonce — versement hypothécaire seulement. "}
233 + Chauffage, électricité, assurance habitation et copropriété en sus.
234 + </p>
235 + </details>
236 + )}
237 +
238 + <details className="mtg-detail">
239 + <summary>Et si les taux montent ? (test de résistance)</summary>
240 + <div className="dtable">
241 + {res.stress.map((s) => (
242 + <div className="drow" key={s.bump}>
243 + <span>{s.bump === 0 ? "Taux actuel" : `+${s.bump} point${s.bump > 1 ? "s" : ""}`} — {fmtRate(s.rate)}</span>
244 + <b>{money(s.payment)}</b>
245 + </div>
246 + ))}
247 + </div>
248 + <p className="fine">{res.qualifying.note}</p>
249 + </details>
250 +
251 + <details className="mtg-detail">
252 + <summary>Au renouvellement ({TERMES.find(([m]) => m === term)?.[1]})</summary>
253 + <p className="fine">
254 + Solde restant à l'échéance : <b>{fmtPrice(res.renewal.balance_at_renewal)}</b>{" "}
255 + (amortissement résiduel {res.renewal.remaining_amortization_years} ans).
256 + Intérêts payés pendant le terme : {fmtPrice(res.term.interest_paid)}.
257 + </p>
258 + <div className="dtable">
259 + {res.renewal.scenarios.map((s) => (
260 + <div className="drow" key={s.bump}>
261 + <span>Renouvelé à {fmtRate(s.rate)} ({s.bump >= 0 ? "+" : ""}{s.bump} pt)</span>
262 + <b>{money(s.payment)}</b>
263 + </div>
264 + ))}
265 + </div>
266 + </details>
267 +
268 + {best && best.per_institution.length > 1 && (
269 + <details className="mtg-detail">
270 + <summary>Comparer les banques ({best.institutions_count} institutions)</summary>
271 + <div className="rooms-wrap">
272 + <table className="rooms mtg-comp">
273 + <thead>
274 + <tr><th>Institution</th><th>Taux</th><th>Nature</th><th>Versement</th><th>Fraîcheur</th></tr>
275 + </thead>
276 + <tbody>
277 + {best.per_institution.map((r) => (
278 + <tr key={r.provider}>
279 + <td>
280 + {r.source_url
281 + ? <a href={r.source_url} target="_blank" rel="noopener noreferrer">{r.institution}</a>
282 + : r.institution}
283 + </td>
284 + <td><b>{fmtRate(r.rate)}</b>{r.apr != null ? ` (TAP ${fmtRate(r.apr)})` : ""}</td>
285 + <td>
286 + {KIND_FR[r.kind]}
287 + {INSURED_FR[r.insured_status] ? ` · ${INSURED_FR[r.insured_status]}` : ""}
288 + </td>
289 + <td>{res.principal > 0 ? money(estimatePayment(res, r.rate)) : "—"}</td>
290 + <td className={r.stale ? "mtg-stale" : ""}>{freshness(r.age_minutes)}</td>
291 + </tr>
292 + ))}
293 + </tbody>
294 + </table>
295 + </div>
296 + <p className="fine">
297 + Produits comparables seulement (même type, même terme) — un taux
298 + « affiché » et une « offre spéciale » ne sont pas la même chose,
299 + d'où la colonne Nature. Versements estimés sur votre scénario.
300 + </p>
301 + </details>
302 + )}
303 +
304 + <details className="mtg-detail">
305 + <summary>Historique du taux ({rateType === "fixed" ? "fixe" : "variable"} {TERMES.find(([m]) => m === term)?.[1]})</summary>
306 + <TauxHistorique rateType={rateType} termMonths={term} />
307 + </details>
308 +
309 + <details className="mtg-detail">
310 + <summary>Amortissement année par année</summary>
311 + <div className="rooms-wrap">
312 + <table className="rooms">
313 + <thead>
314 + <tr><th>Année</th><th>Intérêts</th><th>Capital</th><th>Solde</th></tr>
315 + </thead>
316 + <tbody>
317 + {res.annual.map((a) => (
318 + <tr key={a.year}>
319 + <td>{a.year}</td>
320 + <td>{nf(a.interest)} $</td>
321 + <td>{nf(a.principal)} $</td>
322 + <td>{nf(a.balance)} $</td>
323 + </tr>
324 + ))}
325 + </tbody>
326 + </table>
327 + </div>
328 + {res.payoff_years < res.inputs.amortization_years && (
329 + <p className="fine">
330 + Avec la fréquence accélérée choisie, le prêt s'éteint en{" "}
331 + <b>{res.payoff_years} ans</b> au lieu de {res.inputs.amortization_years}.
332 + </p>
333 + )}
334 + </details>
335 + </>
336 + )}
337 +
338 + <p className="fine">
339 + Outil indicatif seulement — ne constitue ni une offre de financement ni
340 + une préapprobation. Les taux affichés sont ceux publiés par les
341 + institutions (source et fraîcheur indiquées) ; vérifiez auprès de la
342 + banque ou d'un courtier hypothécaire.
343 + </p>
344 + </section>
345 + );
346 +}
347 +
348 +/** Versement estimé au taux d'une autre banque, même scénario (approximation
349 + * frontend par règle de trois sur le facteur d'annuité — les chiffres
350 + * officiels du scénario viennent toujours du moteur). */
351 +function estimatePayment(res: MortgageCalc, rate: number): number {
352 + const { amortization_years, frequency, compounding } = res.inputs;
353 + const f = ({ monthly: 12, semimonthly: 24, biweekly: 26,
354 + "accelerated-biweekly": 26, weekly: 52, "accelerated-weekly": 52 } as
355 + Record<string, number>)[frequency] ?? 12;
356 + const per = (pct: number, k: number) =>
357 + compounding === "monthly"
358 + ? Math.pow(1 + pct / 100 / 12, 12 / k) - 1
359 + : Math.pow(1 + pct / 100 / 2, 2 / k) - 1;
360 + const pay = (pct: number) => {
361 + if (frequency.startsWith("accelerated")) {
362 + const m = pay0(pct, 12);
363 + return Math.round((m / (frequency === "accelerated-biweekly" ? 2 : 4)) * 100) / 100;
364 + }
365 + return pay0(pct, f);
366 + };
367 + const pay0 = (pct: number, k: number) => {
368 + const i = per(pct, k);
369 + const n = Math.round(amortization_years * k);
370 + return Math.round(((res.principal * i) / (1 - Math.pow(1 + i, -n))) * 100) / 100;
371 + };
372 + return pay(rate);
373 +}
added frontend/src/components/TauxHistorique.tsx +101 −0
@@ -0,0 +1,101 @@
1 +// -----------------------------------------------------------------------------
2 +// Immo-Ka — Agrégateur de propriétés à vendre (province de Québec)
3 +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +// components/TauxHistorique.tsx : graphique SVG de l'évolution du meilleur
5 +// taux observé (périodes de validité valid_from/valid_to reconstruites en
6 +// courbe en escalier — un taux reste en vigueur tant qu'il n'a pas changé).
7 +// -----------------------------------------------------------------------------
8 +import { useEffect, useMemo, useState } from "react";
9 +import { MortgageHistoryRow, fetchMortgageHistory, fmtRate } from "../api";
10 +
11 +/** Meilleur taux (toutes institutions) à chaque instant : pour chaque borne
12 + * de période, le min des taux dont la période couvre cet instant. */
13 +function bestCurve(rows: MortgageHistoryRow[], now: number) {
14 + const stamps = new Set<number>();
15 + for (const r of rows) {
16 + stamps.add(r.valid_from);
17 + if (r.valid_to != null) stamps.add(r.valid_to);
18 + }
19 + stamps.add(now);
20 + const ts = [...stamps].sort((a, b) => a - b);
21 + const pts: { t: number; rate: number }[] = [];
22 + for (const t of ts) {
23 + let best: number | null = null;
24 + for (const r of rows) {
25 + if (r.valid_from <= t && (r.valid_to == null || r.valid_to > t))
26 + best = best == null ? r.rate : Math.min(best, r.rate);
27 + }
28 + if (best != null) pts.push({ t, rate: best });
29 + }
30 + return pts;
31 +}
32 +
33 +export default function TauxHistorique({ rateType, termMonths, days = 365 }:
34 + { rateType: string; termMonths: number; days?: number }) {
35 + const [rows, setRows] = useState<MortgageHistoryRow[] | null>(null);
36 +
37 + useEffect(() => {
38 + setRows(null);
39 + fetchMortgageHistory(rateType, termMonths, days, "special")
40 + .then((r) => setRows(r.history))
41 + .catch(() => setRows([]));
42 + }, [rateType, termMonths, days]);
43 +
44 + const now = Math.floor(Date.now() / 1000);
45 + const pts = useMemo(() => bestCurve(rows ?? [], now), [rows, now]);
46 +
47 + if (rows == null) return <div className="fine">Chargement de l'historique…</div>;
48 + if (pts.length === 0)
49 + return <div className="fine">Aucun historique pour ce produit.</div>;
50 +
51 + const W = 640, H = 180, PAD = { l: 44, r: 10, t: 10, b: 22 };
52 + const t0 = pts[0].t, t1 = now;
53 + const rates = pts.map((p) => p.rate);
54 + const rMin = Math.floor(Math.min(...rates) * 10) / 10 - 0.1;
55 + const rMax = Math.ceil(Math.max(...rates) * 10) / 10 + 0.1;
56 + const x = (t: number) =>
57 + PAD.l + ((t - t0) / Math.max(1, t1 - t0)) * (W - PAD.l - PAD.r);
58 + const y = (r: number) =>
59 + PAD.t + (1 - (r - rMin) / Math.max(0.01, rMax - rMin)) * (H - PAD.t - PAD.b);
60 +
61 + // courbe en escalier : le taux tient jusqu'au changement suivant
62 + let d = `M ${x(pts[0].t).toFixed(1)} ${y(pts[0].rate).toFixed(1)}`;
63 + for (let i = 1; i < pts.length; i++) {
64 + d += ` H ${x(pts[i].t).toFixed(1)} V ${y(pts[i].rate).toFixed(1)}`;
65 + }
66 + d += ` H ${x(t1).toFixed(1)}`;
67 +
68 + const yTicks: number[] = [];
69 + for (let r = Math.ceil(rMin * 4) / 4; r <= rMax + 1e-9; r += 0.25)
70 + yTicks.push(Math.round(r * 100) / 100);
71 + const fmtD = (t: number) =>
72 + new Date(t * 1000).toLocaleDateString("fr-CA", { month: "short", day: "numeric" });
73 + const last = pts[pts.length - 1];
74 +
75 + return (
76 + <div className="mtg-chart">
77 + <svg viewBox={`0 0 ${W} ${H}`} role="img"
78 + aria-label={`Évolution du meilleur taux ${rateType} ${termMonths} mois`}>
79 + {yTicks.map((r) => (
80 + <g key={r}>
81 + <line x1={PAD.l} x2={W - PAD.r} y1={y(r)} y2={y(r)} className="mtg-grid" />
82 + <text x={PAD.l - 6} y={y(r) + 3} className="mtg-tick" textAnchor="end">
83 + {r.toFixed(2).replace(".", ",")}
84 + </text>
85 + </g>
86 + ))}
87 + <text x={x(t0)} y={H - 6} className="mtg-tick">{fmtD(t0)}</text>
88 + <text x={W - PAD.r} y={H - 6} className="mtg-tick" textAnchor="end">
89 + aujourd'hui
90 + </text>
91 + <path d={d} className="mtg-line" />
92 + <circle cx={x(t1)} cy={y(last.rate)} r={3.5} className="mtg-dot" />
93 + </svg>
94 + <div className="fine">
95 + Meilleur taux « offre spéciale » observé toutes institutions —
96 + actuellement <b>{fmtRate(last.rate)}</b>. L'historique se construit au
97 + fil des collectes (aucune donnée n'est extrapolée).
98 + </div>
99 + </div>
100 + );
101 +}
modified frontend/src/pages/Listing.tsx +19 −0
@@ -13,6 +13,7 @@ import {
13 13 } from "../api";
14 14
15 15 const PropertyMap = lazy(() => import("../components/PropertyMap"));
16 +import Financement from "../components/Financement";
16 17 import QuartierBlock from "../components/QuartierBlock";
17 18 import RisqueInondation from "../components/RisqueInondation";
18 19 import QualiteAir from "../components/QualiteAir";
@@ -242,6 +243,16 @@ export default function ListingPage() {
242 243 const detEntries = Object.entries(l.details ?? {})
243 244 .filter(([k, v]) => !DETAIL_HIDDEN.has(k) && (typeof v === "string" || typeof v === "number") && String(v).trim());
244 245
246 + // taxes annuelles publiées (Centris) → mensualisées pour le coût réel
247 + const taxesAnnuelles = ["Taxes municipales", "Taxes scolaires"]
248 + .map((k) => {
249 + const v = l.details?.[k];
250 + const n = parseInt(String(v ?? "").replace(/[^\d]/g, ""), 10);
251 + return Number.isFinite(n) && n > 0 && n < 200_000 ? n : 0;
252 + })
253 + .reduce((a, b) => a + b, 0);
254 + const estVente = l.details?.transaction !== "location";
255 +
245 256 const hist = (l.price_history ?? []).filter((h) => h.price != null);
246 257 const baisse = hist.length >= 2 && hist[0].price !== hist[1].price
247 258 ? { de: hist[1].price!, a: hist[0].price! } : null;
@@ -458,6 +469,14 @@ export default function ListingPage() {
458 469 </div>
459 470 </div>
460 471
472 + {/* financement : taux hypothécaires réels + calculateur canadien */}
473 + {estVente && (
474 + <Financement
475 + prix={l.price}
476 + taxesMensuelles={taxesAnnuelles > 0 ? Math.round(taxesAnnuelles / 12) : null}
477 + />
478 + )}
479 +
461 480 {/* quartier : pleine largeur, APRÈS les infos de propriété (ordre mobile correct) */}
462 481 <RisqueInondation lat={l.lat} lng={l.lng} />
463 482
added frontend/src/pages/Taux.tsx +192 −0
@@ -0,0 +1,192 @@
1 +// -----------------------------------------------------------------------------
2 +// Immo-Ka — Agrégateur de propriétés à vendre (province de Québec)
3 +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +// pages/Taux.tsx : /taux-hypothecaires — Mortgage Intelligence.
5 +// Vue marché (meilleur/médian/variations), comparateur par banque avec
6 +// nature du taux (affiché vs spécial) et fraîcheur, historique, taux
7 +// préférentiels, santé des sources. Aucun taux inventé : tout vient des
8 +// pages officielles des institutions, avec provenance.
9 +// -----------------------------------------------------------------------------
10 +import { useEffect, useState } from "react";
11 +import {
12 + MortgageBest, MortgageIntelligence, MortgageProviderHealth,
13 + fetchMortgageBest, fetchMortgageIntelligence, fetchMortgageProviders,
14 + fmtRate,
15 +} from "../api";
16 +import TauxHistorique from "../components/TauxHistorique";
17 +
18 +const TERMES: [number, string][] = [
19 + [12, "1 an"], [24, "2 ans"], [36, "3 ans"], [48, "4 ans"],
20 + [60, "5 ans"], [84, "7 ans"], [120, "10 ans"],
21 +];
22 +const KIND_FR: Record<string, string> = { posted: "affiché", special: "offre spéciale" };
23 +const INSURED_FR: Record<string, string> = {
24 + insured: "assuré", insurable: "assurable", uninsured: "non assuré", unknown: "",
25 +};
26 +
27 +const termeLabel = (m: number) => TERMES.find(([t]) => t === m)?.[1] ?? `${m} mois`;
28 +const freshness = (min: number) =>
29 + min < 60 ? `il y a ${min} min` : min < 48 * 60
30 + ? `il y a ${Math.round(min / 60)} h` : `il y a ${Math.round(min / 1440)} j`;
31 +const varTxt = (v: number | null) =>
32 + v == null ? "—" : v === 0 ? "stable"
33 + : `${v > 0 ? "▲ +" : "▼ "}${v.toFixed(2).replace(".", ",")} pt`;
34 +
35 +export default function TauxPage() {
36 + const [intel, setIntel] = useState<MortgageIntelligence | null>(null);
37 + const [rateType, setRateType] = useState<"fixed" | "variable">("fixed");
38 + const [term, setTerm] = useState(60);
39 + const [best, setBest] = useState<MortgageBest | null>(null);
40 + const [health, setHealth] = useState<MortgageProviderHealth[]>([]);
41 +
42 + useEffect(() => {
43 + document.title = "Taux hypothécaires au Canada — comparateur en direct | Immo-Ka";
44 + fetchMortgageIntelligence().then(setIntel).catch(() => setIntel(null));
45 + fetchMortgageProviders().then((r) => setHealth(r.providers)).catch(() => {});
46 + }, []);
47 +
48 + useEffect(() => {
49 + setBest(null);
50 + fetchMortgageBest(rateType, term).then(setBest).catch(() => setBest(null));
51 + }, [rateType, term]);
52 +
53 + return (
54 + <div className="container taux-page">
55 + <header className="taux-head">
56 + <h1>Taux hypothécaires en direct</h1>
57 + <p>
58 + Les taux réellement publiés par les grandes institutions canadiennes
59 + (banques, Desjardins, prêteurs virtuels et monolines), collectés en
60 + continu par Immo-Ka. Chaque taux indique sa <b>nature</b> (affiché ou
61 + offre spéciale), sa <b>source officielle</b> et sa <b>fraîcheur</b> —
62 + jamais de taux inventé ni périmé sans avertissement.
63 + </p>
64 + </header>
65 +
66 + {intel && intel.products.length > 0 && (
67 + <section className="f-bloc">
68 + <h2>Vue d'ensemble du marché</h2>
69 + <div className="taux-grid">
70 + {intel.products.map((p) => (
71 + <button
72 + key={`${p.rate_type}-${p.term_months}`}
73 + className={`taux-card ${p.rate_type === rateType && p.term_months === term ? "on" : ""}`}
74 + onClick={() => { setRateType(p.rate_type as "fixed" | "variable"); setTerm(p.term_months); }}
75 + >
76 + <span className="taux-card-k">
77 + {p.rate_type === "fixed" ? "Fixe" : "Variable"} {termeLabel(p.term_months)}
78 + </span>
79 + <span className="taux-card-v">{fmtRate(p.best)}</span>
80 + <span className="taux-card-sub">{p.best_institution}</span>
81 + <span className="taux-card-sub">
82 + médiane {fmtRate(p.median)} · 30 j : {varTxt(p.var_30d)}
83 + </span>
84 + </button>
85 + ))}
86 + </div>
87 + {intel.prime_rates.length > 0 && (
88 + <p className="fine">
89 + Taux préférentiels :{" "}
90 + {intel.prime_rates.map((p, i) => (
91 + <span key={i}>
92 + {i > 0 && " · "}
93 + {p.institution} <b>{fmtRate(p.rate)}</b>
94 + </span>
95 + ))}
96 + </p>
97 + )}
98 + </section>
99 + )}
100 +
101 + <section className="f-bloc">
102 + <h2>Comparer les institutions</h2>
103 + <div className="taux-filtres">
104 + <label>
105 + <span>Type</span>
106 + <select value={rateType}
107 + onChange={(e) => setRateType(e.target.value as "fixed" | "variable")}>
108 + <option value="fixed">Fixe</option>
109 + <option value="variable">Variable</option>
110 + </select>
111 + </label>
112 + <label>
113 + <span>Terme</span>
114 + <select value={term} onChange={(e) => setTerm(Number(e.target.value))}>
115 + {TERMES.map(([m, l]) => <option key={m} value={m}>{l}</option>)}
116 + </select>
117 + </label>
118 + </div>
119 +
120 + {best == null ? (
121 + <p className="fine">Aucun taux courant pour ce produit — essayez un autre terme.</p>
122 + ) : (
123 + <>
124 + <div className="rooms-wrap">
125 + <table className="rooms mtg-comp">
126 + <thead>
127 + <tr><th>Institution</th><th>Produit</th><th>Taux</th><th>Nature</th><th>Fraîcheur</th><th>Source</th></tr>
128 + </thead>
129 + <tbody>
130 + {best.per_institution.map((r, i) => (
131 + <tr key={r.provider} className={i === 0 ? "taux-best" : ""}>
132 + <td>{r.institution}{i === 0 && <span className="taux-badge">meilleur</span>}</td>
133 + <td>{r.product_name}</td>
134 + <td><b>{fmtRate(r.rate)}</b>{r.apr != null ? ` (TAP ${fmtRate(r.apr)})` : ""}</td>
135 + <td>
136 + {KIND_FR[r.kind] ?? r.kind}
137 + {INSURED_FR[r.insured_status] ? ` · ${INSURED_FR[r.insured_status]}` : ""}
138 + </td>
139 + <td className={r.stale ? "mtg-stale" : ""}>{freshness(r.age_minutes)}</td>
140 + <td>
141 + {r.source_url && (
142 + <a href={r.source_url} target="_blank" rel="noopener noreferrer">officielle ↗</a>
143 + )}
144 + </td>
145 + </tr>
146 + ))}
147 + </tbody>
148 + </table>
149 + </div>
150 + <p className="fine">
151 + Un seul produit comparable par institution (l'offre spéciale prime
152 + sur le taux affiché). Les produits incomparables — assuré vs non
153 + assuré, affiché vs spécial — ne sont jamais mélangés dans un même
154 + classement sans l'indiquer.
155 + </p>
156 + </>
157 + )}
158 + </section>
159 +
160 + <section className="f-bloc">
161 + <h2>Évolution — {rateType === "fixed" ? "fixe" : "variable"} {termeLabel(term)}</h2>
162 + <TauxHistorique rateType={rateType} termMonths={term} />
163 + </section>
164 +
165 + {health.length > 0 && (
166 + <section className="f-bloc">
167 + <h2>Fraîcheur des sources</h2>
168 + <div className="taux-sante">
169 + {health.map((h) => (
170 + <span key={h.provider}
171 + className={`taux-src taux-src-${h.level.toLowerCase()}`}
172 + title={`${h.current_products} produit(s) courant(s) — dernière collecte ${freshness(h.age_minutes)}`}>
173 + {h.institution}
174 + </span>
175 + ))}
176 + </div>
177 + <p className="fine">
178 + Vert : collecte récente réussie · jaune : donnée conservée mais
179 + vieillissante · rouge : source en erreur. En cas d'échec d'une
180 + collecte, les derniers taux valides restent affichés avec leur date.
181 + </p>
182 + </section>
183 + )}
184 +
185 + <p className="fine">
186 + Informations indicatives seulement, sans garantie — les conditions
187 + réelles dépendent de votre dossier. Immo-Ka n'est ni un prêteur ni un
188 + courtier hypothécaire.
189 + </p>
190 + </div>
191 + );
192 +}
modified frontend/src/styles.css +135 −0
@@ -1072,3 +1072,138 @@ table.rooms tbody tr:hover td { background: var(--accent-soft); }
1072 1072 margin-top: 10px;
1073 1073 }
1074 1074 .cta-pdf:hover { background: var(--ink); color: var(--paper); }
1075 +
1076 +/* ================= Financement (fiche) + page Taux hypothécaires ========= */
1077 +.f-mtg .mtg-intro { color: var(--ink-2); font-size: 14px; margin: 4px 0 14px; }
1078 +.f-mtg .mtg-intro a { color: var(--lime); font-weight: 600; }
1079 +
1080 +.mtg-form {
1081 + display: grid; gap: 10px;
1082 + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
1083 +}
1084 +.mtg-form label { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
1085 +.mtg-form label > span {
1086 + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700;
1087 + text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3);
1088 +}
1089 +.mtg-form input, .mtg-form select {
1090 + border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface);
1091 + padding: 9px 10px; font-size: 14.5px; font-family: inherit; color: var(--ink);
1092 + min-height: 42px; min-width: 0;
1093 +}
1094 +.mtg-form input:focus, .mtg-form select:focus {
1095 + outline: none; box-shadow: 3px 3px 0 var(--lime);
1096 +}
1097 +
1098 +.mtg-err { color: var(--accent-deep); font-size: 13.5px; margin: 12px 0 0; }
1099 +
1100 +.mtg-resultat {
1101 + display: grid; gap: 10px; margin-top: 16px;
1102 + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1103 +}
1104 +.mtg-kpi {
1105 + border: 1.5px solid var(--line-strong); border-radius: var(--r-card);
1106 + background: var(--surface-2); padding: 12px 14px;
1107 + display: flex; flex-direction: column; gap: 2px; min-width: 0;
1108 +}
1109 +.mtg-kpi-k {
1110 + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700;
1111 + text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3);
1112 +}
1113 +.mtg-kpi-v {
1114 + font-family: var(--font-display); font-weight: 700; font-size: 22px;
1115 + letter-spacing: -0.02em;
1116 +}
1117 +.mtg-kpi-sub { font-size: 12px; color: var(--ink-3); }
1118 +.mtg-kpi:first-child { background: var(--ink); border-color: var(--ink); }
1119 +.mtg-kpi:first-child .mtg-kpi-v { color: var(--lime); }
1120 +.mtg-kpi:first-child .mtg-kpi-k, .mtg-kpi:first-child .mtg-kpi-sub { color: rgba(255,255,255,0.75); }
1121 +
1122 +.mtg-source { margin-top: 10px; }
1123 +
1124 +.mtg-schl {
1125 + margin-top: 14px; border: 1.5px dashed var(--line-strong);
1126 + border-radius: var(--r-card); padding: 12px 14px; font-size: 13.5px;
1127 + background: var(--surface);
1128 +}
1129 +.mtg-schl ul { margin: 8px 0 0; padding-left: 18px; display: grid; gap: 3px; }
1130 +.mtg-schl-no { border-color: var(--accent-deep); }
1131 +.mtg-issue { margin: 8px 0 0; color: var(--accent-deep); font-size: 13px; }
1132 +
1133 +.mtg-detail {
1134 + margin-top: 10px; border: 1.5px solid var(--line-strong);
1135 + border-radius: var(--r-card); background: var(--surface);
1136 +}
1137 +.mtg-detail > summary {
1138 + cursor: pointer; padding: 11px 14px; font-weight: 700; font-size: 14px;
1139 + list-style: none; display: flex; align-items: center; gap: 8px;
1140 +}
1141 +.mtg-detail > summary::before { content: "+"; font-family: var(--font-mono); color: var(--lime); font-weight: 700; }
1142 +.mtg-detail[open] > summary::before { content: "−"; }
1143 +.mtg-detail > summary::-webkit-details-marker { display: none; }
1144 +.mtg-detail > *:not(summary) { margin: 0 14px 12px; }
1145 +.mtg-detail .fine { border-top: none; padding-top: 0; }
1146 +.mtg-total { border-top: 2px solid var(--ink); }
1147 +.mtg-comp td, .mtg-comp th { white-space: nowrap; }
1148 +.mtg-stale { color: var(--accent-deep); }
1149 +
1150 +.mtg-chart svg { width: 100%; height: auto; display: block; }
1151 +.mtg-grid { stroke: var(--line); stroke-width: 1; }
1152 +.mtg-tick { font-family: var(--font-mono); font-size: 10px; fill: var(--ink-3); }
1153 +.mtg-line { fill: none; stroke: var(--lime); stroke-width: 2.5; stroke-linejoin: round; }
1154 +.mtg-dot { fill: var(--ink); stroke: var(--lime); stroke-width: 2.5; }
1155 +
1156 +/* ---- page /taux-hypothecaires ---- */
1157 +.taux-page { padding-bottom: 40px; }
1158 +.taux-head { margin: 28px 0 6px; max-width: 760px; }
1159 +.taux-head h1 { font-family: var(--font-display); font-size: clamp(28px, 5vw, 40px); letter-spacing: -0.03em; }
1160 +.taux-head p { color: var(--ink-2); font-size: 15px; margin: 12px 0 0; }
1161 +.taux-page > .f-bloc { margin-top: 22px; }
1162 +
1163 +.taux-grid {
1164 + display: grid; gap: 10px;
1165 + grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
1166 +}
1167 +.taux-card {
1168 + border: 1.5px solid var(--ink); border-radius: var(--r-card);
1169 + background: var(--surface); padding: 12px 14px; text-align: left;
1170 + cursor: pointer; display: flex; flex-direction: column; gap: 2px;
1171 + transition: box-shadow 0.15s ease; font-family: inherit; min-width: 0;
1172 +}
1173 +.taux-card:hover { box-shadow: 3px 3px 0 var(--lime); }
1174 +.taux-card.on { background: var(--ink); color: var(--paper); }
1175 +.taux-card.on .taux-card-v { color: var(--lime); }
1176 +.taux-card-k {
1177 + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700;
1178 + text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3);
1179 +}
1180 +.taux-card.on .taux-card-k, .taux-card.on .taux-card-sub { color: rgba(255,255,255,0.7); }
1181 +.taux-card-v { font-family: var(--font-display); font-weight: 700; font-size: 24px; }
1182 +.taux-card-sub { font-size: 11.5px; color: var(--ink-3); }
1183 +
1184 +.taux-filtres { display: flex; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; }
1185 +.taux-filtres label { display: flex; flex-direction: column; gap: 3px; }
1186 +.taux-filtres label > span {
1187 + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700;
1188 + text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3);
1189 +}
1190 +.taux-filtres select {
1191 + border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface);
1192 + padding: 9px 12px; font-size: 14.5px; font-family: inherit; min-height: 42px;
1193 +}
1194 +.taux-best td { background: var(--lime-soft); }
1195 +.taux-badge {
1196 + font-family: var(--font-mono); font-size: 9px; font-weight: 700;
1197 + text-transform: uppercase; letter-spacing: 0.1em; background: var(--ink);
1198 + color: var(--lime); border-radius: 999px; padding: 2px 8px; margin-left: 8px;
1199 +}
1200 +.taux-sante { display: flex; flex-wrap: wrap; gap: 8px; }
1201 +.taux-src {
1202 + border: 1.5px solid var(--line-strong); border-radius: 999px;
1203 + padding: 6px 12px; font-size: 12.5px; font-weight: 600;
1204 + display: inline-flex; align-items: center; gap: 7px;
1205 +}
1206 +.taux-src::before { content: ""; width: 8px; height: 8px; border-radius: 50%; }
1207 +.taux-src-ok::before { background: var(--green, #2f9e44); }
1208 +.taux-src-warning::before { background: #e8a000; }
1209 +.taux-src-error::before { background: var(--accent-deep); }
modified immoka/ingest.py +6 −1
@@ -105,10 +105,15 @@ def watch(interval_seconds: int = 3600) -> None:
105 105 f"{ia['sans_image_valide']} annonce(s) sans image valide")
106 106 except Exception as exc:
107 107 print(f"[immo-ka] imgaudit: erreur non bloquante: {exc}", file=sys.stderr)
108 − print(f"[immo-ka] prochaine synchronisation dans {interval_seconds // 60} min")
109 108 try: # estimation Hydro-Québec des nouvelles annonces (cache persistant, coût borné)
110 109 from . import hydro
111 110 hydro.precompute(limit=100, budget=30)
112 111 except Exception as exc:
113 112 print(f"[immoka] hydro: erreur non bloquante: {exc}", file=sys.stderr)
113 + try: # taux hypothécaires — collecte espacée (IMMOKA_MORTGAGE_INTERVAL_MIN)
114 + from .mortgage import scheduler as mortgage_scheduler
115 + mortgage_scheduler.maybe_run()
116 + except Exception as exc:
117 + print(f"[immo-ka] mortgage: erreur non bloquante: {exc}", file=sys.stderr)
118 + print(f"[immo-ka] prochaine synchronisation dans {interval_seconds // 60} min")
114 119 time.sleep(interval_seconds)
added immoka/mortgage/__init__.py +7 −0
@@ -0,0 +1,7 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/ : moteur hypothécaire canadien — collecte des taux publiés par les
5 +# institutions financières, historisation, calculs (composition
6 +# semestrielle canadienne, SCHL, stress test, abordabilité).
7 +# -----------------------------------------------------------------------------
added immoka/mortgage/api.py +373 −0
@@ -0,0 +1,373 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/api.py : routes /api/mortgage/* — taux courants, meilleur taux,
5 +# historique, santé des providers, calculateur canadien, abordabilité.
6 +# Lecture seule sur mortgage.db (le scheduler écrit) ; cache applicatif
7 +# 5 min sur les lectures ; jamais d'internals de scraping exposés (le champ
8 +# raw est retiré au niveau du store).
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import time
13 +
14 +from fastapi import APIRouter, Body, HTTPException, Query
15 +
16 +from . import calc, cmhc, store
17 +
18 +router = APIRouter(prefix="/api/mortgage", tags=["mortgage"])
19 +
20 +CACHE_TTL_S = 300
21 +_cache: dict[str, tuple[float, object]] = {}
22 +
23 +RATE_TYPES = {"fixed", "variable", "adjustable", "other"}
24 +KINDS = {"posted", "special"}
25 +INSURED = {"insured", "insurable", "uninsured", "unknown"}
26 +
27 +
28 +def _cached(key: str, builder):
29 + hit = _cache.get(key)
30 + now = time.time()
31 + if hit and now - hit[0] < CACHE_TTL_S:
32 + return hit[1]
33 + value = builder()
34 + _cache[key] = (now, value)
35 + if len(_cache) > 512: # borne mémoire : purge des entrées expirées
36 + for k in [k for k, (t, _) in _cache.items() if now - t >= CACHE_TTL_S]:
37 + _cache.pop(k, None)
38 + return value
39 +
40 +
41 +def _check(value, allowed: set, label: str):
42 + if value is not None and value not in allowed:
43 + raise HTTPException(422, f"{label} invalide : {value}")
44 + return value
45 +
46 +
47 +@router.get("/rates")
48 +def rates(rate_type: str | None = None, term_months: int | None = None,
49 + kind: str | None = None, insured_status: str | None = None,
50 + purpose: str | None = Query("purchase"),
51 + provider: str | None = None):
52 + """Taux courants (dernière donnée valide par produit), filtrables."""
53 + _check(rate_type, RATE_TYPES, "rate_type")
54 + _check(kind, KINDS, "kind")
55 + _check(insured_status, INSURED, "insured_status")
56 + if purpose in ("", "all"):
57 + purpose = None
58 + key = f"rates|{rate_type}|{term_months}|{kind}|{insured_status}|{purpose}|{provider}"
59 +
60 + def build():
61 + con = store.connect()
62 + rows = store.current_rates(
63 + con, rate_type=rate_type, term_months=term_months, kind=kind,
64 + insured_status=insured_status, purpose=purpose, provider=provider)
65 + con.close()
66 + return {"count": len(rows), "rates": rows,
67 + "stale_hours_threshold": store.STALE_H}
68 + return _cached(key, build)
69 +
70 +
71 +@router.get("/rates/best")
72 +def rates_best(rate_type: str = "fixed", term_months: int = 60,
73 + insured_status: str | None = None, purpose: str = "purchase"):
74 + """Meilleur taux courant par produit comparable + comparateur par banque."""
75 + _check(rate_type, RATE_TYPES, "rate_type")
76 + _check(insured_status, INSURED, "insured_status")
77 + key = f"best|{rate_type}|{term_months}|{insured_status}|{purpose}"
78 +
79 + def build():
80 + con = store.connect()
81 + best = store.best_rate(con, rate_type=rate_type,
82 + term_months=term_months,
83 + insured_status=insured_status, purpose=purpose)
84 + con.close()
85 + if best is None:
86 + raise HTTPException(404, "Aucun taux courant pour ces critères")
87 + return best
88 + return _cached(key, build)
89 +
90 +
91 +@router.get("/rates/history")
92 +def rates_history(rate_type: str = "fixed", term_months: int = 60,
93 + provider: str | None = None, kind: str | None = None,
94 + days: int = 365):
95 + """Périodes de validité par produit — reconstruit « le taux X à date ». """
96 + _check(rate_type, RATE_TYPES, "rate_type")
97 + _check(kind, KINDS, "kind")
98 + days = max(1, min(days, 730))
99 + key = f"hist|{rate_type}|{term_months}|{provider}|{kind}|{days}"
100 +
101 + def build():
102 + con = store.connect()
103 + rows = store.history(con, rate_type, term_months,
104 + provider=provider, kind=kind, days=days)
105 + con.close()
106 + return {"count": len(rows), "days": days, "history": rows}
107 + return _cached(key, build)
108 +
109 +
110 +@router.get("/providers")
111 +def providers():
112 + """Santé des connecteurs de taux (OK / WARNING / ERROR + fraîcheur)."""
113 + def build():
114 + from .providers import PROVIDERS
115 + con = store.connect()
116 + health = store.provider_health(con)
117 + con.close()
118 + names = {slug: cls.institution for slug, cls in PROVIDERS.items()}
119 + urls = {slug: cls.source_url for slug, cls in PROVIDERS.items()}
120 + out = []
121 + for h in health:
122 + out.append({
123 + "provider": h["provider"],
124 + "institution": names.get(h["provider"], h["provider"]),
125 + "source_url": urls.get(h["provider"]),
126 + "level": h["level"],
127 + "status": h["status"],
128 + "age_minutes": h["age_minutes"],
129 + "current_products": h["current_products"],
130 + "last_data_at": h["last_data_at"],
131 + })
132 + return {"providers": out,
133 + "registered": sorted(names),
134 + "stale_hours_threshold": store.STALE_H}
135 + return _cached("providers", build)
136 +
137 +
138 +@router.get("/market")
139 +def market(rate_type: str = "fixed", term_months: int = 60):
140 + """Métriques Mortgage Intelligence pour un produit donné."""
141 + _check(rate_type, RATE_TYPES, "rate_type")
142 +
143 + def build():
144 + con = store.connect()
145 + stats = store.market_stats(con, rate_type=rate_type,
146 + term_months=term_months)
147 + con.close()
148 + if stats is None:
149 + raise HTTPException(404, "Aucun taux courant pour ces critères")
150 + return stats
151 + return _cached(f"market|{rate_type}|{term_months}", build)
152 +
153 +
154 +@router.get("/intelligence")
155 +def intelligence():
156 + """Vue d'ensemble du marché : les produits phares en un appel."""
157 + def build():
158 + con = store.connect()
159 + combos = [("fixed", 12), ("fixed", 36), ("fixed", 48),
160 + ("fixed", 60), ("fixed", 120), ("variable", 60)]
161 + grid = []
162 + for rtype, term in combos:
163 + s = store.market_stats(con, rate_type=rtype, term_months=term)
164 + if s:
165 + grid.append(s)
166 + prime_rows = store.current_rates(con, rate_type="other")
167 + con.close()
168 + prime = [{"institution": r["institution"], "rate": r["rate"],
169 + "product_name": r["product_name"],
170 + "age_minutes": r["age_minutes"]}
171 + for r in prime_rows if "préférentiel" in
172 + (r["product_name"] or "").lower() or "prime" in
173 + (r["product_name"] or "").lower()]
174 + return {"products": grid, "prime_rates": prime}
175 + return _cached("intelligence", build)
176 +
177 +
178 +# ---------------------------------------------------------------------------
179 +# Calculateur
180 +# ---------------------------------------------------------------------------
181 +
182 +def _pick_rate(rate_type: str, term_months: int,
183 + insured_status: str | None) -> dict | None:
184 + con = store.connect()
185 + best = store.best_rate(con, rate_type=rate_type, term_months=term_months,
186 + insured_status=insured_status)
187 + con.close()
188 + return best
189 +
190 +
191 +def _validate_scenario(price: float, down: float, amort: int, term: int,
192 + frequency: str) -> None:
193 + if price <= 0 or price > 100_000_000:
194 + raise HTTPException(422, "Prix invalide")
195 + if down < 0 or down >= price:
196 + raise HTTPException(422, "Mise de fonds invalide")
197 + if amort not in calc.AMORTIZATIONS_YEARS and not (5 <= amort <= 30):
198 + raise HTTPException(422, "Amortissement invalide (5–30 ans)")
199 + if not 3 <= term <= 120:
200 + raise HTTPException(422, "Terme invalide (3–120 mois)")
201 + if frequency not in calc.FREQUENCIES:
202 + raise HTTPException(422, f"Fréquence invalide : {frequency}")
203 +
204 +
205 +@router.post("/calculate")
206 +def calculate(body: dict = Body(...)):
207 + """Calcul hypothécaire canadien complet pour un scénario.
208 +
209 + Entrées : price, down_payment (ou down_payment_pct), amortization_years,
210 + term_months, frequency, rate_type, rate (sinon meilleur taux observé),
211 + insured_status?, include_schedule?, income?, other_debts_monthly?,
212 + property_tax_monthly?, heating_monthly?, condo_fees_monthly?.
213 + """
214 + try:
215 + price = float(body.get("price") or 0)
216 + if body.get("down_payment") is not None:
217 + down = float(body["down_payment"])
218 + else:
219 + down = price * float(body.get("down_payment_pct") or 20) / 100
220 + amort = int(body.get("amortization_years") or 25)
221 + term = int(body.get("term_months") or 60)
222 + frequency = str(body.get("frequency") or "monthly")
223 + rate_type = str(body.get("rate_type") or "fixed")
224 + except (TypeError, ValueError):
225 + raise HTTPException(422, "Paramètres numériques invalides")
226 + _check(rate_type, {"fixed", "variable"}, "rate_type")
227 + _validate_scenario(price, down, amort, term, frequency)
228 +
229 + quote = cmhc.insurance_quote(price, down, amort)
230 + rate_source = None
231 + rate = body.get("rate")
232 + if rate is None:
233 + insured = "insured" if quote["required"] and quote["eligible"] else None
234 + best = _pick_rate(rate_type, term, insured)
235 + if best is None:
236 + raise HTTPException(
237 + 503, "Aucun taux courant disponible — réessayez plus tard")
238 + rate = best["rate"]
239 + rate_source = {k: best[k] for k in
240 + ("provider", "institution", "product_name", "kind",
241 + "rate", "apr", "insured_status", "source_url",
242 + "last_checked", "age_minutes", "stale")}
243 + rate = float(rate)
244 + if not 0 < rate <= 25:
245 + raise HTTPException(422, "Taux invalide")
246 + if quote["required"] and not quote["eligible"]:
247 + principal = price - down # non assurable : calcul quand même, signalé
248 + else:
249 + principal = quote["total_mortgage"] if quote["required"] else price - down
250 +
251 + compounding = "semi-annual" if rate_type == "fixed" else "monthly"
252 + pay = calc.payment(principal, rate, amort, frequency, compounding)
253 + monthly_eq = calc.payment(principal, rate, amort, "monthly", compounding)
254 + q_rate = calc.qualifying_rate(rate)
255 + q_pay = calc.payment(principal, q_rate, amort, frequency, compounding)
256 + out = {
257 + "inputs": {"price": price, "down_payment": round(down, 2),
258 + "down_payment_pct": round(down / price * 100, 2),
259 + "rate": rate, "rate_type": rate_type,
260 + "term_months": term, "amortization_years": amort,
261 + "frequency": frequency, "compounding": compounding},
262 + "insurance": quote,
263 + "principal": round(principal, 2),
264 + "payment": pay,
265 + "payment_monthly_equivalent": monthly_eq,
266 + "qualifying": {"rate": q_rate, "payment": q_pay,
267 + "note": "Test de résistance : max(taux + 2, 5,25 %)"},
268 + "term": calc.term_summary(principal, rate, amort, term,
269 + frequency, compounding),
270 + "stress": calc.stress_scenarios(principal, rate, amort,
271 + frequency, compounding),
272 + "renewal": calc.renewal_scenarios(principal, rate, amort, term,
273 + frequency, compounding),
274 + "payoff_years": calc.payoff_years(principal, rate, amort,
275 + frequency, compounding),
276 + "rate_source": rate_source,
277 + }
278 + rows = calc.schedule(principal, rate, amort, frequency, compounding)
279 + out["annual"] = calc.annual_rollup(rows, frequency)
280 + if body.get("include_schedule"):
281 + out["schedule"] = rows
282 + income = body.get("income")
283 + if income:
284 + out["ratios"] = calc.gds_tds(
285 + float(income), monthly_eq,
286 + float(body.get("property_tax_monthly") or 0),
287 + float(body.get("heating_monthly") or 0),
288 + float(body.get("condo_fees_monthly") or 0),
289 + float(body.get("other_debts_monthly") or 0))
290 + return out
291 +
292 +
293 +@router.post("/affordability")
294 +def affordability(body: dict = Body(...)):
295 + """Capacité d'achat : prix max selon un versement cible OU selon les
296 + revenus (ABD/ATD au taux de qualification) ; taux requis pour un
297 + versement cible vs meilleur taux observé."""
298 + try:
299 + amort = int(body.get("amortization_years") or 25)
300 + term = int(body.get("term_months") or 60)
301 + frequency = str(body.get("frequency") or "monthly")
302 + rate_type = str(body.get("rate_type") or "fixed")
303 + down = float(body.get("down_payment") or 0)
304 + except (TypeError, ValueError):
305 + raise HTTPException(422, "Paramètres numériques invalides")
306 + _check(rate_type, {"fixed", "variable"}, "rate_type")
307 + if frequency not in calc.FREQUENCIES:
308 + raise HTTPException(422, f"Fréquence invalide : {frequency}")
309 +
310 + rate = body.get("rate")
311 + rate_source = None
312 + if rate is None:
313 + best = _pick_rate(rate_type, term, None)
314 + if best is None:
315 + raise HTTPException(
316 + 503, "Aucun taux courant disponible — réessayez plus tard")
317 + rate = best["rate"]
318 + rate_source = {k: best[k] for k in
319 + ("provider", "institution", "product_name", "kind",
320 + "rate", "source_url", "age_minutes", "stale")}
321 + rate = float(rate)
322 + if not 0 < rate <= 25:
323 + raise HTTPException(422, "Taux invalide")
324 + compounding = "semi-annual" if rate_type == "fixed" else "monthly"
325 + q_rate = calc.qualifying_rate(rate)
326 + out: dict = {"rate": rate, "qualifying_rate": q_rate,
327 + "rate_source": rate_source}
328 +
329 + target = body.get("target_payment_monthly")
330 + if target:
331 + target = float(target)
332 + loan = calc.max_loan(target, rate, amort, "monthly", compounding)
333 + loan_q = calc.max_loan(target, q_rate, amort, "monthly", compounding)
334 + out["from_payment"] = {
335 + "target_payment_monthly": target,
336 + "max_loan": loan, "max_price": round(loan + down, 2),
337 + "max_loan_stress_tested": loan_q,
338 + "max_price_stress_tested": round(loan_q + down, 2),
339 + }
340 + income = body.get("income")
341 + if income:
342 + income = float(income)
343 + gds_room = income / 12 * 0.39 \
344 + - float(body.get("property_tax_monthly") or 0) \
345 + - float(body.get("heating_monthly") or 0) \
346 + - float(body.get("condo_fees_monthly") or 0) * 0.5
347 + tds_room = income / 12 * 0.44 \
348 + - float(body.get("property_tax_monthly") or 0) \
349 + - float(body.get("heating_monthly") or 0) \
350 + - float(body.get("condo_fees_monthly") or 0) * 0.5 \
351 + - float(body.get("other_debts_monthly") or 0)
352 + room = max(0.0, min(gds_room, tds_room))
353 + loan_q = calc.max_loan(room, q_rate, amort, "monthly", compounding)
354 + out["from_income"] = {
355 + "income": income, "max_payment_monthly": round(room, 2),
356 + "max_loan_stress_tested": loan_q,
357 + "max_price_estimate": round(loan_q + down, 2),
358 + "note": ("Indicatif seulement (ABD 39 % / ATD 44 % au taux de "
359 + "qualification) — ne constitue pas une préapprobation."),
360 + }
361 + principal = body.get("principal")
362 + target_rate_payment = body.get("required_rate_for_payment")
363 + if principal and target_rate_payment:
364 + req = calc.required_rate(float(principal), float(target_rate_payment),
365 + amort, "monthly", compounding)
366 + out["required_rate"] = {
367 + "principal": float(principal),
368 + "target_payment_monthly": float(target_rate_payment),
369 + "rate": req,
370 + "achievable_now": req is not None and req >= rate,
371 + "best_observed": rate,
372 + }
373 + return out
added immoka/mortgage/calc.py +257 −0
@@ -0,0 +1,257 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/calc.py : mathématiques hypothécaires canadiennes.
5 +# Taux fixes : intérêt composé SEMESTRIELLEMENT, non à l'avance (Loi sur
6 +# l'intérêt, art. 6) — jamais la formule américaine (composition mensuelle).
7 +# Taux variables : composition mensuelle (convention majoritaire des
8 +# prêteurs canadiens).
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import math
13 +
14 +# Fréquences de paiement : nombre de versements par année.
15 +FREQUENCIES: dict[str, int] = {
16 + "monthly": 12,
17 + "semimonthly": 24,
18 + "biweekly": 26,
19 + "accelerated-biweekly": 26,
20 + "weekly": 52,
21 + "accelerated-weekly": 52,
22 +}
23 +
24 +# Taux de qualification minimal (test de résistance B-20 / ligne directrice
25 +# du BSIF) : max(taux contractuel + 2 points, plancher).
26 +STRESS_TEST_FLOOR = 5.25
27 +STRESS_TEST_BUFFER = 2.0
28 +
29 +AMORTIZATIONS_YEARS = [10, 15, 20, 25, 30]
30 +TERMS_MONTHS = [12, 24, 36, 48, 60, 84, 120]
31 +
32 +
33 +def periodic_rate(annual_pct: float, frequency: str = "monthly",
34 + compounding: str = "semi-annual") -> float:
35 + """Taux périodique équivalent au taux nominal annuel `annual_pct` (%).
36 +
37 + compounding="semi-annual" : convention canadienne des prêts fixes —
38 + i = (1 + r/2)^(2/f) − 1. "monthly" : prêts variables — i = (1+r/12)^(12/f) − 1.
39 + """
40 + if annual_pct < 0:
41 + raise ValueError("taux négatif")
42 + f = FREQUENCIES[frequency]
43 + r = annual_pct / 100.0
44 + if compounding == "monthly":
45 + return (1.0 + r / 12.0) ** (12.0 / f) - 1.0
46 + return (1.0 + r / 2.0) ** (2.0 / f) - 1.0
47 +
48 +
49 +def payment(principal: float, annual_pct: float, amort_years: float,
50 + frequency: str = "monthly",
51 + compounding: str = "semi-annual") -> float:
52 + """Versement périodique (arrondi au cent).
53 +
54 + Fréquences accélérées : convention canadienne — le versement mensuel
55 + divisé par 2 (aux deux semaines) ou par 4 (hebdomadaire), ce qui raccourcit
56 + l'amortissement réel.
57 + """
58 + if principal <= 0:
59 + return 0.0
60 + if frequency in ("accelerated-biweekly", "accelerated-weekly"):
61 + m = payment(principal, annual_pct, amort_years, "monthly", compounding)
62 + return round(m / (2 if frequency == "accelerated-biweekly" else 4), 2)
63 + i = periodic_rate(annual_pct, frequency, compounding)
64 + n = round(amort_years * FREQUENCIES[frequency])
65 + if i == 0:
66 + return round(principal / n, 2)
67 + return round(principal * i / (1.0 - (1.0 + i) ** -n), 2)
68 +
69 +
70 +def schedule(principal: float, annual_pct: float, amort_years: float,
71 + frequency: str = "monthly", compounding: str = "semi-annual",
72 + pay_amount: float | None = None,
73 + max_periods: int | None = None) -> list[dict]:
74 + """Tableau d'amortissement complet : [{n, payment, interest, principal,
75 + balance}]. Le dernier versement est ajusté au solde exact. Les fréquences
76 + accélérées s'éteignent avant l'amortissement contractuel (comportement
77 + attendu). `max_periods` borne la simulation (ex. durée du terme)."""
78 + if principal <= 0:
79 + return []
80 + i = periodic_rate(annual_pct, frequency, compounding)
81 + pmt = pay_amount if pay_amount is not None else payment(
82 + principal, annual_pct, amort_years, frequency, compounding)
83 + if pmt <= 0:
84 + return []
85 + hard_cap = round(amort_years * FREQUENCIES[frequency]) + FREQUENCIES[frequency]
86 + if frequency.startswith("accelerated"):
87 + hard_cap = round(40 * FREQUENCIES[frequency]) # s'éteint plus tôt
88 + limit = min(max_periods, hard_cap) if max_periods else hard_cap
89 + rows: list[dict] = []
90 + bal = round(principal, 2)
91 + n = 0
92 + while bal > 0.005 and n < limit:
93 + n += 1
94 + interest = round(bal * i, 2)
95 + cap = round(pmt - interest, 2)
96 + if cap <= 0 and n > 1:
97 + break # paiement insuffisant : ne jamais boucler à l'infini
98 + if cap >= bal: # dernier versement ajusté
99 + cap = bal
100 + row_pay = round(cap + interest, 2)
101 + else:
102 + row_pay = pmt
103 + bal = round(bal - cap, 2)
104 + rows.append({"n": n, "payment": row_pay, "interest": interest,
105 + "principal": cap, "balance": bal})
106 + return rows
107 +
108 +
109 +def annual_rollup(rows: list[dict], frequency: str = "monthly") -> list[dict]:
110 + """Agrège un tableau d'amortissement par année de prêt."""
111 + f = FREQUENCIES[frequency]
112 + out: list[dict] = []
113 + for r in rows:
114 + year = (r["n"] - 1) // f + 1
115 + if not out or out[-1]["year"] != year:
116 + out.append({"year": year, "payment": 0.0, "interest": 0.0,
117 + "principal": 0.0, "balance": r["balance"]})
118 + acc = out[-1]
119 + acc["payment"] = round(acc["payment"] + r["payment"], 2)
120 + acc["interest"] = round(acc["interest"] + r["interest"], 2)
121 + acc["principal"] = round(acc["principal"] + r["principal"], 2)
122 + acc["balance"] = r["balance"]
123 + return out
124 +
125 +
126 +def term_summary(principal: float, annual_pct: float, amort_years: float,
127 + term_months: int, frequency: str = "monthly",
128 + compounding: str = "semi-annual") -> dict:
129 + """Bilan du terme : versement, nombre de versements, capital payé,
130 + intérêts payés, solde à l'échéance du terme."""
131 + f = FREQUENCIES[frequency]
132 + n_term = round(f * term_months / 12)
133 + rows = schedule(principal, annual_pct, amort_years, frequency,
134 + compounding, max_periods=n_term)
135 + pmt = payment(principal, annual_pct, amort_years, frequency, compounding)
136 + interest = round(sum(r["interest"] for r in rows), 2)
137 + cap = round(sum(r["principal"] for r in rows), 2)
138 + balance = rows[-1]["balance"] if rows else round(principal, 2)
139 + payments_per_year = f
140 + return {
141 + "payment": pmt,
142 + "frequency": frequency,
143 + "payments_per_year": payments_per_year,
144 + "payments_in_term": len(rows),
145 + "annual_cost": round(pmt * payments_per_year, 2),
146 + "principal_paid": cap,
147 + "interest_paid": interest,
148 + "balance_end_of_term": balance,
149 + "paid_off": balance <= 0.005,
150 + }
151 +
152 +
153 +def payoff_years(principal: float, annual_pct: float, amort_years: float,
154 + frequency: str, compounding: str = "semi-annual") -> float:
155 + """Durée réelle d'extinction (années) — utile pour les fréquences
156 + accélérées qui raccourcissent l'amortissement."""
157 + rows = schedule(principal, annual_pct, amort_years, frequency, compounding)
158 + if not rows or rows[-1]["balance"] > 0.005:
159 + return float(amort_years)
160 + return round(len(rows) / FREQUENCIES[frequency], 2)
161 +
162 +
163 +def max_loan(target_payment: float, annual_pct: float, amort_years: float,
164 + frequency: str = "monthly",
165 + compounding: str = "semi-annual") -> float:
166 + """Prêt maximal finançable avec un versement donné (calcul inverse)."""
167 + if target_payment <= 0:
168 + return 0.0
169 + if frequency in ("accelerated-biweekly", "accelerated-weekly"):
170 + # équivalent : versement mensuel = paiement × 2 ou × 4
171 + mult = 2 if frequency == "accelerated-biweekly" else 4
172 + return max_loan(target_payment * mult, annual_pct, amort_years,
173 + "monthly", compounding)
174 + i = periodic_rate(annual_pct, frequency, compounding)
175 + n = round(amort_years * FREQUENCIES[frequency])
176 + if i == 0:
177 + return round(target_payment * n, 2)
178 + return round(target_payment * (1.0 - (1.0 + i) ** -n) / i, 2)
179 +
180 +
181 +def required_rate(principal: float, target_payment: float, amort_years: float,
182 + frequency: str = "monthly",
183 + compounding: str = "semi-annual") -> float | None:
184 + """Taux annuel (%) tel que le versement du prêt = `target_payment`.
185 + Bisection sur [0, 25]. None si même 0 % ne suffit pas."""
186 + if principal <= 0 or target_payment <= 0:
187 + return None
188 + if payment(principal, 0.0, amort_years, frequency, compounding) > target_payment:
189 + return None
190 + lo, hi = 0.0, 25.0
191 + if payment(principal, hi, amort_years, frequency, compounding) < target_payment:
192 + return hi
193 + for _ in range(60):
194 + mid = (lo + hi) / 2
195 + if payment(principal, mid, amort_years, frequency, compounding) > target_payment:
196 + hi = mid
197 + else:
198 + lo = mid
199 + return round(lo, 2)
200 +
201 +
202 +def qualifying_rate(contract_pct: float) -> float:
203 + """Taux de qualification du test de résistance canadien."""
204 + return round(max(contract_pct + STRESS_TEST_BUFFER, STRESS_TEST_FLOOR), 2)
205 +
206 +
207 +def stress_scenarios(principal: float, annual_pct: float, amort_years: float,
208 + frequency: str = "monthly",
209 + compounding: str = "semi-annual",
210 + bumps: tuple = (0.0, 1.0, 2.0, 3.0)) -> list[dict]:
211 + """« Et si les taux montent ? » — versement à +0/+1/+2/+3 points."""
212 + return [{
213 + "bump": b,
214 + "rate": round(annual_pct + b, 2),
215 + "payment": payment(principal, annual_pct + b, amort_years,
216 + frequency, compounding),
217 + } for b in bumps]
218 +
219 +
220 +def renewal_scenarios(principal: float, annual_pct: float, amort_years: float,
221 + term_months: int, frequency: str = "monthly",
222 + compounding: str = "semi-annual",
223 + bumps: tuple = (-1.0, 0.0, 1.0, 2.0)) -> dict:
224 + """Scénario de renouvellement : solde restant à la fin du terme, puis
225 + versement recalculé sur l'amortissement résiduel à divers taux."""
226 + summary = term_summary(principal, annual_pct, amort_years, term_months,
227 + frequency, compounding)
228 + balance = summary["balance_end_of_term"]
229 + remaining_years = max(amort_years - term_months / 12.0, 1.0)
230 + rows = []
231 + for b in bumps:
232 + r = round(annual_pct + b, 2)
233 + if r <= 0 or balance <= 0:
234 + continue
235 + rows.append({"bump": b, "rate": r,
236 + "payment": payment(balance, r, remaining_years,
237 + frequency, compounding)})
238 + return {"balance_at_renewal": balance,
239 + "remaining_amortization_years": round(remaining_years, 1),
240 + "scenarios": rows}
241 +
242 +
243 +def gds_tds(gross_annual_income: float, mortgage_payment_monthly: float,
244 + property_tax_monthly: float = 0.0, heating_monthly: float = 0.0,
245 + condo_fees_monthly: float = 0.0,
246 + other_debts_monthly: float = 0.0) -> dict:
247 + """Ratios ABD/ATD (GDS/TDS). Convention : 50 % des frais de copropriété.
248 + Seuils usuels assurés SCHL : ABD ≤ 39 %, ATD ≤ 44 %. Informatif seulement."""
249 + if gross_annual_income <= 0:
250 + return {"gds": None, "tds": None, "gds_ok": None, "tds_ok": None}
251 + monthly_income = gross_annual_income / 12.0
252 + housing = (mortgage_payment_monthly + property_tax_monthly +
253 + heating_monthly + 0.5 * condo_fees_monthly)
254 + gds = round(100.0 * housing / monthly_income, 1)
255 + tds = round(100.0 * (housing + other_debts_monthly) / monthly_income, 1)
256 + return {"gds": gds, "tds": tds, "gds_ok": gds <= 39.0, "tds_ok": tds <= 44.0,
257 + "gds_limit": 39.0, "tds_limit": 44.0}
added immoka/mortgage/cmhc.py +123 −0
@@ -0,0 +1,123 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/cmhc.py : assurance prêt hypothécaire (SCHL / Sagen / Canada
5 +# Guaranty). Règles et barèmes isolés ici pour être mis à jour facilement.
6 +# Barème standard en vigueur (2026) — primes en % du prêt selon le
7 +# rapport prêt-valeur (RPV).
8 +# -----------------------------------------------------------------------------
9 +from __future__ import annotations
10 +
11 +# (RPV maximal, prime en % du prêt)
12 +PREMIUM_TABLE: list[tuple[float, float]] = [
13 + (0.65, 0.0060),
14 + (0.75, 0.0170),
15 + (0.80, 0.0240),
16 + (0.85, 0.0280),
17 + (0.90, 0.0310),
18 + (0.95, 0.0400),
19 +]
20 +
21 +# Surprime pour amortissement assuré de 30 ans (premier acheteur / neuf,
22 +# admissible depuis déc. 2024).
23 +SURCHARGE_30Y = 0.0020
24 +
25 +# Prix maximal admissible à l'assurance (porté de 1 M$ à 1,5 M$ en déc. 2024).
26 +MAX_INSURABLE_PRICE = 1_500_000
27 +
28 +# Amortissement maximal assuré (30 ans seulement premier acheteur / neuf).
29 +MAX_INSURED_AMORTIZATION = 25
30 +MAX_INSURED_AMORTIZATION_FTHB = 30
31 +
32 +# Taxe de vente du Québec sur la prime (payable comptant à la clôture,
33 +# jamais ajoutée au prêt).
34 +QC_TAX_ON_PREMIUM = 0.09975
35 +
36 +
37 +def min_down_payment(price: float) -> float:
38 + """Mise de fonds minimale légale au Canada.
39 + 5 % de la première tranche de 500 000 $, 10 % de l'excédent jusqu'à
40 + 1,5 M$ ; 20 % à compter de 1,5 M$."""
41 + if price <= 0:
42 + return 0.0
43 + if price >= MAX_INSURABLE_PRICE:
44 + return round(0.20 * price, 2)
45 + return round(0.05 * min(price, 500_000) + 0.10 * max(0.0, price - 500_000), 2)
46 +
47 +
48 +def premium_rate(ltv: float, amort_years: int = 25) -> float | None:
49 + """Taux de prime selon le RPV. None si RPV > 95 % (non assurable)."""
50 + if ltv <= 0:
51 + return 0.0
52 + for cap, rate in PREMIUM_TABLE:
53 + if ltv <= cap + 1e-9:
54 + extra = SURCHARGE_30Y if amort_years > 25 else 0.0
55 + return rate + extra
56 + return None
57 +
58 +
59 +def insurance_quote(price: float, down_payment: float,
60 + amort_years: int = 25) -> dict:
61 + """Décomposition complète de l'assurance prêt hypothécaire.
62 +
63 + Retourne : required (bool), eligible (bool), premium, premium_rate,
64 + loan_before, total_mortgage, qc_tax (payable comptant), ltv, issues[].
65 + Ne devine rien : si le scénario est inadmissible, le dit explicitement.
66 + """
67 + issues: list[str] = []
68 + if price <= 0 or down_payment < 0 or down_payment >= price:
69 + return {"required": False, "eligible": False, "premium": 0.0,
70 + "premium_rate": 0.0, "loan_before": max(price - down_payment, 0.0),
71 + "total_mortgage": max(price - down_payment, 0.0),
72 + "qc_tax": 0.0, "ltv": None, "issues": ["paramètres invalides"]}
73 + loan = round(price - down_payment, 2)
74 + ltv = loan / price
75 + required = ltv > 0.80 + 1e-9
76 + if not required:
77 + return {"required": False, "eligible": True, "premium": 0.0,
78 + "premium_rate": 0.0, "loan_before": loan,
79 + "total_mortgage": loan, "qc_tax": 0.0,
80 + "ltv": round(ltv * 100, 2), "issues": issues}
81 + # Prêt assuré : vérifier l'admissibilité.
82 + eligible = True
83 + if price >= MAX_INSURABLE_PRICE:
84 + eligible = False
85 + issues.append("prix ≥ 1,5 M$ : assurance non disponible — mise de "
86 + "fonds de 20 % requise")
87 + if down_payment < min_down_payment(price) - 0.01:
88 + eligible = False
89 + issues.append("mise de fonds sous le minimum légal "
90 + f"({min_down_payment(price):,.0f} $)".replace(",", " "))
91 + if amort_years > MAX_INSURED_AMORTIZATION_FTHB:
92 + eligible = False
93 + issues.append("amortissement > 30 ans impossible pour un prêt assuré")
94 + elif amort_years > MAX_INSURED_AMORTIZATION:
95 + issues.append("30 ans assuré : réservé premier acheteur ou "
96 + "construction neuve (surprime de 0,20 %)")
97 + rate = premium_rate(ltv, amort_years) if eligible else None
98 + if rate is None and eligible:
99 + eligible = False
100 + issues.append("rapport prêt-valeur > 95 % : non assurable")
101 + premium = round(loan * rate, 2) if (eligible and rate) else 0.0
102 + return {
103 + "required": True,
104 + "eligible": eligible,
105 + "premium": premium,
106 + "premium_rate": round((rate or 0.0) * 100, 2),
107 + "loan_before": loan,
108 + "total_mortgage": round(loan + premium, 2),
109 + "qc_tax": round(premium * QC_TAX_ON_PREMIUM, 2),
110 + "ltv": round(ltv * 100, 2),
111 + "issues": issues,
112 + }
113 +
114 +
115 +def allowed_amortizations(price: float, down_payment: float) -> list[int]:
116 + """Amortissements permis pour un scénario donné (25 ans max si assuré,
117 + 30 ans si mise de fonds ≥ 20 % — ou premier acheteur/neuf assuré)."""
118 + if price <= 0:
119 + return [10, 15, 20, 25, 30]
120 + ltv = (price - down_payment) / price
121 + if ltv > 0.80:
122 + return [10, 15, 20, 25, 30] # 30 = cas particulier (signalé par issues)
123 + return [10, 15, 20, 25, 30]
added immoka/mortgage/providers/README.md +85 −0
@@ -0,0 +1,85 @@
1 +# Providers de taux hypothécaires
2 +
3 +Un connecteur **indépendant** par institution. Auto-découverte : tout module du
4 +dossier définissant une sous-classe de `RateProvider` avec un `provider_id`
5 +non vide est enregistré dans `PROVIDERS` automatiquement (aucun registre à
6 +éditer). La panne d'un provider n'affecte jamais les autres.
7 +
8 +**Règle absolue : aucun taux inventé.** Un produit non confirmé sur la page
9 +officielle est simplement omis — jamais deviné, jamais de valeur par défaut.
10 +
11 +## Ajouter une institution (8 étapes)
12 +
13 +1. **Créer `<slug>.py`** dans ce dossier, avec une sous-classe de
14 + `RateProvider` :
15 +
16 + ```python
17 + from .base import RateProvider
18 +
19 + class MaBanque(RateProvider):
20 + provider_id = "ma_banque" # slug stable (clé BD)
21 + institution = "Ma Banque" # nom d'affichage fr-CA
22 + source_url = "https://mabanque.ca/taux-hypothecaires"
23 +
24 + def fetch(self) -> list[dict]:
25 + html = self.get(self.source_url).text # ou .json()
26 + return self.parse(html)
27 +
28 + def parse(self, html: str) -> list[dict]:
29 + ... # → [self.make_product(...), ...]
30 + ```
31 +
32 + Séparer `fetch()` (réseau) de `parse()` (pur) : les tests appellent
33 + `parse()` sur des fixtures, sans réseau.
34 +
35 +2. **Backend réseau** : `self.get(url)` (requests + politesse `request_delay`)
36 + d'abord ; `self.get_scrapfly(url, render_js=True)` **en dernier recours
37 + seulement** si le site bloque (403/JS requis).
38 +
39 +3. **Normaliser** chaque produit via `self.make_product(...)` :
40 + - `rate_type` : `fixed` / `variable` — ou **`other` pour tout taux
41 + préférentiel/prime/référence** (avec `purpose="unknown"`), afin qu'il ne
42 + tombe jamais dans un classement « meilleur taux d'achat » ;
43 + - `kind` : `posted` (affiché) ou `special` (offre spéciale) — ne jamais
44 + confondre ;
45 + - `insured_status` : `insured` / `insurable` / `uninsured`, ou `unknown`
46 + si la page ne le précise pas — ne pas deviner ;
47 + - `product_name` en français, explicite (ex. « Fixe fermé 5 ans ») ;
48 + - `apr` (TAP) seulement s'il est publié.
49 +
50 +4. **Aucune écriture BD** dans le provider : le scheduler valide
51 + (`validate_batch`) puis enregistre (`store.record_observations`). Ne pas
52 + filtrer soi-même les aberrations — la validation s'en charge et journalise.
53 +
54 +5. **Fixture** : sauvegarder la réponse réelle (HTML/JSON) dans
55 + `tests/fixtures/mortgage/<slug>.<ext>` (anonymisée si besoin, taille
56 + raisonnable — garder le bloc utile).
57 +
58 +6. **Test** : ajouter le slug dans `EXPECTED` de
59 + `tests/test_mortgage_providers.py` (fixture + nombre exact de produits) ;
60 + le test générique vérifie déjà validation propre, `source_url`,
61 + `institution` et la règle « préférentiel → other/unknown ». Ajouter un
62 + test ciblé sur 1–2 valeurs connues de la fixture.
63 +
64 +7. **Exécuter** :
65 +
66 + ```bash
67 + PYTHONPATH=. .venv/bin/python -P -m unittest tests.test_mortgage_providers
68 + .venv/bin/python run.py mortgage-sync ma_banque # collecte réelle
69 + .venv/bin/python run.py mortgage-status # santé
70 + ```
71 +
72 +8. **Vérifier en BD/API** : `GET /api/mortgage/rates?provider=ma_banque` —
73 + provenance (`source_url`), fraîcheur et nature correctes. C'est tout :
74 + ni web.py, ni le scheduler, ni le frontend n'ont besoin d'être modifiés.
75 +
76 +## Pièges connus
77 +
78 +- `4.19 % → 419` : toujours vérifier l'échelle ; la validation rejette
79 + > 24 %, mais un « 41,9 » passerait — parser au bon endroit.
80 +- Pages avec plusieurs onglets (assuré/non assuré) : étiqueter
81 + `insured_status` correctement plutôt que de tout mélanger.
82 +- Taux « ouverts » vs « fermés » : les distinguer dans `product_name`
83 + (ex. BNC publie « Fixe ouvert 1 an » à 9,65 % — ce n'est pas une erreur).
84 +- Ne jamais soumettre de formulaire ni simuler une demande de prêt : pages
85 + publiques de taux uniquement.
added immoka/mortgage/providers/__init__.py +25 −0
@@ -0,0 +1,25 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/ : un connecteur indépendant par institution financière.
5 +# Auto-découverte : tout module du dossier définissant une sous-classe de
6 +# RateProvider avec provider_id non vide est enregistré automatiquement
7 +# (même mécanique que immoka/connectors/).
8 +# -----------------------------------------------------------------------------
9 +from __future__ import annotations
10 +
11 +import importlib
12 +import pkgutil
13 +
14 +from .base import RateProvider
15 +
16 +PROVIDERS: dict[str, type[RateProvider]] = {}
17 +
18 +for _mod in pkgutil.iter_modules(__path__):
19 + if _mod.name.startswith("_") or _mod.name == "base":
20 + continue
21 + module = importlib.import_module(f".{_mod.name}", __name__)
22 + for obj in vars(module).values():
23 + if (isinstance(obj, type) and issubclass(obj, RateProvider)
24 + and obj is not RateProvider and obj.provider_id):
25 + PROVIDERS[obj.provider_id] = obj
added immoka/mortgage/providers/bank_of_canada.py +77 −0
@@ -0,0 +1,77 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/bank_of_canada.py : Banque du Canada — API Valet
5 +# (officielle, publique, JSON). Séries de référence : taux hypothécaire
6 +# conventionnel affiché 1/3/5 ans, taux directeur, rendement obligataire
7 +# 5 ans. purpose="unknown" : séries de RÉFÉRENCE, exclues du comparateur
8 +# de prêteurs (la BdC ne prête pas aux particuliers).
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +from .base import RateProvider
13 +
14 +SERIES_URL = ("https://www.bankofcanada.ca/valet/observations/"
15 + "V80691333,V80691334,V80691335,V39079,BD.CDN.5YR.DQ.YLD/"
16 + "json?recent=10")
17 +
18 +# série -> (terme mois, nom de produit)
19 +MORTGAGE_SERIES = {
20 + "V80691333": (12, "Taux hypothécaire conventionnel affiché — 1 an"),
21 + "V80691334": (36, "Taux hypothécaire conventionnel affiché — 3 ans"),
22 + "V80691335": (60, "Taux hypothécaire conventionnel affiché — 5 ans"),
23 +}
24 +CONTEXT_SERIES = {
25 + "V39079": "Taux cible du financement à un jour",
26 + "BD.CDN.5YR.DQ.YLD": "Rendement obligataire 5 ans — Gouvernement du Canada",
27 +}
28 +
29 +
30 +class BankOfCanadaProvider(RateProvider):
31 + provider_id = "bank_of_canada"
32 + institution = "Banque du Canada"
33 + source_url = "https://www.bankofcanada.ca/rates/interest-rates/"
34 + request_delay = 0.5
35 +
36 + def fetch(self) -> list[dict]:
37 + return self.parse(self.get(SERIES_URL).text)
38 +
39 + def parse(self, payload: str) -> list[dict]:
40 + import json
41 + data = json.loads(payload)
42 + observations = data.get("observations") or []
43 + # Séries à fréquences mélangées : garder la DERNIÈRE valeur par série.
44 + latest: dict[str, tuple[str, float]] = {}
45 + for obs in observations:
46 + d = obs.get("d", "")
47 + for sid, cell in obs.items():
48 + if sid == "d" or not isinstance(cell, dict):
49 + continue
50 + v = cell.get("v")
51 + if v in (None, ""):
52 + continue
53 + try:
54 + latest[sid] = (d, float(v))
55 + except ValueError:
56 + continue
57 + out: list[dict] = []
58 + for sid, (term, name) in MORTGAGE_SERIES.items():
59 + if sid not in latest:
60 + continue
61 + d, v = latest[sid]
62 + out.append(self.make_product(
63 + rate=v, rate_type="fixed", term_months=term, kind="posted",
64 + product_name=name, purpose="unknown",
65 + conditions=f"Série Valet {sid} — observation du {d} "
66 + "(moyenne hebdomadaire des taux affichés)",
67 + raw={"series": sid, "date": d, "value": v}))
68 + for sid, name in CONTEXT_SERIES.items():
69 + if sid not in latest:
70 + continue
71 + d, v = latest[sid]
72 + out.append(self.make_product(
73 + rate=v, rate_type="other", term_months=12, kind="posted",
74 + product_name=name, purpose="unknown",
75 + conditions=f"Série Valet {sid} — observation du {d}",
76 + raw={"series": sid, "date": d, "value": v}))
77 + return out
added immoka/mortgage/providers/base.py +133 −0
@@ -0,0 +1,133 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/base.py : classe de base des connecteurs de taux.
5 +# Contrat : fetch() retourne la liste des produits NORMALISÉS de
6 +# l'institution (dicts au format de make_product). Aucune écriture BD ici —
7 +# le scheduler valide puis enregistre. Jamais de taux inventé : un produit
8 +# non confirmé est simplement omis.
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import os
13 +import re
14 +import time
15 +
16 +import requests
17 +
18 +USER_AGENT = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
19 + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126 Safari/537.36 "
20 + "ImmoKaBot/1.0 (+https://www.immo-ka.com/bot; contact@spboucher.ai)")
21 +
22 +SCRAPFLY_API = "https://api.scrapfly.io/scrape"
23 +
24 +
25 +class RateProvider:
26 + provider_id: str = "" # slug (rbc, td, desjardins…)
27 + institution: str = "" # nom d'affichage
28 + source_url: str = "" # page officielle des taux (lien public)
29 + request_delay: float = 1.0 # politesse
30 + timeout: int = 30
31 +
32 + def __init__(self) -> None:
33 + self.session = requests.Session()
34 + self.session.headers["User-Agent"] = USER_AGENT
35 + self._last_request = 0.0
36 +
37 + # -- backends -------------------------------------------------------------
38 + def get(self, url: str, **kw) -> requests.Response:
39 + wait = self.request_delay - (time.time() - self._last_request)
40 + if wait > 0:
41 + time.sleep(wait)
42 + resp = self.session.get(url, timeout=self.timeout, **kw)
43 + self._last_request = time.time()
44 + resp.raise_for_status()
45 + return resp
46 +
47 + def get_scrapfly(self, url: str, render_js: bool = False,
48 + asp: bool = True, country: str = "ca") -> str:
49 + """HTML via Scrapfly (anti-bot) — dernier recours seulement."""
50 + key = os.environ.get("SCRAPFLY_KEY") or os.environ.get("SCRAPFLY_API_KEY")
51 + if not key:
52 + raise RuntimeError("SCRAPFLY_KEY manquant (voir .env)")
53 + params: dict = {"key": key, "url": url, "country": country}
54 + if asp:
55 + params["asp"] = "true"
56 + if render_js:
57 + params["render_js"] = "true"
58 + wait = self.request_delay - (time.time() - self._last_request)
59 + if wait > 0:
60 + time.sleep(wait)
61 + resp = requests.get(SCRAPFLY_API, params=params, timeout=180)
62 + self._last_request = time.time()
63 + try:
64 + return (resp.json().get("result") or {}).get("content") or ""
65 + except ValueError:
66 + return ""
67 +
68 + # -- normalisation --------------------------------------------------------
69 + def make_product(self, *, rate: float, rate_type: str, term_months: int,
70 + kind: str, product_name: str | None = None,
71 + apr: float | None = None,
72 + insured_status: str = "unknown",
73 + purpose: str = "purchase",
74 + amortization_max_years: int | None = None,
75 + conditions: str | None = None,
76 + source_url: str | None = None,
77 + confidence: float = 1.0,
78 + raw=None) -> dict:
79 + """Observation normalisée commune à tous les providers."""
80 + return {
81 + "provider": self.provider_id,
82 + "institution": self.institution,
83 + "product_name": product_name,
84 + "rate_type": rate_type,
85 + "term_months": int(term_months),
86 + "kind": kind,
87 + "rate": round(float(rate), 4),
88 + "apr": round(float(apr), 4) if apr is not None else None,
89 + "insured_status": insured_status,
90 + "purpose": purpose,
91 + "amortization_max_years": amortization_max_years,
92 + "conditions": conditions,
93 + "source_url": source_url or self.source_url,
94 + "confidence": confidence,
95 + "raw": raw,
96 + }
97 +
98 + # -- contrat --------------------------------------------------------------
99 + def fetch(self) -> list[dict]:
100 + raise NotImplementedError
101 +
102 + # Point d'entrée pour les tests avec fixtures : si le provider parse un
103 + # payload texte, il expose parse(payload) et fetch() = parse(download()).
104 + def parse(self, payload: str) -> list[dict]: # pragma: no cover
105 + raise NotImplementedError
106 +
107 +
108 +def parse_rate(text: str) -> float | None:
109 + """Extrait un taux en % d'un texte : '4,19 %', '4.19%', ' 4.19 '.
110 + Retourne None si introuvable — jamais de valeur devinée."""
111 + if text is None:
112 + return None
113 + m = re.search(r"(\d{1,2}(?:[.,]\d{1,4})?)\s*%?", str(text).strip())
114 + if not m:
115 + return None
116 + try:
117 + return float(m.group(1).replace(",", "."))
118 + except ValueError:
119 + return None
120 +
121 +
122 +def term_to_months(text: str) -> int | None:
123 + """'5 ans', '5 year', '5-year', '6 months', '6 mois' → mois."""
124 + if not text:
125 + return None
126 + t = str(text).lower()
127 + m = re.search(r"(\d{1,3})\s*(?:-|\s)?\s*(an|ans|année|year|yr)", t)
128 + if m:
129 + return int(m.group(1)) * 12
130 + m = re.search(r"(\d{1,3})\s*(?:-|\s)?\s*(mois|month)", t)
131 + if m:
132 + return int(m.group(1))
133 + return None
added immoka/mortgage/providers/bmo.py +135 −0
@@ -0,0 +1,135 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/bmo.py : BMO — 3 JSON publics public-data (spéciaux,
5 +# grille affichée EPM, prime). ⚠️ bmo.com filtre l'empreinte TLS (Akamai) :
6 +# cascade requests → curl_cffi (si dispo) → Scrapfly asp. Les clés Over25
7 +# sont les variantes amortissement > 25 ans ; 18YearOpen et 12Variable*
8 +# sont des reliquats hérités (valeurs figées) et sont ignorés.
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import json
13 +
14 +from .base import RateProvider
15 +
16 +URLS = {
17 + "ca-mortgages-special-rates":
18 + "https://www.bmo.com/public-data/api/v2.0/bmo-ca-mortgages-rates.json",
19 + "epm-mortgage":
20 + "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-mortgage.json",
21 + "epm-prime":
22 + "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-prime.json",
23 +}
24 +PAGE_URL = "https://www.bmo.com/en-ca/main/personal/mortgages/mortgage-rates/"
25 +
26 +# clé spéciale -> (rate_type, terme mois, nom, clé APR, amort max, insured)
27 +SPECIAL_MAP: dict[str, tuple] = {
28 + "fixed3YearClosedSpecial":
29 + ("fixed", 36, "Fixe fermé 3 ans (offre spéciale)",
30 + "fixed3YearClosedSpecialApr", 25, "unknown"),
31 + "fixed3YearClosedSpecialOver25":
32 + ("fixed", 36, "Fixe fermé 3 ans (offre spéciale, amort. >25 ans)",
33 + "fixed3YearClosedSpecialOver25Apr", 30, "uninsured"),
34 + "smartFixed5YearClosedSpecial":
35 + ("fixed", 60, "Smart Fixed fermé 5 ans (offre spéciale)",
36 + "smartFixed5YearClosedSpecialApr", 25, "uninsured"),
37 + "smartFixed5YearClosedHighRatioSpecial":
38 + ("fixed", 60, "Smart Fixed fermé 5 ans (offre spéciale, ratio élevé)",
39 + "smartFixed5YearClosedHighRatioSpecialApr", 25, "insured"),
40 + "variable5YearClosedSpecial":
41 + ("variable", 60, "Variable fermé 5 ans (offre spéciale)",
42 + "variable5YearClosedSpecialApr", 25, "unknown"),
43 + "variable5YearClosedSpecialOver25":
44 + ("variable", 60, "Variable fermé 5 ans (offre spéciale, amort. >25 ans)",
45 + "variable5YearClosedSpecialOver25Apr", 30, "uninsured"),
46 +}
47 +
48 +EPM_SKIP = {"18YearOpen", "12VariableLimited", "12VariableOpen"}
49 +
50 +
51 +def _num(v) -> float | None:
52 + try:
53 + return float(str(v).strip())
54 + except (TypeError, ValueError):
55 + return None
56 +
57 +
58 +class BmoProvider(RateProvider):
59 + provider_id = "bmo"
60 + institution = "BMO Banque de Montréal"
61 + source_url = PAGE_URL
62 + request_delay = 1.2
63 +
64 + def _get_json_text(self, url: str) -> str:
65 + try:
66 + return self.get(url).text
67 + except Exception: # noqa: BLE001 — TLS Akamai : on escalade
68 + pass
69 + try:
70 + from curl_cffi import requests as curl_requests
71 + resp = curl_requests.get(url, impersonate="chrome",
72 + timeout=self.timeout)
73 + resp.raise_for_status()
74 + return resp.text
75 + except ImportError:
76 + pass
77 + return self.get_scrapfly(url, render_js=False, asp=True)
78 +
79 + def fetch(self) -> list[dict]:
80 + docs: dict[str, dict] = {}
81 + for key, url in URLS.items():
82 + text = self._get_json_text(url)
83 + docs[key] = json.loads(text)
84 + return self.parse_docs(docs)
85 +
86 + def parse(self, payload: str) -> list[dict]:
87 + """Pour les tests fixtures : payload = JSON {clé: {url, payload}}."""
88 + data = json.loads(payload)
89 + docs: dict[str, dict] = {}
90 + for key, entry in data.items():
91 + doc = entry.get("payload") if isinstance(entry, dict) and \
92 + "payload" in entry else entry
93 + if isinstance(doc, str):
94 + doc = json.loads(doc)
95 + docs[key] = doc
96 + return self.parse_docs(docs)
97 +
98 + def parse_docs(self, docs: dict[str, dict]) -> list[dict]:
99 + out: list[dict] = []
100 + specials = docs.get("ca-mortgages-special-rates") or {}
101 + for key, (rtype, term, name, apr_key, amort, insured) in \
102 + SPECIAL_MAP.items():
103 + rate = _num(specials.get(key))
104 + if rate is None or rate <= 0:
105 + continue
106 + out.append(self.make_product(
107 + rate=rate, rate_type=rtype, term_months=term, kind="special",
108 + product_name=name, apr=_num(specials.get(apr_key)),
109 + insured_status=insured, amortization_max_years=amort,
110 + raw={"key": key, "value": specials.get(key)}))
111 + epm = docs.get("epm-mortgage") or {}
112 + grid = epm.get("mortgageRates") or epm
113 + for rtype_key, rtype, prefix in (("fixed", "fixed", "Fixe"),
114 + ("variable", "variable", "Variable")):
115 + for key, cell in (grid.get(rtype_key) or {}).items():
116 + if key in EPM_SKIP or not isinstance(cell, dict):
117 + continue
118 + rate = _num(cell.get("value"))
119 + term = _num(cell.get("term_months"))
120 + if rate is None or rate <= 0 or not term:
121 + continue
122 + label = cell.get("fr") or cell.get("en") or key
123 + out.append(self.make_product(
124 + rate=rate, rate_type=rtype, term_months=int(term),
125 + kind="posted", product_name=f"{prefix} {label}",
126 + raw={"key": key, "cell": cell}))
127 + prime = docs.get("epm-prime") or {}
128 + prime_rate = _num((prime.get("caPrimeRate") or {}).get("value"))
129 + if prime_rate and prime_rate > 0:
130 + out.append(self.make_product(
131 + rate=prime_rate, rate_type="other", term_months=12,
132 + kind="posted", product_name="Taux préférentiel BMO",
133 + purpose="unknown",
134 + raw={"caPrimeRate": prime.get("caPrimeRate")}))
135 + return out
added immoka/mortgage/providers/cibc.py +144 −0
@@ -0,0 +1,144 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/cibc.py : CIBC — pseudo-JSON JS productRatesLegacy
5 +# (blocs `var CODE = {...}` avec lignes [terme, ?, colId, valeur, …]).
6 +# colId 1 = affiché, 18 = spécial, 2 = APR du spécial ; sentinelle
7 +# -99.999999991 et spécial 0.00 = non publié ; colId 34 = colonne
8 +# d'identité inconnue, jamais devinée. MICRO/MICROVAR ne portent que
9 +# l'offre spéciale (leur « affiché » duplique FRCM).
10 +# -----------------------------------------------------------------------------
11 +from __future__ import annotations
12 +
13 +import re
14 +
15 +from .base import RateProvider
16 +
17 +BASE_URL = ("https://www.cibconline.cibc.com/ebm-pno/api/v1/json/"
18 + "productRatesLegacy?lobId={lob}&sourceProductCode={codes}")
19 +LOB5_CODES = "FRCM,FOM,CCM,5YRVARCLO,MICRO,MICROVAR,VROM"
20 +PAGE_URL = "https://www.cibc.com/en/interest-rates/mortgage-rates.html"
21 +
22 +COL_POSTED, COL_APR, COL_SPECIAL = 1, 2, 18
23 +SENTINEL = -99.0
24 +
25 +# code -> (rate_type, libellé de base, spécial seulement, libellé du spécial)
26 +PRODUCTS: dict[str, tuple] = {
27 + "FRCM": ("fixed", "Fixe fermé", False, "offre spéciale"),
28 + "FOM": ("fixed", "Fixe ouvert", False, "offre spéciale"),
29 + "CCM": ("fixed", "Fermé convertible", False, "offre spéciale"),
30 + "5YRVARCLO": ("variable", "Variable Flex fermé", False, "offre spéciale"),
31 + "VROM": ("variable", "Variable ouvert", False, "offre spéciale"),
32 + # MICRO/MICROVAR : l'offre mise en avant sur la page des taux — libellé
33 + # distinct pour ne pas entrer en collision avec le spécial FRCM/5YRVARCLO.
34 + "MICRO": ("fixed", "Fixe fermé", True, "offre annoncée"),
35 + "MICROVAR": ("variable", "Variable Flex fermé", True, "offre annoncée"),
36 +}
37 +
38 +BLOCK_RX = re.compile(r"var\s+(\w+)\s*=\s*\{(.*?)\]\s*\}", re.S)
39 +ROW_RX = re.compile(r"\[([^\[\]]*)\]")
40 +TERM_RX = re.compile(r"^(\d{1,3})_.*_(Year|Years|Month|Months)_T$")
41 +
42 +
43 +def _cells(row: str) -> list:
44 + out = []
45 + for cell in row.split(","):
46 + c = cell.strip().strip("'\"")
47 + out.append(None if c == "null" else c)
48 + return out
49 +
50 +
51 +def _term_months(token) -> int | None:
52 + m = TERM_RX.match(str(token or ""))
53 + if not m:
54 + return None
55 + n = int(m.group(1))
56 + return n * 12 if m.group(2).startswith("Year") else n
57 +
58 +
59 +def _num(v) -> float | None:
60 + try:
61 + return float(str(v).strip())
62 + except (TypeError, ValueError):
63 + return None
64 +
65 +
66 +def _label(months: int) -> str:
67 + if months < 12:
68 + return f"{months} mois"
69 + years = months // 12
70 + return f"{years} an" if years == 1 else f"{years} ans"
71 +
72 +
73 +class CibcProvider(RateProvider):
74 + provider_id = "cibc"
75 + institution = "CIBC"
76 + source_url = PAGE_URL
77 + request_delay = 1.2
78 +
79 + def fetch(self) -> list[dict]:
80 + text = self.get(BASE_URL.format(lob=5, codes=LOB5_CODES)).text
81 + try:
82 + text += "\n" + self.get(BASE_URL.format(lob=1, codes="PRIME")).text
83 + except Exception: # noqa: BLE001 — prime facultatif
84 + pass
85 + return self.parse(text)
86 +
87 + def parse(self, payload: str) -> list[dict]:
88 + out: list[dict] = []
89 + for var_name, body in BLOCK_RX.findall(payload):
90 + name = var_name[1:] if var_name[:1] == "p" and \
91 + var_name[1:2].isdigit() else var_name
92 + if name == "PRIME":
93 + out.extend(self._parse_prime(body))
94 + continue
95 + if name not in PRODUCTS:
96 + continue
97 + rtype, base_label, special_only, special_label = PRODUCTS[name]
98 + # (terme -> {colId: valeur})
99 + grid: dict[int, dict[int, float]] = {}
100 + for row in ROW_RX.findall(body):
101 + cells = _cells(row)
102 + if len(cells) < 4:
103 + continue
104 + term = _term_months(cells[0])
105 + col = _num(cells[2])
106 + val = _num(cells[3])
107 + if term is None or col is None or val is None:
108 + continue
109 + if val < SENTINEL + 1 or val <= 0:
110 + continue # sentinelle -99.999999991 ou 0.00 : non publié
111 + grid.setdefault(term, {})[int(col)] = val
112 + for term, cols in sorted(grid.items()):
113 + posted = cols.get(COL_POSTED)
114 + special = cols.get(COL_SPECIAL)
115 + if posted and not special_only:
116 + out.append(self.make_product(
117 + rate=posted, rate_type=rtype, term_months=term,
118 + kind="posted",
119 + product_name=f"{base_label} {_label(term)}",
120 + conditions="Base = taux préférentiel CIBC"
121 + if rtype == "variable" and name == "5YRVARCLO"
122 + else None,
123 + raw={"code": name, "cols": cols}))
124 + if special:
125 + out.append(self.make_product(
126 + rate=special, rate_type=rtype, term_months=term,
127 + kind="special", apr=cols.get(COL_APR),
128 + product_name=f"{base_label} {_label(term)} "
129 + f"({special_label})",
130 + raw={"code": name, "cols": cols}))
131 + return out
132 +
133 + def _parse_prime(self, body: str) -> list[dict]:
134 + for row in ROW_RX.findall(body):
135 + cells = _cells(row)
136 + if len(cells) < 4:
137 + continue
138 + rate = _num(cells[3])
139 + if rate and rate > 0:
140 + return [self.make_product(
141 + rate=rate, rate_type="other", term_months=12,
142 + kind="posted", product_name="Taux préférentiel CIBC",
143 + purpose="unknown", raw={"code": "PRIME", "value": rate})]
144 + return []
added immoka/mortgage/providers/desjardins.py +83 −0
@@ -0,0 +1,83 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/desjardins.py : Desjardins — JSON server-rendered
5 +# window.dcomProducts sur la page des taux. Clé = cfPath COMPLET (le même
6 +# id existe dans les familles « taux-hypothecaires » (affichés) et
7 +# « taux-hypothecaires-promotionnels » (spéciaux) avec des valeurs
8 +# différentes — ne jamais confondre).
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import json
13 +import re
14 +
15 +from .base import RateProvider
16 +
17 +PAGE_URL = "https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"
18 +
19 +# id Desjardins -> (rate_type, terme mois, nom, purpose)
20 +ID_MAP: dict[str, tuple] = {
21 + "6000_6M": ("fixed", 6, "Fixe fermé 6 mois"),
22 + "6000_1A": ("fixed", 12, "Fixe fermé 1 an"),
23 + "6000_2A": ("fixed", 24, "Fixe fermé 2 ans"),
24 + "6000_3A": ("fixed", 36, "Fixe fermé 3 ans"),
25 + "6000_4A": ("fixed", 48, "Fixe fermé 4 ans"),
26 + "6000_5A": ("fixed", 60, "Fixe fermé 5 ans"),
27 + "6000_6A": ("fixed", 72, "Fixe fermé 6 ans"),
28 + "6000_7A": ("fixed", 84, "Fixe fermé 7 ans"),
29 + "6000_10A": ("fixed", 120, "Fixe fermé 10 ans"),
30 + "6000_6MO": ("fixed", 6, "Fixe ouvert 6 mois"),
31 + "6000_1AO": ("fixed", 12, "Fixe ouvert 1 an"),
32 + "6004_5AR": ("variable", 60, "Variable réduit 5 ans"),
33 + "tvp": ("variable", 60, "Variable protégé 5 ans"),
34 + "tvred": ("variable", 60, "Variable réduit"),
35 + "tvreg": ("variable", 60, "Variable régulier"),
36 + "tra": ("fixed", 12, "Révisable annuellement"),
37 +}
38 +PRIME_ID = "tpcad"
39 +
40 +
41 +class DesjardinsProvider(RateProvider):
42 + provider_id = "desjardins"
43 + institution = "Desjardins"
44 + source_url = PAGE_URL
45 + request_delay = 1.5
46 +
47 + def fetch(self) -> list[dict]:
48 + return self.parse(self.get(self.source_url).text)
49 +
50 + def parse(self, payload: str) -> list[dict]:
51 + m = re.search(r"window\.dcomProducts\s*=\s*(\{.*?\});", payload, re.S)
52 + if not m:
53 + raise ValueError("dcomProducts introuvable (structure changée)")
54 + products = json.loads(m.group(1))
55 + out: list[dict] = []
56 + for cf_path, cell in products.items():
57 + if "/hypotheque/" not in cf_path or not isinstance(cell, dict):
58 + continue
59 + pid = cell.get("id") or ""
60 + try:
61 + rate = float(cell.get("rate"))
62 + except (TypeError, ValueError):
63 + continue
64 + if rate <= 0:
65 + continue
66 + promo = "taux-hypothecaires-promotionnels" in cf_path
67 + if pid == PRIME_ID:
68 + out.append(self.make_product(
69 + rate=rate, rate_type="other", term_months=12,
70 + kind="posted", product_name="Taux préférentiel Desjardins",
71 + purpose="unknown", raw={"cfPath": cf_path, "rate": rate}))
72 + continue
73 + if pid not in ID_MAP:
74 + continue # id inconnu : jamais deviné
75 + rtype, term, label = ID_MAP[pid]
76 + out.append(self.make_product(
77 + rate=rate, rate_type=rtype, term_months=term,
78 + kind="special" if promo else "posted",
79 + product_name=label + (" (promotion)" if promo else ""),
80 + conditions="Taux promotionnel Desjardins" if promo
81 + else "Taux affiché Desjardins",
82 + raw={"cfPath": cf_path, "id": pid, "rate": cell.get("rate")}))
83 + return out
added immoka/mortgage/providers/eq_bank.py +94 −0
@@ -0,0 +1,94 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/eq_bank.py : Banque EQ / Équitable — dictionnaire JSON
5 +# global embarqué dans le payload Next.js de la page des taux (marqueur
6 +# \"rates\":{ échappé). Clés CMS stables ; les clés « Adjustable » sont des
7 +# ÉCARTS vs prime (jamais interprétées comme des taux).
8 +# -----------------------------------------------------------------------------
9 +from __future__ import annotations
10 +
11 +import json
12 +
13 +from .base import RateProvider
14 +
15 +# clé CMS -> (rate_type, terme mois, kind, nom, clé APR éventuelle)
16 +KEY_MAP: dict[str, tuple] = {
17 + "mortgage-rate-fixed-5-year": ("fixed", 60, "special",
18 + "Fixe 5 ans (vitrine EQ)",
19 + "mortgage-rate-fixed-5-year-APR"),
20 + "mortgage-rate-variable-5-year": ("variable", 60, "special",
21 + "Variable 5 ans (vitrine EQ)",
22 + "mortgage-rate-variable-5-year-APR"),
23 + "es-fixed-12-month": ("fixed", 12, "special", "Evolution Suite — fixe 1 an", None),
24 + "es-fixed-24-month": ("fixed", 24, "special", "Evolution Suite — fixe 2 ans", None),
25 + "es-fixed-36-month": ("fixed", 36, "special", "Evolution Suite — fixe 3 ans", None),
26 + "es-fixed-48-month": ("fixed", 48, "special", "Evolution Suite — fixe 4 ans", None),
27 + "es-fixed-60-month": ("fixed", 60, "special", "Evolution Suite — fixe 5 ans", None),
28 + "Standard-Mortgage-Rate-1-Year-Fixed": ("fixed", 12, "posted", "Fixe affiché 1 an", None),
29 + "Standard-Mortgage-Rate-2-Year-Fixed": ("fixed", 24, "posted", "Fixe affiché 2 ans", None),
30 + "Standard-Mortgage-Rate-3-Year-Fixed": ("fixed", 36, "posted", "Fixe affiché 3 ans", None),
31 + "Standard-Mortgage-Rate-4-Year-Fixed": ("fixed", 48, "posted", "Fixe affiché 4 ans", None),
32 + "Standard-Mortgage-Rate-5-Year-Fixed": ("fixed", 60, "posted", "Fixe affiché 5 ans", None),
33 +}
34 +PRIME_KEY = "equitable-prime-rate"
35 +
36 +
37 +def extract_rates_blob(html: str) -> dict:
38 + """Isole le dictionnaire {clé: {name, rate}} du payload Next.js.
39 + Le JSON est échappé dans le HTML (\\\" -> \")."""
40 + marker = '\\"rates\\":{'
41 + i = html.find(marker)
42 + if i < 0:
43 + marker = '"rates":{'
44 + i = html.find(marker)
45 + if i < 0:
46 + raise ValueError("marqueur rates introuvable (structure changée)")
47 + seg = html[i:i + 400_000].replace('\\"', '"')
48 + start = seg.find("{")
49 + depth = 0
50 + for j, ch in enumerate(seg[start:], start):
51 + if ch == "{":
52 + depth += 1
53 + elif ch == "}":
54 + depth -= 1
55 + if depth == 0:
56 + return json.loads(seg[start:j + 1])
57 + raise ValueError("JSON rates non équilibré (structure changée)")
58 +
59 +
60 +class EqBankProvider(RateProvider):
61 + provider_id = "eq_bank"
62 + institution = "Banque EQ"
63 + source_url = "https://www.eqbank.ca/residential/mortgage-rates"
64 + request_delay = 1.0
65 +
66 + def fetch(self) -> list[dict]:
67 + return self.parse(self.get(self.source_url).text)
68 +
69 + def parse(self, payload: str) -> list[dict]:
70 + rates = extract_rates_blob(payload)
71 +
72 + def val(key: str) -> float | None:
73 + cell = rates.get(key)
74 + if isinstance(cell, dict) and isinstance(cell.get("rate"), (int, float)):
75 + return float(cell["rate"])
76 + return None
77 +
78 + out: list[dict] = []
79 + for key, (rtype, term, kind, name, apr_key) in KEY_MAP.items():
80 + rate = val(key)
81 + if rate is None:
82 + continue # clé absente : produit omis, jamais deviné
83 + apr = val(apr_key) if apr_key else None
84 + out.append(self.make_product(
85 + rate=rate, rate_type=rtype, term_months=term, kind=kind,
86 + product_name=name, apr=apr,
87 + raw={"key": key, "rate": rate, "apr": apr}))
88 + prime = val(PRIME_KEY)
89 + if prime is not None:
90 + out.append(self.make_product(
91 + rate=prime, rate_type="other", term_months=12, kind="posted",
92 + product_name="Taux préférentiel Banque Équitable",
93 + purpose="unknown", raw={"key": PRIME_KEY, "rate": prime}))
94 + return out
added immoka/mortgage/providers/first_national.py +97 −0
@@ -0,0 +1,97 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/first_national.py : First National — table HTML statique
5 +# (server-side, aucun anti-bot). Taux fixes fermés par catégorie
6 +# assuré/assurable(LTV)/conventionnel, ARM « Prime - X% », prime maison.
7 +# -----------------------------------------------------------------------------
8 +from __future__ import annotations
9 +
10 +import re
11 +
12 +from bs4 import BeautifulSoup
13 +
14 +from .base import RateProvider, parse_rate, term_to_months
15 +
16 +
17 +def _insured_status(category: str) -> str:
18 + c = category.lower()
19 + if c.startswith("insured"):
20 + return "insured"
21 + if c.startswith("insurable"):
22 + return "insurable"
23 + if c.startswith("conventional"):
24 + return "uninsured"
25 + return "unknown"
26 +
27 +
28 +class FirstNationalProvider(RateProvider):
29 + provider_id = "first_national"
30 + institution = "First National"
31 + source_url = "https://www.firstnational.ca/residential/mortgage-rates"
32 + request_delay = 1.0
33 +
34 + def fetch(self) -> list[dict]:
35 + return self.parse(self.get(self.source_url).text)
36 +
37 + def parse(self, payload: str) -> list[dict]:
38 + soup = BeautifulSoup(payload, "html.parser")
39 + out: list[dict] = []
40 + prime = None
41 + m = re.search(r"First National Prime Rate:\s*(?:</?\w+[^>]*>\s*)*([\d.]+)",
42 + payload)
43 + if m:
44 + prime = float(m.group(1))
45 + # -- taux fixes fermés (table avec aria-label par terme) --------------
46 + for h3 in soup.find_all("h3"):
47 + title = h3.get_text(" ", strip=True)
48 + table = h3.find_next("table")
49 + if table is None:
50 + continue
51 + if title.lower().startswith("fixed rate mortgages"):
52 + for tr in table.select("tbody tr"):
53 + th = tr.find("th")
54 + if th is None:
55 + continue
56 + category = re.sub(r"\s+", " ", th.get_text(" ", strip=True))
57 + status = _insured_status(category)
58 + for td in tr.find_all("td"):
59 + term = term_to_months(td.get("aria-label") or "")
60 + rate = parse_rate(td.get_text(strip=True))
61 + if term is None or rate is None:
62 + continue # cellule N/A : produit non offert
63 + out.append(self.make_product(
64 + rate=rate, rate_type="fixed", term_months=term,
65 + kind="posted",
66 + product_name=f"Fixe fermé — {category}",
67 + insured_status=status, conditions=category,
68 + raw={"category": category,
69 + "cell": td.get_text(strip=True)}))
70 + elif title.lower().startswith("adjustable rate"):
71 + if prime is None:
72 + continue # sans prime confirmée, ne rien deviner
73 + for tr in table.select("tbody tr"):
74 + th = tr.find("th")
75 + td = tr.find("td")
76 + if th is None or td is None:
77 + continue
78 + category = re.sub(r"\s+", " ", th.get_text(" ", strip=True))
79 + cell = td.get_text(" ", strip=True)
80 + dm = re.search(r"Prime\s*([+-])\s*([\d.]+)\s*%", cell)
81 + if not dm:
82 + continue
83 + delta = float(dm.group(2)) * (1 if dm.group(1) == "+" else -1)
84 + out.append(self.make_product(
85 + rate=round(prime + delta, 2), rate_type="adjustable",
86 + term_months=60, kind="special",
87 + product_name=f"ARM 5 ans — {category}",
88 + insured_status=_insured_status(category),
89 + conditions=f"{cell} (prime First National {prime} %)",
90 + raw={"category": category, "cell": cell,
91 + "prime": prime, "delta": delta}))
92 + if prime is not None:
93 + out.append(self.make_product(
94 + rate=prime, rate_type="other", term_months=12, kind="posted",
95 + product_name="Taux préférentiel First National",
96 + purpose="unknown", raw={"prime": prime}))
97 + return out
added immoka/mortgage/providers/mcap.py +40 −0
@@ -0,0 +1,40 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/mcap.py : MCAP — distribution 100 % courtiers, aucune
5 +# table publique de taux par terme (vérifié 2026-08). Seul signal public :
6 +# le taux préférentiel MCAP (+ date d'effet). Collecté comme référence,
7 +# exclu du comparateur de prêteurs (rate_type="other", purpose="unknown").
8 +# -----------------------------------------------------------------------------
9 +from __future__ import annotations
10 +
11 +import re
12 +
13 +from .base import RateProvider
14 +
15 +
16 +class McapProvider(RateProvider):
17 + provider_id = "mcap"
18 + institution = "MCAP"
19 + source_url = ("https://www.mcap.com/residential-mortgages/advice/"
20 + "mortgage-rates-canada")
21 + request_delay = 1.0
22 +
23 + def fetch(self) -> list[dict]:
24 + return self.parse(self.get(self.source_url).text)
25 +
26 + def parse(self, payload: str) -> list[dict]:
27 + m = re.search(
28 + r'prime-rate-module.*?round-number-box[^>]*>\s*([\d.]+)\s*%',
29 + payload, re.S)
30 + if not m:
31 + return []
32 + prime = float(m.group(1))
33 + dm = re.search(r'Effective\s+([A-Z][a-z]+ \d{1,2},? \d{4})', payload)
34 + conditions = ("Taux préférentiel MCAP"
35 + + (f" — en vigueur le {dm.group(1)}" if dm else ""))
36 + return [self.make_product(
37 + rate=prime, rate_type="other", term_months=12, kind="posted",
38 + product_name="Taux préférentiel MCAP", purpose="unknown",
39 + conditions=conditions,
40 + raw={"prime": prime, "effective": dm.group(1) if dm else None})]
added immoka/mortgage/providers/national_bank.py +131 −0
@@ -0,0 +1,131 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/national_bank.py : Banque Nationale — JSON double-échappé
5 +# setProductMap(JSON.parse("…")) dans la page des taux. c1 = produits
6 +# hypothécaires (par productConditionName). ⚠️ Séparateurs décimaux mixtes :
7 +# affichés « 6.090 » (point), promos « 4,84 » (virgule) — les tacNans sont
8 +# les APR des promos. Le tauxBase du produit variable est un ÉCART, pas la
9 +# prime : la prime vient du tauxBase du produit fixe.
10 +# -----------------------------------------------------------------------------
11 +from __future__ import annotations
12 +
13 +import json
14 +import re
15 +
16 +from .base import RateProvider
17 +
18 +PAGE_URL = "https://www.nbc.ca/personal/mortgages/rates.html"
19 +
20 +MAP_RX = re.compile(r'setProductMap\(JSON\.parse\("(.*?)"\)\)', re.S)
21 +
22 +# champs affichés fixes (fermés) -> terme mois ; taux1moisF exclu (< 3 mois)
23 +FIXED_POSTED = {
24 + "taux3moisF": 3, "taux6moisF": 6, "taux1anF": 12, "taux2ansF": 24,
25 + "taux3ansF": 36, "taux4ansF": 48, "taux5ansF": 60, "taux6ansF": 72,
26 + "taux7ansF": 84, "taux10ansF": 120,
27 +}
28 +FIXED_OPEN = {"taux6moisO": 6, "taux1anO": 12}
29 +# promo -> (terme mois, champ APR)
30 +FIXED_PROMO = {
31 + "tauxPromo3ansF": (36, "tac3ans"),
32 + "tauxPromo4ansF": (48, "tac4ans"),
33 + "tauxPromo5ansF": (60, "tac5ans"),
34 +}
35 +
36 +
37 +def _num(v) -> float | None:
38 + if v in (None, ""):
39 + return None
40 + try:
41 + return float(str(v).replace("\xa0", "").replace(",", ".").strip())
42 + except ValueError:
43 + return None
44 +
45 +
46 +class NationalBankProvider(RateProvider):
47 + provider_id = "national_bank"
48 + institution = "Banque Nationale"
49 + source_url = PAGE_URL
50 + request_delay = 1.5
51 +
52 + def fetch(self) -> list[dict]:
53 + return self.parse(self.get(self.source_url).text)
54 +
55 + def parse(self, payload: str) -> list[dict]:
56 + m = MAP_RX.search(payload)
57 + if not m:
58 + raise ValueError("setProductMap introuvable (structure changée)")
59 + dec = (m.group(1).replace("\\x22", '"')
60 + .replace("\\\\", "\\").replace("\\/", "/"))
61 + # la chaîne JS se termine par «"), true);» : raw_decode ignore la suite
62 + obj, _ = json.JSONDecoder().raw_decode(dec)
63 + products = json.loads(obj.get("c1") or "[]")
64 + by_name = {p.get("productConditionName"): p
65 + for p in products if isinstance(p, dict)}
66 + out: list[dict] = []
67 + fixed = by_name.get("Mortgage fixed rate") or {}
68 + for field, term in FIXED_POSTED.items():
69 + rate = _num(fixed.get(field))
70 + if rate and rate > 0:
71 + out.append(self.make_product(
72 + rate=rate, rate_type="fixed", term_months=term,
73 + kind="posted",
74 + product_name=f"Fixe fermé {_label(term)}",
75 + raw={"field": field, "value": fixed.get(field)}))
76 + for field, term in FIXED_OPEN.items():
77 + rate = _num(fixed.get(field))
78 + if rate and rate > 0:
79 + out.append(self.make_product(
80 + rate=rate, rate_type="fixed", term_months=term,
81 + kind="posted",
82 + product_name=f"Fixe ouvert {_label(term)}",
83 + raw={"field": field, "value": fixed.get(field)}))
84 + for field, (term, apr_field) in FIXED_PROMO.items():
85 + rate = _num(fixed.get(field))
86 + if rate and rate > 0:
87 + out.append(self.make_product(
88 + rate=rate, rate_type="fixed", term_months=term,
89 + kind="special", apr=_num(fixed.get(apr_field)),
90 + product_name=f"Fixe fermé {_label(term)} (promotion)",
91 + raw={"field": field, "value": fixed.get(field)}))
92 + prime = _num(fixed.get("tauxBase"))
93 + if prime and prime > 0:
94 + out.append(self.make_product(
95 + rate=prime, rate_type="other", term_months=12, kind="posted",
96 + product_name="Taux préférentiel BNC", purpose="unknown",
97 + raw={"field": "tauxBase", "value": fixed.get("tauxBase")}))
98 + variable = by_name.get("Mortgage variable rate") or {}
99 + v_posted = _num(variable.get("taux5ansO"))
100 + if v_posted and v_posted > 0:
101 + out.append(self.make_product(
102 + rate=v_posted, rate_type="variable", term_months=60,
103 + kind="posted", product_name="Variable 5 ans",
104 + conditions="Base = taux préférentiel BNC",
105 + raw={"field": "taux5ansO", "value": variable.get("taux5ansO")}))
106 + v_promo = _num(variable.get("tauxPromo5ansF"))
107 + if v_promo and v_promo > 0:
108 + out.append(self.make_product(
109 + rate=v_promo, rate_type="variable", term_months=60,
110 + kind="special", apr=_num(variable.get("tac5ans")),
111 + product_name="Variable 5 ans (promotion)",
112 + raw={"field": "tauxPromo5ansF",
113 + "value": variable.get("tauxPromo5ansF")}))
114 + capped = by_name.get("Variable capped-rate mortgage") or {}
115 + c_rate = _num(capped.get("taux5ansO"))
116 + if c_rate and c_rate > 0:
117 + cap = _num(capped.get("tauxPlafond"))
118 + out.append(self.make_product(
119 + rate=c_rate, rate_type="variable", term_months=60,
120 + kind="posted", product_name="Variable plafonné 5 ans",
121 + conditions=f"Taux plafond {cap} %" if cap else None,
122 + raw={"field": "taux5ansO", "value": capped.get("taux5ansO"),
123 + "tauxPlafond": capped.get("tauxPlafond")}))
124 + return out
125 +
126 +
127 +def _label(months: int) -> str:
128 + if months < 12:
129 + return f"{months} mois"
130 + years = months // 12
131 + return f"{years} an" if years == 1 else f"{years} ans"
added immoka/mortgage/providers/rbc.py +112 −0
@@ -0,0 +1,112 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/rbc.py : RBC — API JSON publique publicrates (celle que
5 +# consomme leur propre page de taux, 1 requête par code de taux).
6 +# ⚠️ Les produits variables sont publiés en ÉCART vs prime (ex. -0.500) :
7 +# reconstitués avec le code prime, jamais interprétés comme des taux.
8 +# -----------------------------------------------------------------------------
9 +from __future__ import annotations
10 +
11 +import json
12 +
13 +from .base import RateProvider
14 +
15 +API = ("https://apps.royalbank.com/apps/app-services/public-rates/api/"
16 + "publicrates?code={code}")
17 +PAGE_URL = "https://www.rbcroyalbank.com/mortgages/mortgage-rates.html"
18 +
19 +PRIME_CODE = "0006470002"
20 +
21 +# code -> (rate_type, terme mois, kind, insured_status, nom, code APR|None)
22 +CODE_MAP: dict[str, tuple] = {
23 + "0006340010": ("fixed", 6, "posted", "unknown", "Fixe 6 mois convertible", None),
24 + "0006340013": ("fixed", 12, "posted", "unknown", "Fixe fermé 1 an", None),
25 + "0006340016": ("fixed", 24, "posted", "unknown", "Fixe fermé 2 ans", None),
26 + "0006340019": ("fixed", 36, "posted", "unknown", "Fixe fermé 3 ans", None),
27 + "0006340022": ("fixed", 48, "posted", "unknown", "Fixe fermé 4 ans", None),
28 + "0006340025": ("fixed", 60, "posted", "unknown", "Fixe fermé 5 ans", None),
29 + "0006340042": ("fixed", 84, "posted", "unknown", "Fixe fermé 7 ans", None),
30 + "0006340030": ("fixed", 120, "posted", "unknown", "Fixe fermé 10 ans", None),
31 + "0386080056": ("fixed", 12, "special", "unknown", "Fixe fermé 1 an (offre spéciale)", "0386140074"),
32 + "0386080057": ("fixed", 24, "special", "unknown", "Fixe fermé 2 ans (offre spéciale)", "0386140075"),
33 + "0386080058": ("fixed", 36, "special", "unknown", "Fixe fermé 3 ans (offre spéciale)", "0386140076"),
34 + "0386080059": ("fixed", 48, "special", "unknown", "Fixe fermé 4 ans (offre spéciale)", "0386140077"),
35 + "0386080060": ("fixed", 60, "special", "unknown", "Fixe fermé 5 ans (offre spéciale)", "0386140078"),
36 + "0386080061": ("fixed", 84, "special", "unknown", "Fixe fermé 7 ans (offre spéciale)", "0386140079"),
37 + "0385940006": ("fixed", 60, "special", "insured", "Fixe fermé 5 ans (ratio élevé)", "0386090006"),
38 +}
39 +# codes variables : ÉCART vs prime -> taux = prime + valeur
40 +SPREAD_MAP: dict[str, tuple] = {
41 + "0236440012": ("variable", 60, "posted", "unknown", "Variable fermé 5 ans", "0166950009"),
42 + "0386080070": ("variable", 60, "special", "unknown", "Variable fermé 5 ans (offre spéciale)", "0386140088"),
43 + "0385940016": ("variable", 60, "special", "insured", "Variable fermé 5 ans (ratio élevé)", "0386090016"),
44 +}
45 +
46 +
47 +def _value(responses: dict, code: str) -> float | None:
48 + resp = responses.get(code)
49 + if not isinstance(resp, dict):
50 + return None
51 + content = resp.get("result_content") or {}
52 + try:
53 + return float(content.get("Value"))
54 + except (TypeError, ValueError):
55 + return None
56 +
57 +
58 +class RbcProvider(RateProvider):
59 + provider_id = "rbc"
60 + institution = "RBC Banque Royale"
61 + source_url = PAGE_URL
62 + request_delay = 0.6
63 +
64 + def _codes(self) -> list[str]:
65 + codes = [PRIME_CODE] + list(CODE_MAP) + list(SPREAD_MAP)
66 + codes += [apr for *_, apr in CODE_MAP.values() if apr]
67 + codes += [apr for *_, apr in SPREAD_MAP.values() if apr]
68 + return codes
69 +
70 + def fetch(self) -> list[dict]:
71 + responses: dict[str, dict] = {}
72 + for code in self._codes():
73 + try:
74 + responses[code] = json.loads(self.get(API.format(code=code)).text)
75 + except Exception: # noqa: BLE001 — un code raté n'annule pas le reste
76 + continue
77 + return self.parse_codes(responses)
78 +
79 + def parse(self, payload: str) -> list[dict]:
80 + """Pour les tests fixtures : payload = JSON {code: réponse API}."""
81 + data = json.loads(payload)
82 + return self.parse_codes(data.get("responses") or data)
83 +
84 + def parse_codes(self, responses: dict) -> list[dict]:
85 + out: list[dict] = []
86 + prime = _value(responses, PRIME_CODE)
87 + for code, (rtype, term, kind, insured, name, apr_code) in CODE_MAP.items():
88 + rate = _value(responses, code)
89 + if rate is None or rate <= 0:
90 + continue
91 + apr = _value(responses, apr_code) if apr_code else None
92 + out.append(self.make_product(
93 + rate=rate, rate_type=rtype, term_months=term, kind=kind,
94 + product_name=name, apr=apr, insured_status=insured,
95 + raw={"code": code, "value": rate}))
96 + if prime is not None:
97 + for code, (rtype, term, kind, insured, name, apr_code) in SPREAD_MAP.items():
98 + spread = _value(responses, code)
99 + if spread is None or abs(spread) > 3:
100 + continue # un écart vs prime > 3 pts : structure changée
101 + apr = _value(responses, apr_code) if apr_code else None
102 + out.append(self.make_product(
103 + rate=round(prime + spread, 3), rate_type=rtype,
104 + term_months=term, kind=kind, product_name=name, apr=apr,
105 + insured_status=insured,
106 + conditions=f"Prime RBC {prime} % {spread:+} pt",
107 + raw={"code": code, "spread": spread, "prime": prime}))
108 + out.append(self.make_product(
109 + rate=prime, rate_type="other", term_months=12, kind="posted",
110 + product_name="Taux préférentiel RBC", purpose="unknown",
111 + raw={"code": PRIME_CODE, "value": prime}))
112 + return out
added immoka/mortgage/providers/scotiabank.py +104 −0
@@ -0,0 +1,104 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/scotiabank.py : Banque Scotia — API JSON publique
5 +# dmtsms.scotiabank.com (celle que consomme leur propre page de taux).
6 +# nonspecialmortgage = taux affichés ; varmortgage = slots promotionnels
7 +# (le mapping slot -> produit vient de la page ; on ne garde que les slots
8 +# dont l'identité est connue, avec confiance réduite).
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import json
13 +
14 +from .base import RateProvider
15 +
16 +POSTED_URL = "https://dmtsms.scotiabank.com/api/rates/daily/nonspecialmortgage"
17 +PROMO_URL = "https://dmtsms.scotiabank.com/api/rates/daily/varmortgage"
18 +PAGE_URL = ("https://www.scotiabank.com/ca/en/personal/rates-prices/"
19 + "mortgages-rates.html")
20 +
21 +# PRODUCT -> (rate_type, insured_status, nom, purpose)
22 +POSTED_MAP = {
23 + "N.H.A. RESIDENTIAL, ETC": ("fixed", "insured", "Fixe affiché (assuré LNH)"),
24 + "CONVENTIONAL RESIDENTIAL, ETC": ("fixed", "uninsured", "Fixe affiché (conventionnel)"),
25 + "ULTIMATE VARIABLE RATE": ("variable", "unknown", "Ultimate Variable"),
26 + "OPEN": ("fixed", "unknown", "Fixe ouvert"),
27 + "FLEXIBLE": ("fixed", "unknown", "Flexible"),
28 +}
29 +
30 +# Slots promotionnels dont l'identité est documentée sur la page Scotia
31 +# (2026-08). Confiance réduite : si Scotia réordonne ses slots, la validation
32 +# et la comparaison croisée limitent les dégâts.
33 +PROMO_SLOTS = {
34 + "MORTGAGE PROMOTIONAL 1": ("variable", 60, "Flex Value fermé 5 ans (variable)"),
35 + "MORTGAGE PROMOTIONAL 2": ("variable", 36, "Ultimate Variable 3 ans"),
36 + "MORTGAGE PROMOTIONAL 3": ("variable", 60, "Flex Value ouvert 5 ans (variable)"),
37 +}
38 +
39 +
40 +def _term_months(t: dict) -> int | None:
41 + try:
42 + v = int(t["TERM_VALUE"])
43 + except (KeyError, ValueError, TypeError):
44 + return None
45 + unit = (t.get("TERM_UNIT") or "").upper()
46 + if unit == "Y":
47 + return v * 12
48 + if unit == "M":
49 + return v
50 + return None
51 +
52 +
53 +class ScotiabankProvider(RateProvider):
54 + provider_id = "scotiabank"
55 + institution = "Banque Scotia"
56 + source_url = PAGE_URL
57 + request_delay = 1.0
58 +
59 + def fetch(self) -> list[dict]:
60 + posted = self.get(POSTED_URL).text
61 + try:
62 + promo = self.get(PROMO_URL).text
63 + except Exception: # noqa: BLE001 — promos facultatives
64 + promo = ""
65 + return self.parse(posted) + (self.parse_promos(promo) if promo else [])
66 +
67 + def parse(self, payload: str) -> list[dict]:
68 + data = json.loads(payload)
69 + out: list[dict] = []
70 + for prod in data.get("data") or []:
71 + name = (prod.get("PRODUCT") or "").strip()
72 + if name not in POSTED_MAP:
73 + continue # produits chalet/cap/right-rate : hors périmètre
74 + rtype, insured, label = POSTED_MAP[name]
75 + for t in prod.get("TERMS") or []:
76 + term = _term_months(t)
77 + rate = t.get("RATE")
78 + if term is None or not isinstance(rate, (int, float)) or rate <= 0:
79 + continue
80 + out.append(self.make_product(
81 + rate=float(rate), rate_type=rtype, term_months=term,
82 + kind="posted", product_name=label,
83 + insured_status=insured,
84 + conditions=name,
85 + raw={"product": name, "term": t}))
86 + return out
87 +
88 + def parse_promos(self, payload: str) -> list[dict]:
89 + data = json.loads(payload)
90 + out: list[dict] = []
91 + for prod in data.get("data") or []:
92 + name = (prod.get("PRODUCT") or "").strip()
93 + if name not in PROMO_SLOTS:
94 + continue
95 + rate = prod.get("RATE")
96 + if not isinstance(rate, (int, float)) or rate <= 0:
97 + continue # slot inutilisé
98 + rtype, term, label = PROMO_SLOTS[name]
99 + out.append(self.make_product(
100 + rate=float(rate), rate_type=rtype, term_months=term,
101 + kind="special", product_name=label, confidence=0.8,
102 + conditions=f"Slot promotionnel Scotia ({name})",
103 + raw={"product": name, "rate": rate}))
104 + return out
added immoka/mortgage/providers/tangerine.py +55 −0
@@ -0,0 +1,55 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/tangerine.py : Tangerine — JSON statique publié
5 +# (currentRates.json, le fichier que charge leur page /rates). Un seul taux
6 +# par terme (pas de distinction affiché/spécial chez Tangerine) : kind
7 +# "special" car c'est leur taux client réel.
8 +# -----------------------------------------------------------------------------
9 +from __future__ import annotations
10 +
11 +import json
12 +
13 +from .base import RateProvider, parse_rate
14 +
15 +RATES_URL = ("https://www.tangerine.ca/content/dam/tangerine-shared/"
16 + "product-rates/currentRates.json")
17 +
18 +
19 +class TangerineProvider(RateProvider):
20 + provider_id = "tangerine"
21 + institution = "Tangerine"
22 + source_url = "https://www.tangerine.ca/en/rates"
23 + request_delay = 1.0
24 +
25 + def fetch(self) -> list[dict]:
26 + return self.parse(self.get(RATES_URL).text)
27 +
28 + def parse(self, payload: str) -> list[dict]:
29 + data = json.loads(payload)
30 + out: list[dict] = []
31 + for r in data.get("rates") or []:
32 + if r.get("group") != "mortgage":
33 + continue
34 + code = r.get("max_product_code")
35 + rate = r.get("interest_rate")
36 + term_years = r.get("term")
37 + if not isinstance(rate, (int, float)) or rate <= 0:
38 + continue
39 + if not isinstance(term_years, (int, float)) or term_years <= 0:
40 + continue
41 + if code == "Mortgage":
42 + rtype, label = "fixed", f"Fixe {int(term_years)} an(s)"
43 + elif code == "VarMortgage":
44 + rtype, label = "variable", f"Variable {int(term_years)} an(s)"
45 + else:
46 + continue # preferred_* et autres : clients connectés, ignorés
47 + apr = parse_rate(r.get("apr_value_en") or "")
48 + out.append(self.make_product(
49 + rate=float(rate), rate_type=rtype,
50 + term_months=int(term_years * 12), kind="special",
51 + product_name=label, apr=apr,
52 + conditions=f"Taux unique Tangerine (en date du {r.get('date')})",
53 + raw={"account_term": r.get("account_term"),
54 + "date": r.get("date"), "interest_rate": rate}))
55 + return out
added immoka/mortgage/providers/td.py +115 −0
@@ -0,0 +1,115 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/providers/td.py : TD Canada Trust — API JSON publique getRates
5 +# (POST ratesType=resl, celle que consomme leur page de taux). Chaque code
6 +# MTG{F|V}{mois}{C|O} porte deux tableaux highRatio / nonHighRatio de la
7 +# forme [affiché, escompte, spécial, APR, drapeau]. Le « affiché » des
8 +# produits variables est le TD Mortgage Prime. ⚠️ Pour les termes sans offre
9 +# spéciale réelle, TD publie un « spécial » reconstruit (escompte négatif)
10 +# dont l'APR correspond en fait au taux AFFICHÉ : ces lignes incohérentes
11 +# (APR < spécial) sont écartées — jamais interprétées.
12 +# -----------------------------------------------------------------------------
13 +from __future__ import annotations
14 +
15 +import json
16 +import re
17 +
18 +from .base import RateProvider
19 +
20 +API_URL = "https://psservice.td.com/ca/en/carate/getRates"
21 +PAGE_URL = ("https://www.td.com/ca/en/personal-banking/products/mortgages/"
22 + "mortgage-rates")
23 +
24 +CODE_RX = re.compile(r"^MTG([FV])(\d{3})([CO])$")
25 +
26 +IDX_POSTED, IDX_SPECIAL, IDX_APR = 0, 2, 3
27 +
28 +
29 +def _num(v) -> float | None:
30 + try:
31 + return float(str(v).strip())
32 + except (TypeError, ValueError):
33 + return None
34 +
35 +
36 +def _label(months: int) -> str:
37 + if months < 12:
38 + return f"{months} mois"
39 + years = months // 12
40 + return f"{years} an" if years == 1 else f"{years} ans"
41 +
42 +
43 +class TdProvider(RateProvider):
44 + provider_id = "td"
45 + institution = "TD Canada Trust"
46 + source_url = PAGE_URL
47 + request_delay = 1.0
48 +
49 + def fetch(self) -> list[dict]:
50 + wait_kw = {"timeout": self.timeout,
51 + "headers": {"Content-Type": "application/json"}}
52 + resp = self.session.post(API_URL, json={"ratesType": "resl"}, **wait_kw)
53 + resp.raise_for_status()
54 + return self.parse(resp.text)
55 +
56 + def parse(self, payload: str) -> list[dict]:
57 + data = json.loads(payload)
58 + if not isinstance(data, dict):
59 + raise ValueError("réponse TD inattendue (structure changée)")
60 + for wrapper in ("rates", "data", "result"):
61 + if wrapper in data and isinstance(data[wrapper], dict):
62 + data = data[wrapper]
63 + break
64 + out: list[dict] = []
65 + prime: float | None = None
66 + for code, tables in data.items():
67 + m = CODE_RX.match(str(code))
68 + if not m or not isinstance(tables, dict):
69 + continue # FLT* (FlexLine/HELOC) et codes inconnus : ignorés
70 + rtype = "fixed" if m.group(1) == "F" else "variable"
71 + term = int(m.group(2))
72 + openness = "fermé" if m.group(3) == "C" else "ouvert"
73 + base = ("Fixe" if rtype == "fixed" else "Variable")
74 + non_hr = tables.get("nonHighRatio") or []
75 + high_r = tables.get("highRatio") or []
76 + posted = _num(non_hr[IDX_POSTED]) if len(non_hr) > IDX_POSTED else None
77 + if posted and posted > 0:
78 + if rtype == "variable":
79 + # l'« affiché » des codes MTGV est le TD Mortgage Prime,
80 + # pas le taux du produit : jamais émis comme taux variable
81 + prime = posted
82 + else:
83 + out.append(self.make_product(
84 + rate=posted, rate_type=rtype, term_months=term,
85 + kind="posted",
86 + product_name=f"{base} {openness} {_label(term)}",
87 + raw={"code": code, "row": non_hr}))
88 + for arr, insured, suffix in ((non_hr, "uninsured", ""),
89 + (high_r, "insured", ", ratio élevé")):
90 + if len(arr) <= IDX_APR:
91 + continue
92 + special = _num(arr[IDX_SPECIAL])
93 + if special is None or special <= 0:
94 + continue
95 + if posted is not None and special == posted and rtype == "fixed" \
96 + and _num(arr[1]) in (0, None):
97 + continue # pas de spécial publié pour ce produit
98 + apr = _num(arr[IDX_APR])
99 + if apr is not None and apr < special - 0.02:
100 + continue # « spécial » reconstruit : APR = celui du taux affiché
101 + out.append(self.make_product(
102 + rate=special, rate_type=rtype, term_months=term,
103 + kind="special", apr=apr,
104 + product_name=f"{base} {openness} {_label(term)} "
105 + f"(offre spéciale{suffix})",
106 + insured_status=insured,
107 + conditions="Base = TD Mortgage Prime"
108 + if rtype == "variable" else None,
109 + raw={"code": code, "row": arr}))
110 + if prime and prime > 0:
111 + out.append(self.make_product(
112 + rate=prime, rate_type="other", term_months=12, kind="posted",
113 + product_name="TD Mortgage Prime", purpose="unknown",
114 + raw={"field": "MTGV*[0]", "value": prime}))
115 + return out
added immoka/mortgage/scheduler.py +120 −0
@@ -0,0 +1,120 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/scheduler.py : orchestration de la collecte des taux.
5 +# Pipeline : provider.fetch() -> validation -> enregistrement historisé.
6 +# Retries avec backoff exponentiel, timeout par provider, logs structurés,
7 +# santé par provider (provider_runs). Une panne d'un provider n'affecte
8 +# jamais les autres ni le calculateur (dernière donnée valide conservée).
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import os
13 +import time
14 +import traceback
15 +
16 +import requests
17 +
18 +from . import store
19 +from .providers import PROVIDERS
20 +from .validate import validate_batch
21 +
22 +RETRIES = int(os.environ.get("IMMOKA_MORTGAGE_RETRIES", "3"))
23 +BACKOFF_BASE_S = float(os.environ.get("IMMOKA_MORTGAGE_BACKOFF", "5"))
24 +# Fréquence de collecte (minutes) — utilisée par watch() ci-dessous.
25 +INTERVAL_MIN = int(os.environ.get("IMMOKA_MORTGAGE_INTERVAL_MIN", "180"))
26 +
27 +
28 +def _log(**kw) -> None:
29 + print("[mortgage] " + " ".join(f"{k}={v}" for k, v in kw.items()),
30 + flush=True)
31 +
32 +
33 +def run_provider(slug: str, con=None) -> dict:
34 + """Collecte UNE institution avec retries + backoff. Retourne le résumé."""
35 + if con is None:
36 + con = store.connect()
37 + cls = PROVIDERS[slug]
38 + t0 = time.time()
39 + products: list[dict] | None = None
40 + status, message = "success", ""
41 + for attempt in range(RETRIES):
42 + try:
43 + products = cls().fetch()
44 + break
45 + except requests.RequestException as exc:
46 + status, message = "http_error", str(exc)[:200]
47 + except Exception as exc: # noqa: BLE001 — parseur cassé, etc.
48 + status, message = "parser_error", str(exc)[:200]
49 + traceback.print_exc()
50 + if attempt < RETRIES - 1:
51 + time.sleep(BACKOFF_BASE_S * (2 ** attempt))
52 + duration_ms = int((time.time() - t0) * 1000)
53 + if products is None:
54 + store.log_run(con, slug, ok=False, status=status,
55 + duration_ms=duration_ms, message=message)
56 + _log(provider=slug, status=status, duration=f"{duration_ms}ms",
57 + message=message or "-")
58 + return {"provider": slug, "ok": False, "status": status,
59 + "message": message}
60 + valid, problems = validate_batch(products)
61 + if not valid:
62 + status = "empty" if not products else "validation_error"
63 + store.log_run(con, slug, ok=False, status=status,
64 + products=len(products), rejected=len(problems),
65 + duration_ms=duration_ms,
66 + message="; ".join(problems[:5]))
67 + _log(provider=slug, status=status, products=len(products),
68 + rejected=len(problems), duration=f"{duration_ms}ms")
69 + return {"provider": slug, "ok": False, "status": status,
70 + "problems": problems}
71 + res = store.record_observations(con, slug, valid)
72 + ok = True
73 + if problems or res["rejected"]:
74 + status = "success" # partiel : données saines enregistrées quand même
75 + store.log_run(con, slug, ok=ok, status=status, products=len(valid),
76 + changed=res["changed"],
77 + rejected=len(problems) + res["rejected"],
78 + duration_ms=duration_ms,
79 + message="; ".join((problems + res["rejected_details"])[:5]))
80 + _log(provider=slug, status=status, products=len(valid),
81 + changed=res["changed"], rejected=len(problems) + res["rejected"],
82 + duration=f"{duration_ms}ms")
83 + return {"provider": slug, "ok": True, "status": status,
84 + "products": len(valid), "changed": res["changed"],
85 + "rejected": len(problems) + res["rejected"]}
86 +
87 +
88 +def run(only: list[str] | None = None) -> list[dict]:
89 + """Collecte toutes les institutions (ou celles listées). Séquentiel et
90 + poli — jamais de martèlement des sites bancaires."""
91 + con = store.connect()
92 + slugs = [s for s in sorted(PROVIDERS) if not only or s in only]
93 + results = [run_provider(s, con) for s in slugs]
94 + ok = sum(1 for r in results if r["ok"])
95 + _log(status="done", providers=len(results), ok=ok,
96 + failed=len(results) - ok)
97 + return results
98 +
99 +
100 +def watch(interval_minutes: int | None = None) -> None:
101 + """Boucle autonome de collecte (défaut : IMMOKA_MORTGAGE_INTERVAL_MIN)."""
102 + minutes = interval_minutes or INTERVAL_MIN
103 + while True:
104 + try:
105 + run()
106 + except Exception: # noqa: BLE001 — la boucle ne meurt jamais
107 + traceback.print_exc()
108 + time.sleep(minutes * 60)
109 +
110 +
111 +def maybe_run(min_age_minutes: int | None = None) -> None:
112 + """Collecte seulement si la dernière passe date de plus de
113 + `min_age_minutes` — appelé depuis la boucle watch d'ingest.py sans risque
114 + de sur-solliciter les banques."""
115 + age_min = min_age_minutes or INTERVAL_MIN
116 + con = store.connect()
117 + last = con.execute("SELECT MAX(ts) AS m FROM provider_runs").fetchone()
118 + if last and last["m"] and (time.time() - last["m"]) < age_min * 60:
119 + return
120 + run()
added immoka/mortgage/store.py +336 −0
@@ -0,0 +1,336 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/store.py : persistance des taux hypothécaires (data/mortgage.db).
5 +# Historisation par périodes de validité : une ligne « courante » par produit
6 +# (valid_to IS NULL) ; un changement de taux ferme la ligne et en ouvre une
7 +# nouvelle. Aucune donnée n'est jamais écrasée — l'historique complet se
8 +# reconstruit par produit. Santé des providers dans provider_runs.
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +import hashlib
13 +import json
14 +import sqlite3
15 +import statistics
16 +import time
17 +from pathlib import Path
18 +
19 +DB_PATH = Path(__file__).resolve().parent.parent.parent / "data" / "mortgage.db"
20 +
21 +# Un taux « courant » plus vieux que STALE_H heures est signalé périmé.
22 +STALE_H = 24
23 +# Rejet des sauts aberrants : variation > JUMP_MAX points en < JUMP_WINDOW_H h.
24 +JUMP_MAX = 2.5
25 +JUMP_WINDOW_H = 48
26 +
27 +_SCHEMA = """
28 +CREATE TABLE IF NOT EXISTS rate_observations (
29 + id INTEGER PRIMARY KEY AUTOINCREMENT,
30 + provider TEXT NOT NULL,
31 + institution TEXT NOT NULL,
32 + product_key TEXT NOT NULL, -- empreinte identité produit
33 + product_name TEXT,
34 + rate_type TEXT NOT NULL, -- fixed|variable|adjustable|other
35 + term_months INTEGER NOT NULL,
36 + kind TEXT NOT NULL, -- posted|special
37 + rate REAL NOT NULL, -- taux contractuel en % (ex. 4.19)
38 + apr REAL,
39 + insured_status TEXT DEFAULT 'unknown', -- insured|insurable|uninsured|unknown
40 + purpose TEXT DEFAULT 'purchase', -- purchase|renewal|refinance|unknown
41 + amortization_max_years INTEGER,
42 + conditions TEXT,
43 + source_url TEXT,
44 + confidence REAL DEFAULT 1.0,
45 + raw TEXT, -- JSON : observation brute (audit)
46 + valid_from REAL NOT NULL,
47 + valid_to REAL, -- NULL = taux courant
48 + last_checked REAL NOT NULL
49 +);
50 +CREATE INDEX IF NOT EXISTS idx_rateobs_current
51 + ON rate_observations(provider, product_key, valid_to);
52 +CREATE INDEX IF NOT EXISTS idx_rateobs_lookup
53 + ON rate_observations(rate_type, term_months, valid_to);
54 +
55 +CREATE TABLE IF NOT EXISTS provider_runs (
56 + id INTEGER PRIMARY KEY AUTOINCREMENT,
57 + provider TEXT NOT NULL,
58 + ts REAL NOT NULL,
59 + ok INTEGER,
60 + status TEXT, -- success|http_error|parser_error|validation_error|empty
61 + products INTEGER,
62 + changed INTEGER,
63 + rejected INTEGER,
64 + duration_ms INTEGER,
65 + message TEXT
66 +);
67 +CREATE INDEX IF NOT EXISTS idx_provider_runs ON provider_runs(provider, ts);
68 +
69 +-- Préparé pour les notifications futures (« alerte-moi si le 5 ans fixe
70 +-- passe sous 3,99 % » / « si le paiement de cette propriété passe sous X $ »).
71 +CREATE TABLE IF NOT EXISTS rate_alerts (
72 + id INTEGER PRIMARY KEY AUTOINCREMENT,
73 + created REAL NOT NULL,
74 + kind TEXT NOT NULL, -- rate_below|payment_below
75 + params TEXT, -- JSON : {rate_type, term_months, uid, down…}
76 + threshold REAL NOT NULL,
77 + contact TEXT,
78 + active INTEGER DEFAULT 1,
79 + fired_at REAL
80 +);
81 +"""
82 +
83 +_SCHEMA_READY = False
84 +
85 +
86 +def connect() -> sqlite3.Connection:
87 + global _SCHEMA_READY
88 + DB_PATH.parent.mkdir(parents=True, exist_ok=True)
89 + con = sqlite3.connect(DB_PATH, timeout=60)
90 + con.row_factory = sqlite3.Row
91 + con.execute("PRAGMA journal_mode=WAL")
92 + con.execute("PRAGMA synchronous=NORMAL")
93 + con.execute("PRAGMA busy_timeout=120000")
94 + if not _SCHEMA_READY:
95 + con.executescript(_SCHEMA)
96 + con.commit()
97 + _SCHEMA_READY = True
98 + return con
99 +
100 +
101 +def product_key(p: dict) -> str:
102 + """Identité stable d'un produit : institution + type + terme + nature du
103 + taux + assurabilité + objet + nom. Deux produits incompatibles ne
104 + partagent jamais la même clé (règle : ne jamais comparer l'incomparable)."""
105 + ident = "|".join([
106 + p["provider"], p["rate_type"], str(p["term_months"]), p["kind"],
107 + p.get("insured_status") or "unknown", p.get("purpose") or "purchase",
108 + (p.get("product_name") or "").strip().lower(),
109 + ])
110 + return hashlib.sha1(ident.encode()).hexdigest()[:16]
111 +
112 +
113 +def record_observations(con: sqlite3.Connection, provider: str,
114 + products: list[dict]) -> dict:
115 + """Enregistre une passe de collecte validée.
116 +
117 + Pour chaque produit : si le taux courant est identique → simple mise à
118 + jour de last_checked ; s'il a changé → fermeture de la période et
119 + insertion d'une nouvelle ligne. Rejette les sauts aberrants (> JUMP_MAX
120 + points en < JUMP_WINDOW_H h) sans écraser la bonne donnée précédente.
121 + Retourne {seen, changed, rejected, rejected_details}."""
122 + now = time.time()
123 + changed = 0
124 + rejected: list[str] = []
125 + for p in products:
126 + pk = product_key(p)
127 + cur = con.execute(
128 + "SELECT id, rate, last_checked FROM rate_observations "
129 + "WHERE provider=? AND product_key=? AND valid_to IS NULL",
130 + (provider, pk)).fetchone()
131 + if cur is not None:
132 + if abs(cur["rate"] - p["rate"]) < 1e-9:
133 + con.execute(
134 + "UPDATE rate_observations SET last_checked=?, apr=?, "
135 + "conditions=?, source_url=? WHERE id=?",
136 + (now, p.get("apr"), p.get("conditions"),
137 + p.get("source_url"), cur["id"]))
138 + continue
139 + # Garde-fou anti-aberration : ne jamais écraser une donnée saine
140 + # par un saut manifestement impossible.
141 + age_h = (now - (cur["last_checked"] or now)) / 3600.0
142 + if abs(cur["rate"] - p["rate"]) > JUMP_MAX and age_h < JUMP_WINDOW_H:
143 + rejected.append(
144 + f"{p.get('product_name') or pk}: {cur['rate']} -> "
145 + f"{p['rate']} (saut aberrant)")
146 + continue
147 + con.execute("UPDATE rate_observations SET valid_to=? WHERE id=?",
148 + (now, cur["id"]))
149 + changed += 1
150 + con.execute(
151 + "INSERT INTO rate_observations (provider, institution, "
152 + "product_key, product_name, rate_type, term_months, kind, rate, "
153 + "apr, insured_status, purpose, amortization_max_years, "
154 + "conditions, source_url, confidence, raw, valid_from, "
155 + "valid_to, last_checked) "
156 + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NULL,?)",
157 + (provider, p["institution"], pk, p.get("product_name"),
158 + p["rate_type"], p["term_months"], p["kind"], p["rate"],
159 + p.get("apr"), p.get("insured_status") or "unknown",
160 + p.get("purpose") or "purchase", p.get("amortization_max_years"),
161 + p.get("conditions"), p.get("source_url"),
162 + p.get("confidence", 1.0),
163 + json.dumps(p.get("raw"), ensure_ascii=False) if p.get("raw") else None,
164 + now, now))
165 + con.commit()
166 + return {"seen": len(products), "changed": changed,
167 + "rejected": len(rejected), "rejected_details": rejected}
168 +
169 +
170 +def _row(r: sqlite3.Row) -> dict:
171 + d = dict(r)
172 + d.pop("raw", None)
173 + now = time.time()
174 + d["age_minutes"] = round((now - (d.get("last_checked") or now)) / 60)
175 + d["stale"] = d["age_minutes"] > STALE_H * 60
176 + return d
177 +
178 +
179 +def current_rates(con: sqlite3.Connection, rate_type: str | None = None,
180 + term_months: int | None = None, kind: str | None = None,
181 + insured_status: str | None = None,
182 + purpose: str | None = None,
183 + provider: str | None = None) -> list[dict]:
184 + """Taux courants (dernière donnée valide par produit), filtrables."""
185 + q = ("SELECT * FROM rate_observations WHERE valid_to IS NULL")
186 + args: list = []
187 + for col, val in (("rate_type", rate_type), ("term_months", term_months),
188 + ("kind", kind), ("provider", provider),
189 + ("purpose", purpose)):
190 + if val is not None:
191 + q += f" AND {col}=?"
192 + args.append(val)
193 + if insured_status is not None:
194 + q += " AND insured_status IN (?, 'unknown')"
195 + args.append(insured_status)
196 + q += " ORDER BY provider, term_months, rate"
197 + return [_row(r) for r in con.execute(q, args).fetchall()]
198 +
199 +
200 +def best_rate(con: sqlite3.Connection, rate_type: str = "fixed",
201 + term_months: int = 60, insured_status: str | None = None,
202 + purpose: str = "purchase") -> dict | None:
203 + """Meilleur taux courant pour un produit comparable (privilégie les taux
204 + « special », sinon posted). Retourne la ligne complète + contexte."""
205 + rows = current_rates(con, rate_type=rate_type, term_months=term_months,
206 + insured_status=insured_status, purpose=purpose)
207 + if not rows:
208 + return None
209 + # Un seul candidat par institution : special prioritaire, sinon posted.
210 + by_inst: dict[str, dict] = {}
211 + for r in rows:
212 + cur = by_inst.get(r["provider"])
213 + if cur is None:
214 + by_inst[r["provider"]] = r
215 + elif r["kind"] == "special" and cur["kind"] == "posted":
216 + by_inst[r["provider"]] = r
217 + elif r["kind"] == cur["kind"] and r["rate"] < cur["rate"]:
218 + by_inst[r["provider"]] = r
219 + candidates = sorted(by_inst.values(), key=lambda r: r["rate"])
220 + best = candidates[0]
221 + rates = [r["rate"] for r in candidates]
222 + return {
223 + **best,
224 + "median_rate": round(statistics.median(rates), 2) if rates else None,
225 + "institutions_count": len(candidates),
226 + "per_institution": candidates,
227 + }
228 +
229 +
230 +def history(con: sqlite3.Connection, rate_type: str, term_months: int,
231 + provider: str | None = None, kind: str | None = None,
232 + days: int = 365) -> list[dict]:
233 + """Historique : périodes de validité (valid_from/valid_to) par produit."""
234 + since = time.time() - days * 86400
235 + q = ("SELECT provider, institution, product_name, kind, rate, "
236 + "insured_status, valid_from, valid_to, last_checked, source_url "
237 + "FROM rate_observations WHERE rate_type=? AND term_months=? "
238 + "AND (valid_to IS NULL OR valid_to >= ?)")
239 + args: list = [rate_type, term_months, since]
240 + if provider:
241 + q += " AND provider=?"
242 + args.append(provider)
243 + if kind:
244 + q += " AND kind=?"
245 + args.append(kind)
246 + q += " ORDER BY provider, valid_from"
247 + return [dict(r) for r in con.execute(q, args).fetchall()]
248 +
249 +
250 +def rate_at(con: sqlite3.Connection, rate_type: str, term_months: int,
251 + ts: float, kind: str = "special") -> float | None:
252 + """Meilleur taux observé (toutes institutions) à un instant donné."""
253 + rows = con.execute(
254 + "SELECT MIN(rate) AS r FROM rate_observations "
255 + "WHERE rate_type=? AND term_months=? AND kind=? AND valid_from<=? "
256 + "AND (valid_to IS NULL OR valid_to>?) AND last_checked>=?",
257 + (rate_type, term_months, kind, ts, ts, ts - 14 * 86400)).fetchone()
258 + if rows is None or rows["r"] is None:
259 + # repli : posted si aucun special à cette date
260 + rows = con.execute(
261 + "SELECT MIN(rate) AS r FROM rate_observations "
262 + "WHERE rate_type=? AND term_months=? AND valid_from<=? "
263 + "AND (valid_to IS NULL OR valid_to>?)",
264 + (rate_type, term_months, ts, ts)).fetchone()
265 + return rows["r"] if rows else None
266 +
267 +
268 +def market_stats(con: sqlite3.Connection, rate_type: str = "fixed",
269 + term_months: int = 60) -> dict | None:
270 + """Métriques Mortgage Intelligence : meilleur, médian, spread,
271 + variations 7/30/90 jours, plus bas observé 6 mois."""
272 + best = best_rate(con, rate_type=rate_type, term_months=term_months)
273 + if best is None:
274 + return None
275 + now = time.time()
276 + out = {
277 + "rate_type": rate_type,
278 + "term_months": term_months,
279 + "best": best["rate"],
280 + "best_provider": best["provider"],
281 + "best_institution": best["institution"],
282 + "best_kind": best["kind"],
283 + "median": best["median_rate"],
284 + "spread": (round(best["median_rate"] - best["rate"], 2)
285 + if best["median_rate"] is not None else None),
286 + "institutions_count": best["institutions_count"],
287 + }
288 + for label, days in (("var_7d", 7), ("var_30d", 30), ("var_90d", 90)):
289 + past = rate_at(con, rate_type, term_months, now - days * 86400)
290 + out[label] = round(best["rate"] - past, 2) if past is not None else None
291 + low = con.execute(
292 + "SELECT MIN(rate) AS r FROM rate_observations "
293 + "WHERE rate_type=? AND term_months=? AND kind='special' "
294 + "AND last_checked >= ?",
295 + (rate_type, term_months, now - 182 * 86400)).fetchone()
296 + out["lowest_6m"] = low["r"] if low and low["r"] is not None else None
297 + return out
298 +
299 +
300 +def log_run(con: sqlite3.Connection, provider: str, ok: bool, status: str,
301 + products: int = 0, changed: int = 0, rejected: int = 0,
302 + duration_ms: int = 0, message: str = "") -> None:
303 + con.execute(
304 + "INSERT INTO provider_runs (provider, ts, ok, status, products, "
305 + "changed, rejected, duration_ms, message) VALUES (?,?,?,?,?,?,?,?,?)",
306 + (provider, time.time(), 1 if ok else 0, status, products, changed,
307 + rejected, duration_ms, message[:500]))
308 + con.commit()
309 +
310 +
311 +def provider_health(con: sqlite3.Connection) -> list[dict]:
312 + """Dernier état de chaque provider : OK / WARNING / ERROR + fraîcheur."""
313 + rows = con.execute(
314 + "SELECT p.* FROM provider_runs p JOIN (SELECT provider, MAX(ts) AS m "
315 + "FROM provider_runs GROUP BY provider) x "
316 + "ON p.provider=x.provider AND p.ts=x.m ORDER BY p.provider").fetchall()
317 + now = time.time()
318 + out = []
319 + for r in rows:
320 + d = dict(r)
321 + n_current = con.execute(
322 + "SELECT COUNT(*) AS n, MAX(last_checked) AS mc "
323 + "FROM rate_observations WHERE provider=? AND valid_to IS NULL",
324 + (r["provider"],)).fetchone()
325 + age_min = round((now - r["ts"]) / 60)
326 + if r["ok"] and n_current["n"] > 0:
327 + level = "WARNING" if age_min > STALE_H * 60 or r["rejected"] else "OK"
328 + elif n_current["n"] > 0:
329 + level = "WARNING" # échec récent mais données valides conservées
330 + else:
331 + level = "ERROR"
332 + d.update({"level": level, "age_minutes": age_min,
333 + "current_products": n_current["n"],
334 + "last_data_at": n_current["mc"]})
335 + out.append(d)
336 + return out
added immoka/mortgage/validate.py +79 −0
@@ -0,0 +1,79 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# mortgage/validate.py : couche de validation des observations de taux.
5 +# Règle absolue : ne jamais inventer ni laisser passer un taux impossible.
6 +# 4.19 % -> 419 % doit être rejeté ; une bonne donnée n'est jamais écrasée
7 +# par une donnée manifestement erronée (garde-fou complémentaire dans
8 +# store.record_observations).
9 +# -----------------------------------------------------------------------------
10 +from __future__ import annotations
11 +
12 +RATE_MIN = 0.25 # sous 0,25 % : impossible pour une hypothèque canadienne
13 +RATE_MAX = 20.0 # au-delà de 20 % : aberrant (même les prêts privés)
14 +TERM_MIN_MONTHS = 3
15 +TERM_MAX_MONTHS = 120
16 +
17 +VALID_RATE_TYPES = {"fixed", "variable", "adjustable", "other"}
18 +VALID_KINDS = {"posted", "special"}
19 +VALID_INSURED = {"insured", "insurable", "uninsured", "unknown"}
20 +VALID_PURPOSES = {"purchase", "renewal", "refinance", "unknown"}
21 +
22 +REQUIRED_FIELDS = ("provider", "institution", "rate_type", "term_months",
23 + "kind", "rate", "source_url")
24 +
25 +
26 +def validate_product(p: dict) -> tuple[bool, list[str]]:
27 + """Valide UNE observation normalisée. Retourne (ok, problèmes)."""
28 + issues: list[str] = []
29 + for f in REQUIRED_FIELDS:
30 + if p.get(f) in (None, ""):
31 + issues.append(f"champ manquant: {f}")
32 + if issues:
33 + return False, issues
34 + rate = p["rate"]
35 + if not isinstance(rate, (int, float)):
36 + issues.append(f"taux non numérique: {rate!r}")
37 + elif rate <= 0:
38 + issues.append(f"taux nul ou négatif: {rate}")
39 + elif rate < RATE_MIN or rate > RATE_MAX:
40 + issues.append(f"taux impossible: {rate}")
41 + term = p["term_months"]
42 + if not isinstance(term, int) or not (TERM_MIN_MONTHS <= term <= TERM_MAX_MONTHS):
43 + issues.append(f"terme invalide: {term!r}")
44 + if p["rate_type"] not in VALID_RATE_TYPES:
45 + issues.append(f"rate_type invalide: {p['rate_type']}")
46 + if p["kind"] not in VALID_KINDS:
47 + issues.append(f"kind invalide: {p['kind']}")
48 + if p.get("insured_status", "unknown") not in VALID_INSURED:
49 + issues.append(f"insured_status invalide: {p.get('insured_status')}")
50 + if p.get("purpose", "purchase") not in VALID_PURPOSES:
51 + issues.append(f"purpose invalide: {p.get('purpose')}")
52 + apr = p.get("apr")
53 + if apr is not None:
54 + if not isinstance(apr, (int, float)) or apr < RATE_MIN or apr > RATE_MAX:
55 + issues.append(f"APR impossible: {apr!r}")
56 + elif isinstance(rate, (int, float)) and apr < rate - 0.02:
57 + issues.append(f"APR ({apr}) inférieur au taux contractuel ({rate})")
58 + return not issues, issues
59 +
60 +
61 +def validate_batch(products: list[dict]) -> tuple[list[dict], list[str]]:
62 + """Valide une passe complète : élimine invalides et duplicatas exacts.
63 + Retourne (produits valides, problèmes)."""
64 + from .store import product_key
65 + ok_products: list[dict] = []
66 + problems: list[str] = []
67 + seen: set[tuple[str, float]] = set()
68 + for p in products:
69 + valid, issues = validate_product(p)
70 + if not valid:
71 + name = p.get("product_name") or "?"
72 + problems.extend(f"{name}: {i}" for i in issues)
73 + continue
74 + key = (product_key(p), round(float(p["rate"]), 4))
75 + if key in seen:
76 + continue # duplicata exact silencieusement ignoré
77 + seen.add(key)
78 + ok_products.append(p)
79 + return ok_products, problems
modified immoka/seo.py +8 −1
@@ -610,6 +610,12 @@ _STATIC_META = {
610 610 "Toutes les bannières et agences agrégées par Immo-Ka : RE/MAX, Via Capitale, "
611 611 "Sutton, Proprio Direct, Engel & Völkers, Sotheby's, DuProprio et plus.",
612 612 False),
613 + "/taux-hypothecaires": (
614 + "Taux hypothécaires au Canada — comparateur en direct",
615 + "Comparez les taux hypothécaires réellement publiés par RBC, TD, BMO, CIBC, "
616 + "Scotia, BNC, Desjardins, Tangerine, EQ et plus — fixes et variables, avec "
617 + "source officielle, fraîcheur et historique. Collecte continue par Immo-Ka.",
618 + False),
613 619 "/conditions": ("Conditions d'utilisation",
614 620 "Conditions d'utilisation de la plateforme Immo-Ka (Groupe-Ka).", False),
615 621 "/confidentialite": ("Politique de confidentialité",
@@ -736,7 +742,8 @@ def sitemap_file(name: str) -> Response:
736 742
737 743 if name == "pages.xml":
738 744 return _xml([_url_el(f"{BASE_URL}{p}")
739 − for p in ["/", "/stats", "/agences", "/conditions", "/confidentialite"]])
745 + for p in ["/", "/stats", "/agences", "/taux-hypothecaires",
746 + "/conditions", "/confidentialite"]])
740 747
741 748 return Response("Sitemap introuvable", status_code=404)
742 749
modified immoka/web.py +4 −0
@@ -35,6 +35,10 @@ app.add_middleware(GZipMiddleware, minimum_size=1024)
35 35 app.include_router(auth.router)
36 36 # favoris ♥ — magasin central au hub Groupe KA, voir immoka/favorites.py
37 37 app.include_router(favorites.router)
38 +# moteur hypothécaire — taux réels multibanques + calculateur canadien,
39 +# voir immoka/mortgage/ (docs/mortgage-engine.md)
40 +from .mortgage import api as mortgage_api # noqa: E402
41 +app.include_router(mortgage_api.router)
38 42
39 43 _sync_lock = threading.Lock()
40 44
modified run.py +18 −0
@@ -12,6 +12,9 @@
12 12 python run.py geocode [n] # géocode les annonces sans coordonnées (max n requêtes)
13 13 python run.py poi [n] # commodités de proximité par immeuble (max n requêtes)
14 14 python run.py quartier [n] # rattache chaque annonce à son aire de diffusion (DAUID)
15 + python run.py mortgage-sync [slug…] # collecte les taux hypothécaires (toutes banques ou celles listées)
16 + python run.py mortgage-watch [min] # collecte en boucle (défaut IMMOKA_MORTGAGE_INTERVAL_MIN=180)
17 + python run.py mortgage-status # santé des providers de taux (OK/WARNING/ERROR)
15 18 """
16 19 from __future__ import annotations
17 20
@@ -80,6 +83,21 @@ def main() -> None:
80 83 vraiprix_local.enrich_role(lim)
81 84 else:
82 85 vraiprix_local.run(lim, revalidate=reval)
86 + elif cmd == "mortgage-sync":
87 + from immoka.mortgage import scheduler
88 + scheduler.run(sys.argv[2:] or None)
89 + elif cmd == "mortgage-watch":
90 + from immoka.mortgage import scheduler
91 + minutes = int(sys.argv[2]) if len(sys.argv) > 2 else None
92 + scheduler.watch(minutes)
93 + elif cmd == "mortgage-status":
94 + from immoka.mortgage import store
95 + con = store.connect()
96 + for h in store.provider_health(con):
97 + print(f"{h['level']:8s} {h['provider']:15s} "
98 + f"statut={h.get('status') or '-'} "
99 + f"produits_courants={h.get('current_products', 0)} "
100 + f"dernière_passe=il y a {h.get('age_minutes', '?')} min")
83 101 elif cmd == "serve":
84 102 import uvicorn
85 103 port = int(sys.argv[2]) if len(sys.argv) > 2 else 8090
added tests/__init__.py +0 −0
added tests/fixtures/mortgage/bank-of-canada.json +253 −0
@@ -0,0 +1,253 @@
1 +{
2 + "terms": {
3 + "url": "https://www.bankofcanada.ca/terms/"
4 + },
5 + "seriesDetail": {
6 + "BD.CDN.5YR.DQ.YLD": {
7 + "label": "Benchmark bond yield: 5 year",
8 + "description": "The yield on the Government of Canada 5-year benchmark bond. This series reports the prevailing yield for the 5-year maturity point on the Canadian government bond yield curve.",
9 + "dimension": {
10 + "key": "d",
11 + "name": "Date"
12 + }
13 + },
14 + "V39079": {
15 + "label": "Target for the overnight rate (business daily)",
16 + "description": "Also called the policy interest rate, the average rate that the Bank of Canada wants to see in the market for overnight money market financing. (V39079)",
17 + "dimension": {
18 + "key": "d",
19 + "name": "Date"
20 + }
21 + },
22 + "V80691333": {
23 + "label": "Conventional mortgage: 1-year",
24 + "description": "The interest rate for a 1-year conventional mortgage offered by chartered banks in Canada.",
25 + "dimension": {
26 + "key": "d",
27 + "name": "Date"
28 + }
29 + },
30 + "V80691334": {
31 + "label": "Conventional mortgage: 3-year",
32 + "description": "The interest rate for a 3-year conventional mortgage offered by chartered banks in Canada.",
33 + "dimension": {
34 + "key": "d",
35 + "name": "Date"
36 + }
37 + },
38 + "V80691335": {
39 + "label": "Conventional mortgage: 5-year",
40 + "description": "The interest rate for a 5-year conventional mortgage offered by chartered banks in Canada.",
41 + "dimension": {
42 + "key": "d",
43 + "name": "Date"
44 + }
45 + }
46 + },
47 + "observations": [
48 + {
49 + "d": "2026-08-19",
50 + "V80691335": {
51 + "v": "6.09"
52 + },
53 + "BD.CDN.5YR.DQ.YLD": {
54 + "v": "3.30"
55 + },
56 + "V39079": {
57 + "v": "2.25"
58 + },
59 + "V80691333": {
60 + "v": "5.49"
61 + },
62 + "V80691334": {
63 + "v": "6.05"
64 + }
65 + },
66 + {
67 + "d": "2026-08-12",
68 + "V80691335": {
69 + "v": "6.09"
70 + },
71 + "BD.CDN.5YR.DQ.YLD": {
72 + "v": "3.30"
73 + },
74 + "V39079": {
75 + "v": "2.25"
76 + },
77 + "V80691333": {
78 + "v": "5.49"
79 + },
80 + "V80691334": {
81 + "v": "6.05"
82 + }
83 + },
84 + {
85 + "d": "2026-08-05",
86 + "V80691335": {
87 + "v": "6.09"
88 + },
89 + "V80691333": {
90 + "v": "5.49"
91 + },
92 + "V80691334": {
93 + "v": "6.05"
94 + }
95 + },
96 + {
97 + "d": "2026-07-29",
98 + "V80691335": {
99 + "v": "6.09"
100 + },
101 + "V80691333": {
102 + "v": "5.49"
103 + },
104 + "V80691334": {
105 + "v": "6.05"
106 + }
107 + },
108 + {
109 + "d": "2026-07-22",
110 + "V80691335": {
111 + "v": "6.09"
112 + },
113 + "V80691333": {
114 + "v": "5.49"
115 + },
116 + "V80691334": {
117 + "v": "6.05"
118 + }
119 + },
120 + {
121 + "d": "2026-07-15",
122 + "V80691335": {
123 + "v": "6.09"
124 + },
125 + "V80691333": {
126 + "v": "5.49"
127 + },
128 + "V80691334": {
129 + "v": "6.05"
130 + }
131 + },
132 + {
133 + "d": "2026-07-08",
134 + "V80691335": {
135 + "v": "6.09"
136 + },
137 + "V80691333": {
138 + "v": "5.49"
139 + },
140 + "V80691334": {
141 + "v": "6.05"
142 + }
143 + },
144 + {
145 + "d": "2026-07-01",
146 + "V80691335": {
147 + "v": "6.09"
148 + },
149 + "V80691333": {
150 + "v": "5.49"
151 + },
152 + "V80691334": {
153 + "v": "6.05"
154 + }
155 + },
156 + {
157 + "d": "2026-06-24",
158 + "V80691335": {
159 + "v": "6.09"
160 + },
161 + "V80691333": {
162 + "v": "5.49"
163 + },
164 + "V80691334": {
165 + "v": "6.05"
166 + }
167 + },
168 + {
169 + "d": "2026-06-17",
170 + "V80691335": {
171 + "v": "6.09"
172 + },
173 + "V80691333": {
174 + "v": "5.49"
175 + },
176 + "V80691334": {
177 + "v": "6.05"
178 + }
179 + },
180 + {
181 + "d": "2026-08-21",
182 + "BD.CDN.5YR.DQ.YLD": {
183 + "v": "3.36"
184 + },
185 + "V39079": {
186 + "v": "2.25"
187 + }
188 + },
189 + {
190 + "d": "2026-08-20",
191 + "BD.CDN.5YR.DQ.YLD": {
192 + "v": "3.35"
193 + },
194 + "V39079": {
195 + "v": "2.25"
196 + }
197 + },
198 + {
199 + "d": "2026-08-18",
200 + "BD.CDN.5YR.DQ.YLD": {
201 + "v": "3.29"
202 + },
203 + "V39079": {
204 + "v": "2.25"
205 + }
206 + },
207 + {
208 + "d": "2026-08-17",
209 + "BD.CDN.5YR.DQ.YLD": {
210 + "v": "3.31"
211 + },
212 + "V39079": {
213 + "v": "2.25"
214 + }
215 + },
216 + {
217 + "d": "2026-08-14",
218 + "BD.CDN.5YR.DQ.YLD": {
219 + "v": "3.28"
220 + },
221 + "V39079": {
222 + "v": "2.25"
223 + }
224 + },
225 + {
226 + "d": "2026-08-13",
227 + "BD.CDN.5YR.DQ.YLD": {
228 + "v": "3.23"
229 + },
230 + "V39079": {
231 + "v": "2.25"
232 + }
233 + },
234 + {
235 + "d": "2026-08-11",
236 + "BD.CDN.5YR.DQ.YLD": {
237 + "v": "3.32"
238 + },
239 + "V39079": {
240 + "v": "2.25"
241 + }
242 + },
243 + {
244 + "d": "2026-08-10",
245 + "BD.CDN.5YR.DQ.YLD": {
246 + "v": "3.34"
247 + },
248 + "V39079": {
249 + "v": "2.25"
250 + }
251 + }
252 + ]
253 +}
\ No newline at end of file
added tests/fixtures/mortgage/bmo.json +239 −0
@@ -0,0 +1,239 @@
1 +{
2 + "ca-mortgages-special-rates": {
3 + "url": "https://www.bmo.com/public-data/api/v2.0/bmo-ca-mortgages-rates.json",
4 + "payload": {
5 + "fixed3YearClosedSpecial": 4.64,
6 + "fixed3YearClosedSpecialApr": 4.67,
7 + "fixed3YearClosedSpecialOver25": 4.74,
8 + "fixed3YearClosedSpecialOver25Apr": 4.77,
9 + "fixed1YearClosedUnder25Apr": 5.58,
10 + "fixed1YearClosedOver25Apr": 5.58,
11 + "fixed2YearClosedUnder25Apr": 4.93,
12 + "fixed2YearClosedOver25Apr": 4.93,
13 + "fixed3YearClosedUnder25Apr": 6.08,
14 + "fixed3YearClosedOver25Apr": 6.08,
15 + "fixed4YearClosedUnder25Apr": 6.01,
16 + "fixed4YearClosedOver25Apr": 6.01,
17 + "fixed5YearClosedUnder25Apr": 6.11,
18 + "fixed5YearClosedOver25Apr": 6.11,
19 + "fixed6YearClosedUnder25Apr": 6.31,
20 + "fixed6YearClosedOver25Apr": 6.31,
21 + "fixed7YearClosedUnder25Apr": 6.41,
22 + "fixed7YearClosedOver25Apr": 6.41,
23 + "fixed10YearClosedUnder25Apr": 6.81,
24 + "fixed10YearClosedOver25Apr": 6.81,
25 + "fixed6MonthConvertibleUnder25Apr": 5.67,
26 + "fixed6MonthConvertibleOver25Apr": 5.67,
27 + "fixed6MonthOpenUnder25Apr": 10.13,
28 + "fixed6MonthOpenOver25Apr": 10.13,
29 + "fixed1YearOpenUnder25Apr": 10.04,
30 + "fixed1YearOpenOver25Apr": 10.04,
31 + "smartFixed5YearClosedSpecial": 4.84,
32 + "smartFixed5YearClosedSpecialApr": 4.86,
33 + "smartFixed5YearClosedHighRatioSpecial": 4.74,
34 + "smartFixed5YearClosedHighRatioSpecialApr": 4.76,
35 + "smartFixed5YearClosedPostedApr": 4.81,
36 + "smartFixed10YearClosedPostedApr": 5.62,
37 + "fixed5YearClosedSmartUnder25Apr": 6.01,
38 + "fixed10YearClosedSmartUnder25Apr": 6.71,
39 + "variable5YearClosedSpecial": 4.1,
40 + "variable5YearClosedSpecialApr": 4.12,
41 + "variable5YearClosedSpecialOver25": 4.2,
42 + "variable5YearClosedSpecialOver25Apr": 4.22,
43 + "variable3YearOpenUnder25Apr": 7.78,
44 + "variable3YearOpenOver25Apr": 7.78,
45 + "variable5YearClosedUnder25Apr": 4.47,
46 + "variable5YearClosedOver25Apr": 4.47
47 + }
48 + },
49 + "epm-mortgage": {
50 + "url": "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-mortgage.json",
51 + "payload": {
52 + "mortgageRates": {
53 + "fixed": {
54 + "6MonthConvertible": {
55 + "en": "6 month (convertible)",
56 + "fr": "6 mois (convertible)",
57 + "value": "5.490",
58 + "term_months": "6"
59 + },
60 + "6MonthOpen": {
61 + "en": "6 month (open)",
62 + "fr": "6 mois (ouvert)",
63 + "value": "9.950",
64 + "term_months": "6"
65 + },
66 + "1YearClosed": {
67 + "en": "1 year (closed)",
68 + "fr": "1 an (ferm\u00e9)",
69 + "value": "5.490",
70 + "term_months": "12"
71 + },
72 + "1YearOpen": {
73 + "en": "1 year (open)",
74 + "fr": "1 an (ouvert)",
75 + "value": "9.950",
76 + "term_months": "12"
77 + },
78 + "2YearClosed": {
79 + "en": "2 year (closed)",
80 + "fr": "2 ans (ferm\u00e9)",
81 + "value": "4.890",
82 + "term_months": "24"
83 + },
84 + "3YearClosed": {
85 + "en": "3 year (closed)",
86 + "fr": "3 ans (ferm\u00e9)",
87 + "value": "6.050",
88 + "term_months": "36"
89 + },
90 + "4YearClosed": {
91 + "en": "4 year (closed)",
92 + "fr": "4 ans (ferm\u00e9)",
93 + "value": "5.990",
94 + "term_months": "48"
95 + },
96 + "5YearClosed": {
97 + "en": "5 year (closed)",
98 + "fr": "5 ans (ferm\u00e9)",
99 + "value": "6.090",
100 + "term_months": "60"
101 + },
102 + "6YearClosed": {
103 + "en": "6 year (closed)",
104 + "fr": "6 ans (ferm\u00e9)",
105 + "value": "6.290",
106 + "term_months": "72"
107 + },
108 + "7YearClosed": {
109 + "en": "7 year (closed)",
110 + "fr": "7 ans (ferm\u00e9)",
111 + "value": "6.400",
112 + "term_months": "84"
113 + },
114 + "10Yearclosed": {
115 + "en": "10 year(closed)",
116 + "fr": "10 ans (ferm\u00e9)",
117 + "value": "6.800",
118 + "term_months": "120"
119 + },
120 + "18YearOpen": {
121 + "en": "18 year (open)",
122 + "fr": "18 ans (ouvert)",
123 + "value": "8.500",
124 + "term_months": "216"
125 + }
126 + },
127 + "variable": {
128 + "12VariableLimited": {
129 + "en": "012 VARIABLE LIMITED",
130 + "fr": "VARIABLE LIMITEE",
131 + "value": "2.750",
132 + "term_months": "12"
133 + },
134 + "12VariableOpen": {
135 + "en": "012 VARIABLE OPEN",
136 + "fr": "VARIABLE OUVERT",
137 + "value": "2.750",
138 + "term_months": "12"
139 + },
140 + "3YearOpen": {
141 + "en": "3 year (open)",
142 + "fr": "3 ans (ouvert)",
143 + "value": "7.750",
144 + "term_months": "36"
145 + },
146 + "5YearClosed": {
147 + "en": "5 year (closed)",
148 + "fr": "5 ans (ferm\u00e9)",
149 + "value": "4.450",
150 + "term_months": "60"
151 + }
152 + },
153 + "fixedEcoSmartRate": {
154 + "5YearBmoEcoSmartMortgageTmClosed": {
155 + "en": "5 year (BMO Eco Smart Mortgage (TM) closed)",
156 + "fr": "5 ans (Hypoth\u00e8que \u00c9nergie Plus BMO (MC) ferm\u00e9)",
157 + "value": "5.340",
158 + "term_months": "60"
159 + }
160 + },
161 + "fixedLowRate": {
162 + "5YearLowRateClosed": {
163 + "en": "5 year low rate (closed)",
164 + "fr": "5 ans - petit taux (ferm\u00e9)",
165 + "value": "5.990",
166 + "term_months": "60"
167 + },
168 + "10YearLowRateClosed": {
169 + "en": "10 year low rate (closed)",
170 + "fr": "10 ans - petit taux (ferm\u00e9)",
171 + "value": "6.700",
172 + "term_months": "120"
173 + }
174 + }
175 + },
176 + "specialMortgageRates": {
177 + "fixed": {
178 + "36Month": "0.000",
179 + "48Month": "0.000",
180 + "60Month": "5.290",
181 + "84Month": "6.350",
182 + "120Month": "6.750"
183 + },
184 + "fixedEcoSmartRate": {
185 + "60Month": "4.090"
186 + },
187 + "fixedLowRate": {
188 + "60Month": "5.990",
189 + "120Month": "6.700"
190 + }
191 + },
192 + "homeownerReadiline": {
193 + "fixed": {
194 + "12Month": "5.490",
195 + "24Month": "4.890",
196 + "36Month": "6.050",
197 + "48Month": "5.990",
198 + "60Month": "6.090",
199 + "72Month": "6.290",
200 + "84Month": "6.400",
201 + "120Month": "6.800"
202 + },
203 + "variable": {
204 + "60Month": "4.450"
205 + }
206 + },
207 + "agriInvestRates": {
208 + "value": "1.750"
209 + },
210 + "timestamp": "8/23/2026, 08:36:22"
211 + }
212 + },
213 + "epm-prime": {
214 + "url": "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-prime.json",
215 + "payload": {
216 + "caPrimeRate": {
217 + "value": "4.450",
218 + "effectiveDate": "2025-10-30"
219 + },
220 + "usBaseRate": {
221 + "value": "7.250",
222 + "effectiveDate": "2025-12-11"
223 + },
224 + "caDepositReferenceRate": {
225 + "value": "4.300",
226 + "effectiveDate": "2025-10-30"
227 + },
228 + "usDepositReferenceRate": {
229 + "value": "3.750",
230 + "effectiveDate": "2025-12-11"
231 + },
232 + "bankOfCanadaOvernightRate": {
233 + "value": "2.250",
234 + "effectiveDate": "2025-10-30"
235 + },
236 + "timestamp": "8/23/2026, 08:36:22"
237 + }
238 + }
239 +}
\ No newline at end of file
added tests/fixtures/mortgage/cibc.json +107 −0
@@ -0,0 +1,107 @@
1 +var p5YRVARCLO = {
2 +lobId : 5,
3 +expiryDate : null,
4 +inceptionDate : 'Fri Mar 07 00:00:00 EST 2008',
5 +rates : [
6 +['5_null_null_Years_T', null, 2, '4.12', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null],
7 +['3_null_null_Years_T', null, 18, '4.05', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null],
8 +['5_null_null_Years_T', null, 18, '4.10', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null],
9 +['3_null_null_Years_T', null, 34, '3.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null],
10 +['3_null_null_Years_T', null, 1, '4.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null],
11 +['5_null_null_Years_T', null, 1, '4.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null],
12 +['3_null_null_Years_T', null, 2, '4.07', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null],
13 +['5_null_null_Years_T', null, 34, '3.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null]
14 +]}
15 +var VROM = {
16 +lobId : 5,
17 +expiryDate : null,
18 +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007',
19 +rates : [
20 +['5_null_null_Years_T', null, 2, '-99.999999991', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null],
21 +['5_null_null_Years_T', null, 18, '-99.999999991', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null],
22 +['5_null_null_Years_T', null, 1, '7.75', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null],
23 +['5_null_null_Years_T', null, 34, '7.00', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null]
24 +]}
25 +var FOM = {
26 +lobId : 5,
27 +expiryDate : null,
28 +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007',
29 +rates : [
30 +['1_null_null_Year_T', null, 2, '-99.999999991', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null],
31 +['1_null_null_Year_T', null, 1, '10.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null],
32 +['1_null_null_Year_T', null, 34, '9.10', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null],
33 +['6_null_null_Months_T', null, 2, '-99.999999991', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null],
34 +['6_null_null_Months_T', null, 18, '0.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null],
35 +['6_null_null_Months_T', null, 1, '10.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null],
36 +['6_null_null_Months_T', null, 34, '9.95', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null],
37 +['1_null_null_Year_T', null, 18, '0.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null]
38 +]}
39 +var FRCM = {
40 +lobId : 5,
41 +expiryDate : null,
42 +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007',
43 +rates : [
44 +['1_null_null_Year_T', null, 2, '4.76', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
45 +['1_null_null_Year_T', null, 1, '4.99', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
46 +['4_null_null_Years_T', null, 18, '4.89', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
47 +['4_null_null_Years_T', null, 34, '3.99', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
48 +['5_null_null_Years_T', null, 1, '6.49', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
49 +['10_null_null_Years_T', null, 2, '-99.999999991', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
50 +['10_null_null_Years_T', null, 1, '6.79', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
51 +['5_null_null_Years_T', null, 18, '4.94', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
52 +['7_null_null_Years_T', null, 1, '6.30', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
53 +['4_null_null_Years_T', null, 2, '4.91', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
54 +['7_null_null_Years_T', null, 2, '5.13', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
55 +['4_null_null_Years_T', null, 1, '6.19', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
56 +['5_null_null_Years_T', null, 34, '4.09', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
57 +['7_null_null_Years_T', null, 34, '4.29', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
58 +['2_null_null_Years_T', null, 18, '4.49', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
59 +['7_null_null_Years_T', null, 18, '5.11', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
60 +['3_null_null_Years_T', null, 1, '6.14', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
61 +['3_null_null_Years_T', null, 2, '4.76', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
62 +['2_null_null_Years_T', null, 34, '3.84', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
63 +['1_null_null_Year_T', null, 18, '4.74', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
64 +['10_null_null_Years_T', null, 18, '-99.999999991', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
65 +['1_null_null_Year_T', null, 34, '4.54', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
66 +['10_null_null_Years_T', null, 34, '4.42', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
67 +['5_null_null_Years_T', null, 2, '4.96', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
68 +['3_null_null_Years_T', null, 18, '4.74', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
69 +['3_null_null_Years_T', null, 34, '3.79', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
70 +['2_null_null_Years_T', null, 1, '5.24', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
71 +['2_null_null_Years_T', null, 2, '4.51', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null]
72 +]}
73 +var MICRO = {
74 +lobId : 5,
75 +expiryDate : null,
76 +inceptionDate : 'Thu Jan 13 00:00:00 EST 2011',
77 +rates : [
78 +['5_null_null_Years_T', null, 2, '4.61', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
79 +['5_null_null_Years_T', null, 18, '4.59', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null],
80 +['5_null_null_Years_T', null, 1, '6.49', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null]
81 +]}
82 +var CCM = {
83 +lobId : 5,
84 +expiryDate : null,
85 +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007',
86 +rates : [
87 +['6_null_null_Months_T', null, 2, '-99.999999991', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null],
88 +['6_null_null_Months_T', null, 18, '0.00', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null],
89 +['6_null_null_Months_T', null, 1, '7.55', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null],
90 +['6_null_null_Months_T', null, 34, '7.50', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null]
91 +]}
92 +var MICROVAR = {
93 +lobId : 5,
94 +expiryDate : null,
95 +inceptionDate : 'Fri Jun 10 00:00:00 EDT 2011',
96 +rates : [
97 +['5_null_null_Years_T', null, 2, '3.97', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null],
98 +['5_null_null_Years_T', null, 18, '3.95', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null],
99 +['5_null_null_Years_T', null, 1, '4.45', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null]
100 +]}
101 +var PRIME = {
102 +lobId : 1,
103 +expiryDate : null,
104 +inceptionDate : 'Fri Jan 01 00:00:00 EST 1960',
105 +rates : [
106 +[null, null, null, '4.45', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null]
107 +]}
added tests/fixtures/mortgage/desjardins.html +3 −0
@@ -0,0 +1,3 @@
1 +<!doctype html><html lang="fr"><head><meta name="mw-date-published" content="2022-09-12"><meta name="mw-date-modified" content="2026-08-10"><meta name="mw-type-page" content="Page d'accueil"><meta name="mw-page-name" content="accueil:hypotheque:taux-hypothecaires"><meta name="mw-lang-en" content="https://www.desjardins.com/en/mortgage/mortgage-rates.html"><meta name="mw-lang-fr" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta name="content-page-ref" content="ovnR7Vdh4Q-ODglL5i5BsQwm04GtbtrdVgIsSrXiMD6tRZRThCgA3b9LMzY86_2o7Wn6sGm9KU9URgPlEfF2SA4YmsgTx8UI1ttXtSSMzsu8sYt1IOqZCBh329ze_FNE"/>
2 +<script defer="defer" type="text/javascript" src="https://rum.hlx.page/.rum/@adobe/helix-rum-js@%5E2/dist/rum-standalone.js" data-routing="env=prod,tier=publish,ams=Groupe Technologies Desjardins"></script>
3 +<script id="consentementCookiesScript" src="https://static.desjardins.com/fw/cookie/scriptCookie.js" data-domain-script="e9872dc2-14af-4d30-b0e9-01b95a0b9ab1"></script><script data-ot-ignore>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.setAttributeNode(d.createAttribute('data-ot-ignore'));j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl + "";f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer',"GTM\u002D5R3PP9");</script><meta charset="UTF-8"><title>Taux hypothécaires actuels : taux fixes et variables - Desjardins</title><meta name="keywords" content="Information,Taux hypothécaires,Taux hypothécaires promotionnels,Prêt hypothécaire,Particuliers"><meta name="description" content="Découvrez nos taux hypothécaires fixes et variables en vigueur. Trouvez le prêt qui répond à vos besoins et réservez votre taux."><meta name="searchCategory" content="Hypothèque"><script type="application/ld+json">{"@context": "https://schema.org","@type": "FAQPage","mainEntity": [{"@type": "Question","name": "<h3>Pourquoi les taux hypothécaires augmentent-ils?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>La variation à la hausse ou à la baisse des taux hypothécaires dépend principalement du taux directeur établi par la Banque du Canada. Le taux directeur fluctue selon la situation économique au Canada et à l'étranger. Son rôle est de réguler l'inflation en fonction de la croissance économique. Une hausse du taux directeur, et donc des taux hypothécaires, sert à ralentir l'inflation, à stimuler l'épargne et à stabiliser le cycle économique. </p><p>Pour en savoir plus, lisez l'article <a href=\"https://www.desjardins.com/qc/fr/conseils/hausse-taux-hypothecaires-4-questions-reponses.html\" target=\"_blank\" rel=\"noopener noreferrer\">Hausse des taux hypothécaires : 4 questions et leurs réponses</a>.</p>\""}},{"@type": "Question","name": "<h3>Pourquoi réserver mon taux hypothécaire?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>Réserver votre taux hypothécaire vous permet de vous protéger des hausses de taux pendant vos démarches d'achat de propriété. Nous fixons votre taux en fonction de votre dossier et la durée pour laquelle il est garanti selon votre projet et vos besoins. Pour que votre taux reste garanti, votre dossier et les paramètres de votre financement doivent rester les mêmes durant la période convenue. Sinon, votre garantie de taux pourrait devoir être réévaluée en fonction des derniers taux en vigueur.</p><p>Contactez-nous pour en savoir plus ou réserver votre taux.</p><p><a href=\"https://rappel.desjardins.com/#/dcom-pleine-page?struct=%5B%22VPA%22,%22DPCCCSC%22,%22Financement%22%5D&amp;dest=FIN_Hypotheque_Clic&amp;da=P&amp;source=https:%2F%2Fwww.desjardins.com%2Fparticuliers%2Fprets-marges-cartes-credit%2Fprets-hypothecaires%2Fpreautorisation%2F\" target=\"_blank\" rel=\"noopener noreferrer\">Planifier un appel</a></p>"}},{"@type": "Question","name": "<h3>Comment puis-je me protéger des hausses des taux d'intérêt hypothécaires?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>Dès le début de vos démarches d'achat de maison, pensez à demander une préautorisation pour garantir votre taux. Évaluez aussi les incidences qu'une augmentation des taux d'intérêt aurait dans votre budget. Même si nous vérifions votre capacité à rembourser votre prêt à un taux plus élevé que celui proposé, votre situation financière peut changer au fil du temps. Assurez-vous donc d'avoir une marge de manœuvre suffisante et de mettre de l'argent de côté dans un <a href=\"https://www.desjardins.com/particuliers/comptes-services-relies/comptes-epargne/\" target=\"_blank\" rel=\"noopener noreferrer\">compte d'épargne</a>.</p>\""}},{"@type": "Question","name": "<h3>J'ai un prêt chez Desjardins. Où puis-je consulter mon taux hypothécaire actuel?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>Vous pouvez vérifier votre taux actuel et voir d'autres détails sur votre prêt hypothécaire dans AccèsD.</p><h4>Dans un navigateur Web</h4><ol><li>Connectez-vous à <a href=\"https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&amp;langueCible=fr&amp;executeTime=24\" target=\"_blank\" rel=\"noopener noreferrer\">AccèsD</a>.</li><li>Sous <strong>Cartes, prêts et marges</strong>, choisissez le compte <strong>Prêt hypothécaire résidentiel</strong>.</li><li>Ouvrez le tiroir <strong>Information sur le compte </strong>pour consulter votre taux hypothécaire et d'autres détails.</li></ol><h4>Dans l'appli Services mobiles Desjardins</h4><ol><li>Connectez-vous à <a href=\"https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&amp;langueCible=fr&amp;executeTime=24\" target=\"_blank\" rel=\"noopener noreferrer\">AccèsD</a>.</li><li> Sous <strong>Accès rapide</strong>, choisissez <strong>Mes comptes</strong>.</li><li>Sélectionnez le compte associé à votre prêt hypothécaire résidentiel.</li><li>Sélectionnez <strong>Information</strong>.</li><li>Consultez le <strong>Taux d'intérêt annuel en vigueur</strong>.</li></ol>\""}}]}{"@context": "https://schema.org","about": [{"@type": "Thing","name": "Taux d'intérêt","description": "Le taux d'intérêt d'un prêt ou d'un emprunt fixe la rémunération du capital prêté (exprimée en pourcentage du montant prêté) versée par l'emprunteur au prêteur","SameAs": ["https://www.wikidata.org/wiki/Q179179","https://fr.wikipedia.org/wiki/Taux_d'intérêt"]},{"@type": "Thing","name": "Crédit hypothécaire","description": "Un crédit hypothécaire est un crédit immobilier qui est garanti par une hypothèque, c'est-à-dire que le prêteur dispose du bien immobilier sous-jacent comme garantie sur le prêt","SameAs": ["https://www.wikidata.org/wiki/Q1210094","https://fr.wikipedia.org/wiki/Crédit_hypothécaire"]}],"mentions": [{"@type": "Thing","name": "Taux directeur","description": "Les taux directeurs sont les taux d'intérêt au jour le jour fixés par la banque centrale d'un pays ou d'une union monétaire, et qui permettent à celle-ci de réguler l'activité économique","SameAs": ["https://www.wikidata.org/wiki/Q1210392","https://fr.wikipedia.org/wiki/Taux_directeur"]},{"@type": "Thing","name": "Banque du Canada","description": "La Banque du Canada (en anglais : Bank of Canada) est la banque centrale du Canada. Elle est mise en place et régulée par la Loi sur la Banque du Canada","SameAs": ["https://www.wikidata.org/wiki/Q806703","https://fr.wikipedia.org/wiki/Banque_du_Canada"]},{"@type": "Thing","name": "Caisses Desjardins","description": "Le Mouvement des Caisses Desjardins est une coopérative de caisses populaires fondé le 6 décembre 1900 par Alphonse Desjardins à Lévis (Québec, Canada), où est aujourd'hui établi son siège social, bien que la majorité de ses dirigeants et de ses activités sont basées au Complexe Desjardins du centre-ville de Montréal","SameAs": ["https://www.wikidata.org/wiki/Q2933350","https://fr.wikipedia.org/wiki/Caisses_Desjardins"]}]}</script><link rel="canonical" href="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><link rel="alternate" hreflang="en-ca" href="https://www.desjardins.com/en/mortgage/mortgage-rates.html"><link rel="alternate" hreflang="fr-ca" href="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta name="template" content="page-content"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="robots" content="INDEX,FOLLOW"><meta property="twitter:title" content="Taux hypothécaires actuels : taux fixes et variables"><meta property="twitter:card" content="summary"><meta property="twitter:url" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta property="twitter:site" content="@mvtdesjardins"><meta property="twitter:image" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.thumb.630.1200.png"><meta property="twitter:description" content="Découvrez nos taux hypothécaires et trouvez le meilleur prêt pour vous."><meta property="og:title" content="Taux hypothécaires actuels : taux fixes et variables"><meta property="og:url" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta property="og:type" content="website"><meta property="og:site_name" content="Desjardins.com"><meta property="og:image" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.thumb.630.1200.png"><meta property="og:description" content="Découvrez nos taux hypothécaires et trouvez le meilleur prêt pour vous."><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-base.min.bc884bc98197eef5529ede0a3ef0bf4d.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-dsd-legacy/4.1.0.min.a94d015a5958379326cf8603af0f5d39.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-dsd/4.1.0.min.810fc0f35f903f7dd0ef5ddb406914e3.css" type="text/css"><script type="module" src="/etc.clientlibs/dcom/clientlibs/clientlib-dsd/4.1.0/resources/library.esm.js"></script><script nomodule="" src="/etc.clientlibs/dcom/clientlibs/clientlib-dsd/4.1.0/resources/library.js"></script><script src="/etc.clientlibs/dcom/components/mocks/analyticsdatatester/clientlibs/clientlib-dependencies.min.a890c282784c557cbb020420f31c7891.js"></script><script src="/etc.clientlibs/dcom/clientlibs/clientlib-dependencies.min.d41d8cd98f00b204e9800998ecf8427e.js"></script><link rel="stylesheet" href="/etc.clientlibs/dcom/components/mocks/analyticsdatatester/clientlibs/clientlib-dependencies.min.ac4f54ecfd6651f744fb7d41e38891c5.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-dependencies.min.d41d8cd98f00b204e9800998ecf8427e.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-site.min.f58ed0b57acab47fff773dc716977138.css" type="text/css"><link rel="shortcut icon" type="image/x-icon" href="/etc.clientlibs/dcom/clientlibs/clientlib-base/resources/favicon.ico"><script type="application/ld+json">[{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https://www.desjardins.com/"},{"@type":"ListItem","position":2,"name":"Hypothèque","item":"https://www.desjardins.com/fr/hypotheque.html"},{"@type":"ListItem","position":3,"name":"Taux hypothécaires","item":"https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"}]},{"@context":"https://schema.org","@type":"ImageObject","contentUrl":"https://www.desjardins.com/content/dam/images/photos/particuliers/hypotheque/taux%20preferentiel.png"}]</script><script>window.dcomProducts = {"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6M":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6M","id":"6000_6M","rate":"7.9900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR","id":"6004_5AR","rate":"4.1000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvp":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvp","id":"tvp","rate":"4.7000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A","id":"6000_4A","rate":"4.3900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A","id":"6000_5A","rate":"4.4900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1A","id":"6000_1A","rate":"5.4900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg2":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg2","id":"tvreg2","rate":"5.7000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_10A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_10A","id":"6000_10A","rate":"6.8900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1AO":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1AO","id":"6000_1AO","rate":"9.5000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg","id":"tvreg","rate":"5.7000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred","id":"tvred","rate":"4.4500"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6MO":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6MO","id":"6000_6MO","rate":"9.7500"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tra":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tra","id":"tra","rate":"5.4900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tptvp":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tptvp","id":"tptvp","rate":"7.5400"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_2A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_2A","id":"6000_2A","rate":"5.5900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_3A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_3A","id":"6000_3A","rate":"5.9900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A","id":"6000_4A","rate":"6.0400"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A","id":"6000_5A","rate":"6.0900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6A","id":"6000_6A","rate":"6.2900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_7A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_7A","id":"6000_7A","rate":"6.3900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tpcad":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tpcad","id":"tpcad","rate":"4.450"}};</script></head><body class="page basicpage" id="page-dc14bd2792" data-mw-bloquer-target="true"><script src="/etc.clientlibs/dcom/clientlibs/clientlib-smd.min.089b5f1c4efc35e99ad7165db91241db.js"></script><div class="root container responsivegrid"><div id="container-b47ea7389f" class="cmp-container simple" style=""><header class="msm-experiencefragment experiencefragment"><div id="msm-experiencefragment-8a70c91932" class="cmp-experiencefragment cmp-experiencefragment--header"><div id="container-6d6086367c" class="cmp-container simple" style=""><div class="menu-navigation msm-languagenavigation languagenavigation"><div id="menu-navigation" class="cmp-menu-navigation" data-isprovinceempty="true" data-currentlanguage="fr" data-currentprovincecode="QC" data-provinces="{&quot;AB&quot;:{&quot;code&quot;:&quot;AB&quot;,&quot;name&quot;:&quot;Alberta&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/ab/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/ab/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;BC&quot;:{&quot;code&quot;:&quot;BC&quot;,&quot;name&quot;:&quot;British Columbia&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/bc/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/bc/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;MB&quot;:{&quot;code&quot;:&quot;MB&quot;,&quot;name&quot;:&quot;Manitoba&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/mb/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/mb/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NB&quot;:{&quot;code&quot;:&quot;NB&quot;,&quot;name&quot;:&quot;New Brunswick&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nb/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nb/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NL&quot;:{&quot;code&quot;:&quot;NL&quot;,&quot;name&quot;:&quot;Newfoundland and Labrador&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nl/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nl/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NS&quot;:{&quot;code&quot;:&quot;NS&quot;,&quot;name&quot;:&quot;Nova Scotia&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/ns/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/ns/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NT&quot;:{&quot;code&quot;:&quot;NT&quot;,&quot;name&quot;:&quot;Northwest Territories&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nt/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nt/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NU&quot;:{&quot;code&quot;:&quot;NU&quot;,&quot;name&quot;:&quot;Nunavut&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nu/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nu/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;ON&quot;:{&quot;code&quot;:&quot;ON&quot;,&quot;name&quot;:&quot;Ontario&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/on/en/mortgage/mortgage-rates.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/on/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;PE&quot;:{&quot;code&quot;:&quot;PE&quot;,&quot;name&quot;:&quot;Prince Edward Island&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/pe/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/pe/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;QC&quot;:{&quot;code&quot;:&quot;QC&quot;,&quot;name&quot;:&quot;Quebec&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/qc/en/mortgage/mortgage-rates.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/qc/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;SK&quot;:{&quot;code&quot;:&quot;SK&quot;,&quot;name&quot;:&quot;Saskatchewan&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/sk/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/sk/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;YT&quot;:{&quot;code&quot;:&quot;YT&quot;,&quot;name&quot;:&quot;Yukon&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/yt/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/yt/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;OC&quot;:{&quot;code&quot;:&quot;OC&quot;,&quot;name&quot;:&quot;Ontario&quot;,&quot;links&quot;:{}}}"><div class="cmp-menu-navigation__desktop"><div class="cmp-menu-navigation__desktop__topbar"><div class="accessibility-links"><a href="#main-content" class="sr-only sr-only-focusable">Aller au contenu principal</a></div><div class="flex-container dsd-w-full"><div class="logo"><a href="/"> <img src="/content/dam/images/logos/commun/logo-desjardins-fr.svg" width="158" height="34" alt="Retourner à la page d'accueil de Desjardins.com"> </a></div><div class="flex-container"><nav class="secondary-menu" aria-label="Menu secondaire"><ul><li><a href="/a-propos/index.jsp">À propos</a></li><li><a href="/fr/carriere.html">Carrière</a></li><li><a href="/fr/conseils.html">Conseils</a></li><li><a href="/nous-joindre/index.jsp?idSectionRacine=0&amp;niveauSectionRacine=1&amp;idSectionFocus=0&amp;niveauSectionFocus=2">Nous joindre</a></li></ul></nav><nav id="parameters" aria-label="Paramètres"><ul><li><button id="btn-region-options" class="btn btn--regionalisation " aria-expanded="false" aria-controls="regionalisation" type="button"> <span class="dsd-sr-only"> Province ou État actuel : <span class="provinceInputs-sr-only">Québec</span> . Langue : <span class="languageInputs">Français</span> . </span> <span class="btn__text" aria-hidden="true"> <span class="provinceInputs">QC</span> | <span class="languageInputs">Français</span> </span> </button></li><li><button id="btn-search-panel-desktop" class="btn btn--search" aria-expanded="false" aria-controls="search-panel" type="button"> <span class="dsd-sr-only">Rechercher</span> </button></li></ul></nav></div></div></div><div class="cmp-menu-navigation__desktop__hiddenbar"><section id="regionalisation" style="display: none;" class="cmp-menu-navigation__regionalisation dsd-w-full"><form class="form"><div class="form__choose-lang"><fieldset><legend>Choisir votre langue</legend> <label for="rd-lang-fr" class="radio__label"> <input type="radio" id="rd-lang-fr" name="lang" value="fr" checked class="radio__input"> <span class="radio__indicator"></span> <span lang="fr">Français</span> </label> <label for="rd-lang-en" class="radio__label"> <input type="radio" id="rd-lang-en" name="lang" value="en" class="radio__input"> <span class="radio__indicator"></span> <span lang="en">English</span> </label></fieldset></div><div class="form__choose-province"><label for="slt-province">Choisir votre province ou État</label> <select id="slt-province" name="province" class="select"> <option disabled>Choisir</option> <optgroup label="Canada"> <option value="AB">Alberta</option> <option value="BC">Colombie-Britannique</option> <option value="PE">Île-du-Prince-Édouard</option> <option value="MB">Manitoba</option> <option value="NB">Nouveau-Brunswick</option> <option value="NS">Nouvelle-Écosse</option> <option value="NU">Nunavut</option> <option value="ON">Ontario</option> <option value="QC">Québec</option> <option value="SK">Saskatchewan</option> <option value="NL">Terre-Neuve-et-Labrador</option> <option value="NT">Territoires du Nord-Ouest</option> <option value="YT">Yukon</option> </optgroup> <optgroup label="États-Unis"> <option value="USA">Floride</option> </optgroup> </select></div><div class="form__submit"><dsd-button id="btn-regions-options-confirm" variant="primary" theme="brand">Confirmer </dsd-button></div></form> <button id="btn-close-regions-options" class="btn btn-close " type="button"> <span class="dsd-sr-only">Fermer</span><dsd-icon size="sm" icon-name="navigations_contour_fermer"></dsd-icon> </button><div class="tabbable_end_warning" tabindex="0" data-previous-focusable-element-id="btn-close-regions-options" data-quit-focus-element-id="btn-region-options">Vous quittez la boîte de dialogue.</div></section></div><div class="cmp-menu-navigation__desktop__main dsd-w-full"><nav id="main-menu" aria-label="Menu principal"><ul class="main-menu flex-container"><li id="btn-AccesD__desktop"><a href="https://accweb.mouv.desjardins.com/identifiantunique/sso/adp" class="accesD_no_trap"> AccèsD </a></li><li id="btn-AccesD-affaire__desktop"><a href="https://accesdc.mouv.desjardins.com/accueil" class="accesD_no_trap"> AccèsD Affaires </a></li><li id="#main-menu-1"><a id="menu_navigation_accesD__link" href="#main-menu-1" role="button" aria-expanded="false"> Particuliers </a><ul class="main-menu__sub" style="z-index: 100; display: none; overflow: hidden;"><li><a href="/fr/comptes-services.html">Comptes et services</a></li><li><a href="/fr/cartes-credit.html">Cartes de crédit</a></li><li><a href="/fr/hypotheque.html">Hypothèque</a></li><li><a href="/fr/prets-marges-credit.html">Prêts et marges de crédit</a></li><li><a href="/fr/epargne-placements.html">Épargne et placements</a></li><li><a href="/fr/assurances.html">Assurances<span class="dsd-sr-only">&nbsp;Particuliers</span></a></li><li><a href="/fr/gestion-patrimoine.html">Gestion de patrimoine</a></li><li><a href="/fr/offres.html">Offres</a></li><li><a href="/fr/epargne-placements/epargne-retraite-collective-participants.html">Épargne-retraite collective</a></li><li class="main-menu__sub__chevron"><a href="/particuliers/index.jsp">Voir tout<span class="dsd-sr-only">&nbsp;les éléments du menu Particuliers</span></a></li></ul></li><li id="#main-menu-2"><a id="menu_navigation_accesD-affaire__link" href="#main-menu-2" role="button" aria-expanded="false"> Entreprises </a><ul class="main-menu__sub" style="z-index: 100; display: none; overflow: hidden;"><li><a href="/fr/entreprises/comptes-tresorerie.html">Comptes et gestion de trésorerie </a></li><li><a href="/fr/entreprises/financement-prets.html">Financement et prêts</a></li><li><a href="/fr/entreprises/cartes-credit.html">Cartes de crédit</a></li><li><a href="/fr/entreprises/projets.html">Projets d’entreprise<br> </a></li><li><a href="/fr/entreprises/offres.html">Offres par secteur</a></li><li><a href="/fr/entreprises/solutions-outils/partenaires.html">Partenaires d’affaires et solutions entreprises</a></li><li><a href="/entreprises/solutions-employeurs/index.jsp">Solutions pour les employeurs</a></li><li><a href="/fr/entreprises/assurances.html">Assurances <span class="dsd-sr-only">Entreprises</span></a></li><li><a href="/fr/entreprises/international.html">Services internationaux</a></li><li><a href="/entreprises/investissement-placements/index.jsp">Investissement et placements</a></li><li><a href="/fr/entreprises/marche-capitaux.html">Marché des capitaux</a></li><li><a href="https://www.fiduciedesjardins.com/" target="_blank" rel="noopener noreferrer">Services fiduciaires<span class="dsd-sr-only">. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg class="externallink" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 3a1 1 0 110 2H2v17h17V12a1 1 0 012 0v11a1 1 0 01-1 1H1a1 1 0 01-1-1V4a1 1 0 011-1zm11-3a1 1 0 011 1v6a1 1 0 01-2 0V3.41L9.71 15.71a1 1 0 01-1.42 0 1 1 0 010-1.42L20.59 2H17a1 1 0 110-2z" fill-rule="evenodd" /></svg> </a></li><li><a href="/fr/entreprises/solutions-outils/epargne-retraite-collective.html">Épargne-retraite collective</a></li><li class="main-menu__sub__chevron"><a href="/fr/entreprises.html">Voir tout<span class="dsd-sr-only">&nbsp;les éléments du menu Entreprises</span></a></li></ul></li></ul></nav><nav class="services" aria-label="Accès aux services de Desjardins"><ul class="flex-container"><li><a href="/localisateur/index.jsp#/ps" class="services__localisations"> Points de service </a></li><li><dsd-button id="btn-login" variant="primary" icon-name="navigations_contour_chevron_petit_bas" icon-position="end" theme="brand" type="button"><dsd-icon class="secondary-icon" size="md" fill="dsd-color-icon-reversed" icon-name="contenus_contour_cadenas"></dsd-icon> Se connecter&nbsp; <span class="dsd-sr-only">aux services en ligne de Desjardins. Ouvre une boîte de dialogue</span> </dsd-button> <dsd-button id="btn-logout" variant="primary" icon-name="actions_contour_deconnexion" data-redirect-url="/?deconnexion=true" icon-position="start" theme="brand" type="button">Se déconnecter&nbsp; <span class="dsd-sr-only">des services en ligne de Desjardins.</span> </dsd-button><div id="login-popover" class="cmp-menu-navigation__login-popover is-hidden" role="dialog" aria-labelledby="login-popover-title" tabindex="-1"><div class="cmp-menu-navigation__login-popover__arrow"></div><div class="cmp-menu-navigation__login-popover__content"><h2 id="login-popover-title" tabindex="0">Se connecter</h2><div class="section"><h3>Services en ligne</h3><div class="cmp-menu-navigation__login-popover__logos"><a class="cmp-menu-navigation__login-popover__logos__accesd" href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification?domaineVirtuel=desjardins&amp;langueCible=fr" data-mw-action-clic="Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires."> <img width="100" height="30" alt="" src="/content/dam/images/logo/particuliers/accesd.svg"> <img width="100" height="35" alt="" src="/content/dam/images/logo/entreprises/accesd-affaires.svg"> <span class="dsd-sr-only"> Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires. </span> </a> <a href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification?domaineVirtuel=desjardins&amp;langueCible=fr" class="cmp-menu-navigation__login-popover__button" data-mw-action-clic="Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires. </span> </a></div><div class="cmp-menu-navigation__login-popover__logos__apps mobile d-block d-md-none"><h4>Accéder à l'application</h4><ul class="apps-link"><li><a href="https://apps.apple.com/ca/app/services-mobiles-desjardins/id386636953?l=fr-CA" target="_blank" rel="noopener noreferrer" data-mw-action-clic="eng|accueil|menu se connecter|na|acceder application apple"> <img src="/etc.clientlibs/dcom/clientlibs/clientlib-site/resources/images/appstore_fr.svg" alt="Télécharger dans l'App Store. Lien externe au site. S’ouvre dans un nouvel onglet."> </a></li><li><a href="https://play.google.com/store/apps/details?id=com.desjardins.mobile&amp;hl=fr_CA" target="_blank" rel="noopener noreferrer" data-mw-action-clic="eng|accueil|menu se connecter|na|acceder application google"> <img src="/etc.clientlibs/dcom/clientlibs/clientlib-site/resources/images/googleplay_fr.svg" alt="Disponible sur Google Play. Lien externe au site. S’ouvre dans un nouvel onglet."> </a></li></ul></div></div><div class="section"><h3>Assurances auto et habitation</h3><div class="cmp-menu-navigation__login-popover__logos"><a class="consentRedirect" href="/fr/assurances/aiguilleur-connexion.html" data-mw-action-clic="Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne."> <img width="114" height="34" alt="" src="/content/dam/images/logo/assurances/logo-assurance-f.svg"> <span class="dsd-sr-only"> Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne. </span> </a> <a href="/fr/assurances/aiguilleur-connexion.html" class="cmp-menu-navigation__login-popover__button | consentRedirect" data-mw-action-clic="Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne. </span> </a></div></div><div class="section"><h3>Courtage en ligne</h3><div class="cmp-menu-navigation__login-popover__logos"><a href="https://www.disnat.com/" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Courtage en ligne."> <img width="114" height="34" alt="" src="/content/dam/images/logo/particuliers/courtage-en-ligne-fr.svg"> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Courtage en ligne - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a> <a href="https://www.disnat.com/" class="cmp-menu-navigation__login-popover__button" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Courtage en ligne."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Courtage en ligne - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a></div></div><div class="section"><h3>Valeurs mobilières</h3><div class="cmp-menu-navigation__login-popover__logos"><a href="https://tmw.secure.vmd.ca/s9web/?firmId=S9FS&amp;lng=fr" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières."> <img width="123" height="43" alt="" src="/content/dam/images/logo/particuliers/gestion-patrimoine-fr.svg"> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a> <a href="https://tmw.secure.vmd.ca/s9web/?firmId=S9FS&amp;lng=fr" class="cmp-menu-navigation__login-popover__button" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a></div></div><div class="section"><div class="cmp-menu-navigation__login-popover__autre"><h3 id="autre-site-titre">Consulter les autres sites de Desjardins</h3><form name="LogonForm" action="#" id="logonAutreForm" method="post" target="_blank"><select id="autreSiteSelect" class="cd-n3-select" aria-labelledby="autre-site-titre"> <option selected value="" id="optionParDefaut">Choisir</option> <optgroup label="Particuliers"> <option value="https://tmw.secure.vmd.ca/s9web/?firmId=S9GPD&amp;lng=fr"> Gestion privée Desjardins </option> <option value="https://tmw.secure.vmd.ca/s9web/?firmId=S9FS&amp;lng=fr"> Service Signature </option> <option value="https://id.desjardins.com/login?state=hKFo2SBybTkzYXk0OFdYZmJKcGdCVDJ5akRIaEFVMklXUVpMcqFupWxvZ2luo3RpZNkgSGdFcHFvWkNOZzBuLVZ1TVA1VEFrM2FFTnpFcTFORXmjY2lk2SBuWUVFOWdzQURqSW1aNkRjTjJYTmIwdWoxbVlNNG95ZA&amp;client=nYEE9gsADjImZ6DcN2XNb0uj1mYM4oyd&amp;protocol=oauth2&amp;response_type=code&amp;redirect_uri=https%3A%2F%2Fwww.assurancevie.desjardins.com&amp;scope=openid%20profile%20email&amp;audience=pise-gpap&amp;nonce=c1dYSE1pQ3NqLXRDWWl6Zm5aZzVqQTRvTkhUeU1DUm5hRDNaVE4zbks1MA%3D%3D&amp;ui_locales=fr&amp;auth0Client=eyJuYW1lIjoiYXV0aDAuanMiLCJ2ZXJzaW9uIjoiOS4xMS4zIn0%3D"> Assurance individuelle </option> <option value="https://www.erc-grs.dsf-dfs.com/erc-grs/ExcludedPath/Login.aspx?Type=prtcpnt&amp;Lang=fr-ca"> Épargne-retraite collective - Participants </option> <option value="https://www.agea-gbim.dsf-dfs.com/AGEA-GBIM/Athntfctn/Authentification_Authentication.aspx?bhcp=1&amp;cltr=fr-CA"> Assurance collective - Adhérents </option> <option value="https://imp.wealthlinkinvestor.com/Trax/sso/SSOLogin.jsf"> Épargne individuelle - Fonds de placement garanti </option> <option value="https://www.securedesjardinsbank.com/dbank/live/app/login/consumer"> Desjardins Bank en ligne – États-Unis </option> </optgroup> <optgroup label="Entreprises"> <option value="https://www.agep-gbip.dsf-dfs.com/AGEP-GBIP/Athntfctn/Authentification_Authentication.aspx?cltr=fr-ca&amp;cc=0&amp;Domd=3002&amp;bhcp=1"> Assurance collective - Administrateurs </option> <option value="https://employeurd.com/WebPortal/UserLogin.aspx?LANGUAGE=fr-CA"> Employeur D paie </option> <option value="https://www.erc-grs.dsf-dfs.com/erc-grs/ExcludedPath/Login.aspx?Type=prmtr&amp;Lang=fr-ca"> Épargne-retraite collective - Promoteurs </option> <option value="https://fisglobal.desjardins.com/unity/djtext/index.html"> Fiducie - Garde de valeurs </option> <option value="https://lcexpressd2.desjardins.com/portal/PasswordLogon.jsp?organization=DJD&amp;branding=djd&amp;brandbutton=Y&amp;locale=fr_CA"> LC Express D </option> <option value="https://desjardins.wealthlinkinvestor.com/Trax/ui/login.jsf?lang=F"> Votre portefeuille en Fonds Desjardins </option> <option value="https://www.securedesjardinsbank.com/dbank/live/app/login/consumer"> Desjardins Bank en ligne – États-Unis (en anglais seulement) </option> <option value="https://desjardinsportal.profitstars.com/"> Affacturage Desjardins </option> </optgroup> </select> <a href="#" class="cmp-menu-navigation__login-popover__button" id="btn_select_logon" target="_blank"> Entrer <span class="sr-only">&amp;nbsp;dans l'application sélectionnée. Elle s'ouvrira dans une nouvelle fenêtre.</span> </a></form></div></div><div class="section"><div class="cmp-menu-navigation__login-popover__security"><dsd-security-guarantee analytics="{&quot;data-mw-action-clic&quot;:&quot;eng|accueil|menu se connecter|na|securite garantie&quot;}"></dsd-security-guarantee></div></div></div> <button id="login-popover-close-btn" class="cmp-menu-navigation__login-popover__close-button"> <span class="dsd-sr-only">Fermer</span> </button></div></li></ul></nav></div></div><script>var accesD_link=document.getElementById("menu_navigation_accesD__link");accesD_link.classList.add("current");accesD_link.setAttribute("aria-current","section");</script><div class="cmp-menu-navigation__mobile"><div class="cmp-menu-navigation__mobile__topbar"><div class="accessibility-links"><a href="#main-content" class="sr-only sr-only-focusable">Aller au contenu principal</a></div><div class="flex-container"><div class="btn-menu"><button id="btn-burger" type="button" data-toggle="burger-content" data-target="#burger-content" aria-expanded="false"> <span class="dsd-sr-only">Menu principal</span> <span class="icon-bar icon-bar-first"></span> <span class="icon-bar icon-bar-second"></span> <span class="icon-bar icon-bar-third"></span> </button></div><div class="logo__mobile"><a href="/"> <img src="/content/dam/images/logos/commun/logo-desjardins-fr.svg" height="30" alt="Retourner à la page d'accueil de Desjardins.com"> </a></div><div class="search-panel-section"><button id="btn-search-panel-mobile" class="btn btn--search" aria-expanded="false" aria-controls="search-panel" type="button"> <span class="dsd-sr-only">Rechercher</span> </button><div class="btn-login"><button id="btn-login__mobile" type="button"> <span class="dsd-sr-only">Se connecter&nbsp;aux services en ligne de Desjardins. Ouvre une boîte de dialogue</span> </button> <button id="btn-logout__mobile" type="button"> <span class="dsd-sr-only">Se déconnecter&nbsp;des services en ligne de Desjardins.</span> </button></div></div></div></div><div id="burger-content" class="cmp-menu-navigation__mobile__burger-content"><div class="cmp-menu-navigation__mobile__subbar"><div class="flex-container"><nav id="localisation__mobile" aria-label="Points de service"><ul><li><a href="/localisateur/index.jsp#/ps">Points de service</a></li></ul></nav><nav id="parameters__mobile" aria-label="Paramètres"><ul><li><button id="btn-region-options__mobile" class="btn btn--regionalisation mobile" aria-expanded="false" aria-controls="regionalisation" type="button"> <span class="dsd-sr-only"> Province ou État actuel : <span class="provinceInputs-sr-only">Québec</span> . Langue : <span class="languageInputs">Français</span> . </span> <span class="btn__text" aria-hidden="true"> <span class="provinceInputs">QC</span> | <span class="languageInputs">Français</span> </span> </button></li></ul></nav></div></div><section id="regionalisation__mobile" style="display: none;" class="cmp-menu-navigation__regionalisation"><form class="form"><div class="form__choose-lang"><fieldset><legend>Choisir votre langue</legend> <label for="rd-lang-fr__mobile" class="radio__label"> <input type="radio" id="rd-lang-fr__mobile" name="lang" value="fr" checked class="radio__input"> <span class="radio__indicator"></span> <span lang="fr">Français</span> </label> <label for="rd-lang-en__mobile" class="radio__label"> <input type="radio" id="rd-lang-en__mobile" name="lang" value="en" class="radio__input"> <span class="radio__indicator"></span> <span lang="en">English</span> </label></fieldset></div><div class="form__choose-province"><label for="slt-province__mobile">Choisir votre province ou État</label> <select id="slt-province__mobile" name="province" class="select"> <option disabled>Choisir</option> <optgroup label="Canada"> <option value="AB">Alberta</option> <option value="BC">Colombie-Britannique</option> <option value="PE">Île-du-Prince-Édouard</option> <option value="MB">Manitoba</option> <option value="NB">Nouveau-Brunswick</option> <option value="NS">Nouvelle-Écosse</option> <option value="NU">Nunavut</option> <option value="ON">Ontario</option> <option value="QC">Québec</option> <option value="SK">Saskatchewan</option> <option value="NL">Terre-Neuve-et-Labrador</option> <option value="NT">Territoires du Nord-Ouest</option> <option value="YT">Yukon</option> </optgroup> <optgroup label="États-Unis"> <option value="USA">Floride</option> </optgroup> </select></div><div class="form__submit"><dsd-button id="btn-regions-options-confirm__mobile" variant="primary" theme="brand">Confirmer </dsd-button></div></form> <button id="btn-close-regions-options__mobile" class="btn btn-close mobile" type="button"> <span class="dsd-sr-only">Fermer</span><dsd-icon size="sm" icon-name="navigations_contour_fermer"></dsd-icon> </button><div class="tabbable_end_warning" tabindex="0" data-previous-focusable-element-id="btn-close-regions-options__mobile" data-quit-focus-element-id="btn-region-options__mobile">Vous quittez la boîte de dialogue.</div></section><nav id="main-menu__mobile" aria-label="Menu principal"><ul><li id="btn-AccesD__mobile"><a href="https://accweb.mouv.desjardins.com/identifiantunique/sso/adp"> AccèsD </a></li><li id="btn-AccesD-affaire__mobile"><a href="https://accesdc.mouv.desjardins.com/accueil"> AccèsD Affaires </a></li><li><a href="#" id="menu_navigation_accesD_link_mobile" class="menu-parent-chevron" role="button" aria-expanded="false"> Particuliers </a><ul><li><a class=" " href="/fr/comptes-services.html">Comptes et services</a></li><li><a class=" " href="/fr/cartes-credit.html">Cartes de crédit</a></li><li><a class=" " href="/fr/hypotheque.html">Hypothèque</a></li><li><a class=" " href="/fr/prets-marges-credit.html">Prêts et marges de crédit</a></li><li><a class=" " href="/fr/epargne-placements.html">Épargne et placements</a></li><li><a class=" " href="/fr/assurances.html">Assurances<span class="dsd-sr-only">&nbsp;Particuliers</span></a></li><li><a class=" " href="/fr/gestion-patrimoine.html">Gestion de patrimoine</a></li><li><a class=" " href="/fr/offres.html">Offres</a></li><li><a class=" " href="/fr/epargne-placements/epargne-retraite-collective-participants.html">Épargne-retraite collective</a></li><li><span class="dsd-sr-only">Menu </span> <a class="menu-child-chevron " href="/particuliers/index.jsp">Voir tout<span class="dsd-sr-only">&nbsp;les éléments du menu Particuliers</span></a></li></ul></li><li><a href="#" id="menu_navigation_accesD_affaire_link_mobile" class="menu-parent-chevron" role="button" aria-expanded="false"> Entreprises </a><ul><li><a class=" " href="/fr/entreprises/comptes-tresorerie.html">Comptes et gestion de trésorerie </a></li><li><a class=" " href="/fr/entreprises/financement-prets.html">Financement et prêts</a></li><li><a class=" " href="/fr/entreprises/cartes-credit.html">Cartes de crédit</a></li><li><a class=" " href="/fr/entreprises/projets.html">Projets d’entreprise<br> </a></li><li><a class=" " href="/fr/entreprises/offres.html">Offres par secteur</a></li><li><a class=" " href="/fr/entreprises/solutions-outils/partenaires.html">Partenaires d’affaires et solutions entreprises</a></li><li><a class=" " href="/entreprises/solutions-employeurs/index.jsp">Solutions pour les employeurs</a></li><li><a class=" " href="/fr/entreprises/assurances.html">Assurances <span class="dsd-sr-only">Entreprises</span></a></li><li><a class=" " href="/fr/entreprises/international.html">Services internationaux</a></li><li><a class=" " href="/entreprises/investissement-placements/index.jsp">Investissement et placements</a></li><li><a class=" " href="/fr/entreprises/marche-capitaux.html">Marché des capitaux</a></li><li><a class=" " href="https://www.fiduciedesjardins.com/" target="_blank" rel="noopener noreferrer">Services fiduciaires<span class="dsd-sr-only">. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg class="externallink" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 3a1 1 0 110 2H2v17h17V12a1 1 0 012 0v11a1 1 0 01-1 1H1a1 1 0 01-1-1V4a1 1 0 011-1zm11-3a1 1 0 011 1v6a1 1 0 01-2 0V3.41L9.71 15.71a1 1 0 01-1.42 0 1 1 0 010-1.42L20.59 2H17a1 1 0 110-2z" fill-rule="evenodd" /></svg> </a></li><li><a class=" " href="/fr/entreprises/solutions-outils/epargne-retraite-collective.html">Épargne-retraite collective</a></li><li><span class="dsd-sr-only">Menu </span> <a class="menu-child-chevron " href="/fr/entreprises.html">Voir tout<span class="dsd-sr-only">&nbsp;les éléments du menu Entreprises</span></a></li></ul></li></ul></nav><nav id="secondary-menu__mobile" aria-label="Menu secondaire"><ul><li><a href="/a-propos/index.jsp">À propos</a><a href="/fr/carriere.html">Carrière</a><a href="/fr/conseils.html">Conseils</a><a href="/nous-joindre/index.jsp?idSectionRacine=0&amp;niveauSectionRacine=1&amp;idSectionFocus=0&amp;niveauSectionFocus=2">Nous joindre</a></li></ul></nav><div class="tabbable_end_warning" tabindex="0" data-previous-focusable-element-id="btn-search__mobile" data-quit-focus-element-id="btn-burger">Vous quittez le menu.</div></div></div><script>var accesD_link=document.getElementById("menu_navigation_accesD_link_mobile");accesD_link.classList.add("current");accesD_link.setAttribute("aria-current","section");</script><div class="side-panel" id="search-panel-top"><div class="side-panel__backdrop" data-panel-action="close"></div><div id="header-v1-top-panel" class="side-panel__panel side-panel__panel--align-top" aria-modal="true" role="dialog" data-active="false" aria-label="aucune" tabindex="-1"><div class="side-panel__body side-panel__body--fixed-content" hidden><div class="cmp-search-panel-section" data-suggest-endpoint="https://www.desjardins.com/fondation-recherche/sn-cacn-prod-ext-desjardins/ent/api/as/v1/engines/search-dcom-fra-crawler-engine/query_suggestion/" data-search-endpoint="https://www.desjardins.com/fondation-recherche/sn-cacn-prod-ext-desjardins/ent/api/as/v1/engines/search-dcom-fra-crawler-engine/search/" data-click-endpoint="https://www.desjardins.com/fondation-recherche/sn-cacn-prod-ext-desjardins/ent/api/as/v1/engines/search-dcom-fra-crawler-engine/click/"><div class="cmp-search-panel-items"><form class="cmp-search-field-form" action="/qc/fr/resultats.html" role="search" method="GET" id="searchPanelForm"><button class="boa-button boa-button--ghost boa-button--large boa-button--icon-only boa-button--neutral" id="cmp-search-field-btn-back" type="button" aria-label="Fermer la barre de recherche"> <span class="boa-button__icon"><svg width="25" height="25" viewbox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="fleche-gauche"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.07183 11.7896L10.0699 5.79388C10.4619 5.40204 11.0974 5.40204 11.4894 5.79388C11.8814 6.18573 11.8814 6.82104 11.4894 7.21288L7.19082 11.4999H20.7764C21.3286 11.4999 21.7761 11.9473 21.7761 12.4991C21.7761 13.051 21.3286 13.4984 20.7764 13.4984H7.19082L11.4894 17.7854C11.6787 17.973 11.7851 18.2285 11.7851 18.4949C11.7851 18.7614 11.6787 19.0168 11.4894 19.2044C11.3017 19.3936 11.0462 19.5 10.7797 19.5C10.5131 19.5 10.2576 19.3936 10.0699 19.2044L4.07183 13.2086C3.88257 13.021 3.77612 12.7656 3.77612 12.4991C3.77612 12.2327 3.88257 11.9773 4.07183 11.7896Z" fill="#00874E" /> </g></svg> </span> </button> <input type="text" placeholder="Rechercher" id="cmp-search-field-input-field" name="mw_re" role="combobox" aria-label="Barre de recherche" maxlength="50" autocomplete="off" aria-controls="autoCompleteDefaultResult autoCompleteSearchResult" aria-autocomplete="list" aria-expanded="true"> <button class="boa-button boa-button--ghost boa-button--xsmall boa-button--icon-only boa-button--neutral" id="cmp-search-field-btn-close" hidden type="button" aria-label="Effacer la recherche"> <span class="boa-button__icon"><svg width="16" height="17" viewbox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="fermer"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.93939 8.49944L13.8029 3.64211C14.0642 3.38084 14.0642 2.95724 13.8029 2.69597C13.5417 2.4347 13.1181 2.4347 12.8569 2.69597L8 7.55996L3.14313 2.69597C2.97413 2.52696 2.72781 2.46095 2.49696 2.52281C2.26611 2.58467 2.08579 2.76501 2.02393 2.99588C1.96207 3.22676 2.02808 3.4731 2.19707 3.64211L7.06061 8.49944L2.19707 13.3568C2.07094 13.4819 2 13.6522 2 13.8298C2 14.0075 2.07094 14.1778 2.19707 14.3029C2.32217 14.429 2.49246 14.5 2.6701 14.5C2.84774 14.5 3.01803 14.429 3.14313 14.3029L8 9.43892L12.8569 14.3029C12.982 14.429 13.1523 14.5 13.3299 14.5C13.5075 14.5 13.6778 14.429 13.8029 14.3029C13.9291 14.1778 14 14.0075 14 13.8298C14 13.6522 13.9291 13.4819 13.8029 13.3568L8.93939 8.49944Z" fill="#383838" /> </g></svg> </span> </button> <span id="separatorField" hidden></span> <button class="boa-button boa-button--ghost boa-button--large boa-button--icon-only boa-button--brand" id="cmp-search-field-btn-search" type="submit" aria-label="Lancer la recherche"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> </button></form></div> <button class="boa-button boa-button--ghost boa-button--large side-panel__close-button cmp-search-panel-close-button" aria-label="Fermer la barre de recherche" id="cmp-search-panel-close-button"> <span class="boa-button__text">Fermer</span> </button></div> <span class="cmp-search-panel-items-popular-label" id="popularSearchLabel">Recherches Populaires </span> <span class="cmp-search-panel-items-popular-label" id="popularSearchSuggestedLabel" hidden>RÉSULTATS SUGGÉRÉS</span><div class="side-panel__main"><div class="side-panel__scroll-wrapper side-panel__scroll-wrapper--short"><span class="side-panel__main-scroll-trigger"></span><div class="cmp-search-panel-items-popular-result"><div id="autoCompleteDefaultResult" role="listbox" aria-labelledby="popularSearchLabel"><a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche AccèsD" value="AccèsD" href="/qc/fr/resultats.html?mw_re=AccèsD" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">AccèsD</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Taux de change" value="Taux de change" href="/qc/fr/resultats.html?mw_re=Taux%20de%20change" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Taux de change</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche CELI" value="CELI" href="/qc/fr/resultats.html?mw_re=CELI" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">CELI</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Budget" value="Budget" href="/qc/fr/resultats.html?mw_re=Budget" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Budget</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Spécimen de chèque" value="Spécimen de chèque" href="/qc/fr/resultats.html?mw_re=Spécimen%20de%20chèque" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Spécimen de chèque</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Convertisseur de devises" value="Convertisseur de devises" href="/qc/fr/resultats.html?mw_re=Convertisseur%20de%20devises" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Convertisseur de devises</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche BONIDOLLARS" value="BONIDOLLARS" href="/qc/fr/resultats.html?mw_re=BONIDOLLARS" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">BONIDOLLARS</span> </a></div><div id="autoCompleteSearchResult" role="listbox" hidden="true" aria-labelledby="popularSearchSuggestedLabel"><a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral autoCompleteResultClass" href="/qc/fr/resultats.html?mw_re=" aria-label="Lancer la recherche" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730_1)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730_1"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> </a></div></div></div></div></div></div></div> <dsd-modal button-primary-label="Fermer" id="timeout-modal"><h2 slot="title">Session expirée</h2><dsd-alert variant="information"><h3 slot="title">Information</h3> Le délai d'inactivité de votre session est expiré. Pour votre sécurité, nous avons fermé votre session. </dsd-alert> </dsd-modal> <span id="usaRedirectUrlFr" data-lang-redirect-url=" https://www.desjardinsbank.com/"></span> <span id="usaRedirectUrlEn" data-lang-redirect-url="https://www.desjardinsbank.com/en/"></span></div></div><div class="regional-preferences-modal-dsd msm-languagenavigation languagenavigation"><dsd-modal id="regionalisation-modal" dark="false" variant="standard" show="false" class="cmp-regional-preferences-modal-dsd" button-primary-label="Confirmer" data-currentlanguage="fr" data-currentprovincecode="QC" data-provinces="{&quot;AB&quot;:{&quot;code&quot;:&quot;AB&quot;,&quot;name&quot;:&quot;Alberta&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/ab/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/ab/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;BC&quot;:{&quot;code&quot;:&quot;BC&quot;,&quot;name&quot;:&quot;British Columbia&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/bc/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/bc/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;MB&quot;:{&quot;code&quot;:&quot;MB&quot;,&quot;name&quot;:&quot;Manitoba&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/mb/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/mb/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NB&quot;:{&quot;code&quot;:&quot;NB&quot;,&quot;name&quot;:&quot;New Brunswick&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nb/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nb/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NL&quot;:{&quot;code&quot;:&quot;NL&quot;,&quot;name&quot;:&quot;Newfoundland and Labrador&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nl/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nl/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NS&quot;:{&quot;code&quot;:&quot;NS&quot;,&quot;name&quot;:&quot;Nova Scotia&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/ns/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/ns/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NT&quot;:{&quot;code&quot;:&quot;NT&quot;,&quot;name&quot;:&quot;Northwest Territories&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nt/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nt/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;NU&quot;:{&quot;code&quot;:&quot;NU&quot;,&quot;name&quot;:&quot;Nunavut&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/nu/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/nu/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;ON&quot;:{&quot;code&quot;:&quot;ON&quot;,&quot;name&quot;:&quot;Ontario&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/on/en/mortgage/mortgage-rates.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/on/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;PE&quot;:{&quot;code&quot;:&quot;PE&quot;,&quot;name&quot;:&quot;Prince Edward Island&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/pe/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/pe/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;QC&quot;:{&quot;code&quot;:&quot;QC&quot;,&quot;name&quot;:&quot;Quebec&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/qc/en/mortgage/mortgage-rates.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/qc/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;SK&quot;:{&quot;code&quot;:&quot;SK&quot;,&quot;name&quot;:&quot;Saskatchewan&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/sk/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/sk/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;YT&quot;:{&quot;code&quot;:&quot;YT&quot;,&quot;name&quot;:&quot;Yukon&quot;,&quot;links&quot;:{&quot;en&quot;:&quot;https://www.desjardins.com/yt/en/hypotheque/taux-hypothecaires.html&quot;,&quot;fr&quot;:&quot;https://www.desjardins.com/yt/fr/hypotheque/taux-hypothecaires.html&quot;}},&quot;OC&quot;:{&quot;code&quot;:&quot;OC&quot;,&quot;name&quot;:&quot;Ontario&quot;,&quot;links&quot;:{}}}"><h2 slot="title">Choisir vos paramètres</h2><span id="usaRedirectUrlFr" data-lang-redirect-url="https://www.desjardinsbank.com/"></span><span id="usaRedirectUrlEn" data-lang-redirect-url="https://www.desjardinsbank.com/en/"></span><form class="form"><div class="form__choose-lang"><fieldset><legend>Choisir votre langue</legend> <label for="rd-lang-fr_modal" class="radio__label"> <input type="radio" id="rd-lang-fr_modal" name="lang_modal" value="fr" checked class="radio__input"> <span class="radio__indicator"></span> <span lang="fr">Français</span> </label> <label for="rd-lang-en_modal" class="radio__label"> <input type="radio" id="rd-lang-en_modal" name="lang_modal" value="en" class="radio__input"> <span class="radio__indicator"></span> <span lang="en">English</span> </label></fieldset></div><div class="form__choose-province"><label for="slt-province_modal">Choisir votre province ou État</label> <select id="slt-province_modal" name="province_modal" class="select"> <option disabled>Choisir</option> <optgroup label="Canada"> <option value="AB">Alberta</option> <option value="BC">Colombie-Britannique</option> <option value="PE">Île-du-Prince-Édouard</option> <option value="MB">Manitoba</option> <option value="NB">Nouveau-Brunswick</option> <option value="NS">Nouvelle-Écosse</option> <option value="NU">Nunavut</option> <option value="ON">Ontario</option> <option value="QC">Québec</option> <option value="SK">Saskatchewan</option> <option value="NL">Terre-Neuve-et-Labrador</option> <option value="NT">Territoires du Nord-Ouest</option> <option value="YT">Yukon</option> </optgroup> <optgroup label="États-Unis"> <option value="USA">Floride</option> </optgroup> </select></div></form> </dsd-modal></div><div class="search-field"></div></div></div></header><main class="container responsivegrid"><div id="container-ef17851bea" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="breadcrumb dsd-w-full aem-GridColumn aem-GridColumn--default--12"><nav id="breadcrumb-d2c616c1dc" class="cmp-breadcrumb" aria-label="Chemin de navigation"><ol class="cmp-breadcrumb__list"><li class="cmp-breadcrumb__item"><a href="/?navigMW=ari" class="cmp-breadcrumb__item-link"> Accueil </a></li><li class="cmp-breadcrumb__item"><a href="/fr/hypotheque.html?navigMW=ari" class="cmp-breadcrumb__item-link"> Hypothèque </a></li><li class="cmp-breadcrumb__item cmp-breadcrumb__item--active">Taux hypothécaires</li></ol></nav></div><div class="container responsivegrid aem-GridColumn aem-GridColumn--default--12"><div id="container-ffe6531764" class="cmp-container simple" style=""><div class="vitrine responsivegrid"><div id="at-0043-vitrine" class="cmp-vitrine"><div class="cmp-vitrine cmp-vitrine__container largeImage " style="--vitrine-bg-color:#CCE7D7;"><div class="dsd-w-full flex-container cmp-vitrine__layer"><div class="cmp-vitrine__cartouche"><div><h1 class="cmp-vitrine__pagetitle" style="--pagetitle-text-color:#2f2f2f;">Taux hypo­thécaires</h1><div class="dsd-mt-lg"><p><span class="dsd-b1"><span class="dsd-b-10">Obtenez un prêt et un taux hypothécaires qui conviennent à vos besoins. Si vous êtes membre, demandez une préautorisation hypothécaire dans nos services mobiles et en ligne pour savoir quel prix vous pourriez payer pour une propriété et réserver votre taux.</span></span></p></div><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="action-link dsd-mt-lg aem-GridColumn aem-GridColumn--default--12"><div class="cmp-action-link"><a href="https://accesdc.mouv.desjardins.com/services/navigation/aiguillage/mon-toit" class="link-principal link-principal-green " data-mw-action-clic="iaw|hypo|taux-hypothecaires|haut|demander une preautorisation"> <span class="mask-button-states"> <span class="cmp-action-link__label">Demander une préautorisation<span class="dsd-sr-only">&nbsp;hypothécaire dans nos services mobiles et en ligne</span> </span> </span> </a></div></div><div class="text custom-mt-32 aem-GridColumn aem-GridColumn--default--12"><div id="text-04035b8e47" class="cmp-text"><p><span class="dsd-b-10">Vous n'êtes pas membre? <a href="https://rappel.desjardins.com/#/dcom-pleine-page?struct=%5B%22VPA%22,%22DPCCCSC%22,%22Financement%22%5D&amp;dest=FIN_Hypotheque_Clic&amp;da=P&amp;source=https:%2F%2Fwww.desjardins.com%2Fcontent%2Fdcom%2Ffr%2Fhypotheque%2Ftaux-hypothecaires.html" data-mw-action-clic="iat|hypo|taux-hypothecaires|haut|planifier un appel">Planifiez un appel</a> pour prendre rendez-vous pour votre demande de préautorisation.</span></p></div></div><div class="text dsd-mt-lg aem-GridColumn aem-GridColumn--default--12"><div id="text-cdf17a7d3e" class="cmp-text"><p>Taux en vigueur le&nbsp;${currentDate}</p></div></div></div></div></div></div><div class="cmp-vitrine__image-container"><div class="cmp-vitrine__image"><img src="/content/dam/images/vitrines/particuliers/hypotheque/vitrine-taux.jpg" alt fetchpriority="high" style="--vitrine-translate: 0%; --vitrine-translate-mob: 0%"></div></div></div></div></div><div class="container responsivegrid"><div id="container-1035e488e1" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-dsd-pt-32 aem-GridColumn aem-GridColumn--default--12"><div id="container-0493badef0" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-48eee725a2" tabindex="-1"><h2 class="cmp-title__text ">Trouvez un prêt et un taux hypo­thécaires adaptés à votre réalité</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-b99bb8b429" class="cmp-text"><p>Le taux hypothécaire<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/002-note-generale-taux-hypotheque"><dsd-footnote-ref target="002-note-generale-taux-hypotheque" id="002-note-generale-taux-hypotheque-1">1</dsd-footnote-ref></span> joue souvent un rôle majeur dans le choix d'un prêt. Pour prendre une décision éclairée, il y a toutefois d'autres facteurs à considérer. Votre tolérance au risque, vos connaissances financières et vos projets à court et à long terme en sont quelques-uns.</p><p>Découvrez les taux en vigueur et leurs principales caractéristiques ou apprenez-en plus sur les <a href="/fr/hypotheque/prets-hypothecaires.html">notions de base des prêts hypothécaires</a>&nbsp;pour préparer le financement de votre propriété. Un conseiller ou une conseillère hypothécaire peut aussi vous accompagner dans votre choix.</p></div></div></div></div></div></div></div></div><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-lg cmp-container--main-dsd-pb-40"><div id="container-7370da3715" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="experiencefragment dsd-pl-0 dsd-pr-0 aem-GridColumn aem-GridColumn--default--12"><div id="experiencefragment-231c5a27e8" class="cmp-experiencefragment cmp-experiencefragment--taux-hypothecaires-promotionnels"><div id="container-3c95d50aa6" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-59de7ce039" tabindex="-1"><h2 class="cmp-title__text ">Taux hypo­thécaires promo­tionnels</h2></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-va-stretch aem-GridColumn aem-GridColumn--default--12"><div id="container-a15c5f3a5a" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--small--12 aem-Grid--default--12 aem-Grid--xsmall--12 aem-Grid--medium--12 "><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--4"><div id="container-a7a8afb1b6" class="cmp-container cmp-container-improved" style="background-color:#D6EFF2;"><div class="aem-Grid aem-Grid--4 aem-Grid--small--6 aem-Grid--default--4 aem-Grid--xsmall--12 aem-Grid--medium--4 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--column-reverse aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="container-afe57008e6" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--default--4 "><div class="title aem-GridColumn aem-GridColumn--default--4"><div class="cmp-title" id="title-f072ef35c2" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Prêt fermé à taux fixe sur <span class="dsd-ws-nowrap">4&nbsp;ans<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-1">2</dsd-footnote-ref></span></span></h3></div></div><div class="text dsd-mt-sm aem-GridColumn aem-GridColumn--default--4"><div id="text-4ef92e754b" class="cmp-text"><p><span class="boa-p-display"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A.rate | taux | 2">4,39&nbsp;%</span></strong></span><span class="dsd-b-10"> <span class="dsd-sr-only">&nbsp;au lieu de</span>&nbsp;<span class="dsd-td-line-through"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A.rate | taux | 2">6,04&nbsp;%</span></span> <span class="dsd-sr-only">&nbsp;avant la promotion</span></span></p></div></div></div></div></div><div class="text dsd-mt-sm aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="text-97e5767694" class="cmp-text"><p>Ce taux reste le même pendant 4&nbsp;ans.</p></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--4"><div id="container-57fac91a1a" class="cmp-container cmp-container-improved" style="background-color:#D6EFF2;"><div class="aem-Grid aem-Grid--4 aem-Grid--small--6 aem-Grid--default--4 aem-Grid--xsmall--12 aem-Grid--medium--4 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--column-reverse aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="container-7f1d40f04b" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--default--4 "><div class="title aem-GridColumn aem-GridColumn--default--4"><div class="cmp-title" id="title-54ea562131" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Prêt fermé à taux fixe sur <span class="dsd-ws-nowrap">5&nbsp;ans<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-2">2</dsd-footnote-ref></span></span></h3></div></div><div class="text dsd-mt-sm aem-GridColumn aem-GridColumn--default--4"><div id="text-e498d6106f" class="cmp-text"><p><span class="boa-p-display"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A.rate | taux | 2">4,49&nbsp;%</span></strong></span><span class="dsd-b-10"> <span class="dsd-sr-only">&nbsp;au lieu de</span>&nbsp;<span class="dsd-td-line-through"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A.rate | taux | 2">6,09&nbsp;%</span></span> <span class="dsd-sr-only">&nbsp;avant la promotion</span></span></p></div></div></div></div></div><div class="text dsd-mt-sm aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="text-f44338255b" class="cmp-text"><p>Ce taux reste le même pendant 5&nbsp;ans.</p></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--4"><div id="container-4af8662a7c" class="cmp-container cmp-container-improved" style="background-color:#D6EFF2;"><div class="aem-Grid aem-Grid--4 aem-Grid--small--6 aem-Grid--default--4 aem-Grid--xsmall--12 aem-Grid--medium--4 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--column-reverse aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="container-da97fef83d" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--default--4 "><div class="title aem-GridColumn aem-GridColumn--default--4"><div class="cmp-title" id="title-93bfd3ecc9" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Prêt fermé à taux variable réduit sur <span class="dsd-ws-nowrap">5&nbsp;ans<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-3">2</dsd-footnote-ref></span></span></h3></div></div><div class="text dsd-mt-sm aem-GridColumn aem-GridColumn--default--4"><div id="text-30bb9aa3d0" class="cmp-text"><p><span class="boa-p-display"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR.rate | taux | 2">4,10&nbsp;%</span></strong></span><span class="dsd-b-10"> <span class="dsd-sr-only">&nbsp;au lieu de</span>&nbsp;<span class="dsd-td-line-through"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred.rate | taux | 2">4,45&nbsp;%</span></span>&nbsp;<span class="dsd-sr-only">&nbsp;avant la promotion</span></span></p></div></div></div></div></div><div class="text dsd-mt-sm aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="text-f5354d7805" class="cmp-text"><p>Ce taux varie selon notre taux préférentiel<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/018-taux-preferentiel"><dsd-footnote-ref target="018-taux-preferentiel" id="018-taux-preferentiel-1">3</dsd-footnote-ref></span>, mais toujours avec un écart garanti pendant 5&nbsp;ans.</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-e63b7f8996" class="cmp-container cmp-container-improved" style="background-color:#F4F4F4;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-40 aem-GridColumn aem-GridColumn--default--12"><div id="container-b8624b9ba7" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-b5b362543f" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-61009c0d22" class="cmp-container cmp-container-improved" style="" data-mw-element-visible="imp|hypo|taux-hypothecaires|na|Taux fixe"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-c16d532b51" tabindex="-1"><h2 class="cmp-title__text ">Prêts à taux fixe</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-bdff95da18" class="cmp-text"><p>Le <strong>taux fixe</strong> reste stable jusqu'à la fin du terme et vous protège contre les variations de notre taux préférentiel. Cette option peut être avantageuse si vous avez une <strong>faible tolérance au risque </strong>et que vous recherchez une grande stabilité.</p></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-46016a3692" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-baa7999d36" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux fixe</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-d94ea548fa" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-b0022c0232" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>6&nbsp;mois</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6M.rate | taux | 2">7,99&nbsp;%</span></td></tr><tr><td>1&nbsp;an</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1A.rate | taux | 2">5,49&nbsp;%</span></td></tr><tr><td>2&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_2A.rate | taux | 2">5,59&nbsp;%</span></td></tr><tr><td>3&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_3A.rate | taux | 2">5,99&nbsp;%</span></td></tr><tr><td>4&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A.rate | taux | 2">6,04&nbsp;%</span></td></tr><tr><td>4&nbsp;ans en promotion</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A.rate | taux | 2">4,39&nbsp;%</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-4">2</dsd-footnote-ref></span></td></tr><tr><td>5&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A.rate | taux | 2">6,09&nbsp;%</span></td></tr><tr><td>5&nbsp;ans en promotion</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A.rate | taux | 2">4,49&nbsp;%</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-5">2</dsd-footnote-ref></span></td></tr><tr><td>6&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6A.rate | taux | 2">6,29&nbsp;%</span></td></tr><tr><td>7&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_7A.rate | taux | 2">6,39&nbsp;%</span></td></tr><tr><td>10&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_10A.rate | taux | 2">6,89&nbsp;%</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-fixe" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux fixe</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux fixe</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux fixe"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-3f2614c719" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-97c9533360" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9b4a249243" class="cmp-text"><p>Aucune variation de taux durant le terme</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-87f8ef1db7" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypo­thécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-fa068d5f43" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-1">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ae8e0aecc1" tabindex="-1"><h4 class="cmp-title__text ">Rembour­sement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-13a5d2a93f" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à&nbsp;15&nbsp;% du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-5898c9e2f1" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-fcda030cc8" class="cmp-text"><ul><li>Vous avez une faible tolérance au risque et aux variations de taux.</li><li>Vous voulez éviter les surprises dans votre budget.</li><li>Vous souhaitez profiter de la régularité des paiements pour réaliser d'autres projets sans risquer de les compromettre.</li><li>Vous pensez conserver votre propriété au moins la durée du terme choisi.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-79f3784e4e" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-dc2acebcd9" tabindex="-1"><h3 class="cmp-title__text ">Prêt ouvert à taux fixe</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-477a43542a" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-009ea80183" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>6&nbsp;mois</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6MO.rate | taux | 2">9,75&nbsp;%</span></td></tr><tr><td>1&nbsp;an</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1AO.rate | taux | 2">9,50&nbsp;%</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ouvert-taux-fixe" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only">&nbsp;du prêt ouvert à taux fixe</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only">&nbsp;du prêt ouvert à taux fixe</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt ouvert à taux fixe"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-c5d420e9e9" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-729af6f9fc" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-46c894c7fd" class="cmp-text"><p>Aucune variation de taux durant le terme</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-2d259c44e0" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypo­thécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-56b7c2ab12" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-2">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-c058761c57" tabindex="-1"><h4 class="cmp-title__text ">Rembour­sement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-90f03d2454" class="cmp-text"><p>Vous pouvez rembourser votre prêt au complet ou en partie sans frais d'indemnité et en tout temps. Il arrive cependant que des frais d'indemnité soient exigés si vous profitez de certaines offres et que vous remboursez votre prêt plus vite que prévu.</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ad9eaf7398" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-0c38efec6c" class="cmp-text"><ul><li>Vous avez une faible tolérance au risque et aux variations de taux.</li><li>Vous voulez éviter les surprises dans votre budget.</li><li>Vous allez recevoir un montant d'argent et vous voulez vous en servir pour rembourser votre prêt sans payer de frais d'indemnité.</li><li>Vous planifiez vendre votre propriété ou rembourser la totalité de votre prêt à court terme.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="separator custom-mt-32 custom-mb-32 aem-GridColumn aem-GridColumn--default--12"><div id="separator-c58da3cdb2" class="cmp-separator"><hr class="cmp-separator__horizontal-rule"></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-974cbd152a" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-1c4714ac3a" tabindex="-1"><h2 class="cmp-title__text ">Prêts à taux variable</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-a730af3143" class="cmp-text"><p>Le <strong>taux variable </strong>augmente ou diminue selon les fluctuations de notre taux préférentiel. Cette option peut être intéressante si vous avez une <strong>bonne tolérance au risque</strong> et que vous voulez profiter des possibles baisses de taux pour économiser sur les intérêts.</p></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-25f303cacc" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-4f4c16e85d" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux variable réduit</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-dda951b0e1" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-9732434a16" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>5&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred.rate | taux | 2">4,45&nbsp;%</span></td></tr><tr><td>5&nbsp;ans en promotion</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR.rate | taux | 2">4,10&nbsp;%</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-6">2</dsd-footnote-ref></span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-variable-reduit" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux variable réduit</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux variable réduit</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux variable réduit"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-5ee2f2a4e7" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-675b97829c" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-6ac74e637c" class="cmp-text"><p>Votre taux est basé sur notre taux préférentiel plus ou moins un écart garanti tout au long du terme. Votre taux peut donc augmenter ou diminuer à chaque variation de notre taux préférentiel.</p><p>Vous pouvez convertir votre taux variable réduit en taux fixe à tout moment, sans frais d'indemnité et à certaines conditions.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-5f4567bd33" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-5da0de9ed3" class="cmp-text"><p>Écart garanti&nbsp;: -0,70&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-174872eba5" tabindex="-1"><h6 class="cmp-title__text ">Variation 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-b7d429dbe2" class="cmp-text"><p>Taux préférentiel&nbsp;: 6,75&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,05&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-61ef36122b" tabindex="-1"><h6 class="cmp-title__text ">Variation 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-c87603acd3" class="cmp-text"><p>Taux préférentiel&nbsp;: 6,95&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,25&nbsp;%</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ebca627cbb" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypo­thécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-faaf99753b" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-3">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-bc9a5b8d96" tabindex="-1"><h4 class="cmp-title__text ">Rembour­sement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-200b6752ce" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à&nbsp;15&nbsp;% du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ae6769b977" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-199a9691a9" class="cmp-text"><ul><li>Vous pouvez tolérer d'importantes variations de taux et votre budget est flexible.</li><li>Vous avez un niveau élevé de connaissances financières.</li><li>Vous souhaitez payer le moins d'intérêts possible et optimiser le rembour­sement de votre prêt lorsque les taux baissent.<br></li><li>Vous pensez conserver votre propriété au moins 5&nbsp;ans.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-41347d2608" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-16c6c72d63" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux variable protégé</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-62d547bd3c" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-260070e94c" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>5&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvp.rate | taux | 2">4,70&nbsp;%</span></td></tr></tbody></table></div> </dsd-table></div><div class="text custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div id="text-02bdf6d286" class="cmp-text"><p>Taux maximum&nbsp;:&nbsp;<span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tptvp.rate | taux | 2">7,54&nbsp;%</span></p></div></div><div class="extensible-panel responsivegrid negative-margins-cancelling aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-variable-protege" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux variable protégé</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux variable protégé</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux variable protégé"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-282f4fcfcb" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-4d7428cc5c" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-0621d6702a" class="cmp-text"><p>Votre taux est basé sur notre taux préférentiel plus ou moins un écart garanti tout au long du terme. Il est protégé par un taux maximum fixé quand vous signez votre prêt. Votre taux peut donc augmenter ou diminuer à chaque variation de notre taux préférentiel, mais il ne dépassera jamais le taux maximum.</p><p>Vous pouvez convertir votre taux variable protégé en taux fixe à tout moment, sans frais d'indemnité et à certaines conditions.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-b4953cda99" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-f570e14a1f" class="cmp-text"><p>Écart garanti&nbsp;: -0,60&nbsp;%<br> Taux maximum&nbsp;: 6,29&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-1a937ab28c" tabindex="-1"><h6 class="cmp-title__text ">Variation 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-91493c282c" class="cmp-text"><p>Taux préférentiel&nbsp;: 5,45&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 4,85&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-eea224f5f0" tabindex="-1"><h6 class="cmp-title__text ">Variation 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-7929d4b6db" class="cmp-text"><p>Taux préférentiel&nbsp;: 6,45&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 5,85&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-42c932a089" tabindex="-1"><h6 class="cmp-title__text ">Variation 3</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-31b6224746" class="cmp-text"><p>Taux préférentiel&nbsp;: 7,45&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,29&nbsp;% au lieu de 6,85&nbsp;% puisque votre taux est protégé par le taux maximum</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-cd87b9871a" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypo­thécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9b54e18e71" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-4">4</dsd-footnote-ref></span></p><p>Le montant des paiements est calculé selon le taux maximum. Si votre taux personnalisé est inférieur au taux maximum, la différence paye votre capital. Plus la différence est élevée, plus vous remboursez votre capital rapidement.</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-cdc3ac36be" tabindex="-1"><h4 class="cmp-title__text ">Rembour­sement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-d511041817" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à&nbsp;15&nbsp;% du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-dde572ad32" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9d31f6431e" class="cmp-text"><ul><li>Vous avez une certaine tolérance au risque, mais vous voulez garder le contrôle de votre budget.</li><li>Vous connaissez le taux maximum et le montant de vos paiements dès la signature de votre prêt.</li><li>Vous voulez profiter des baisses de taux pour payer votre capital plus vite tout en vous protégeant lors de hausses importantes.<br></li><li>Vous pensez conserver votre propriété au moins 5&nbsp;ans.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-8906c15709" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-845ede4db4" tabindex="-1"><h3 class="cmp-title__text ">Prêt ouvert à taux variable régulier</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-75ed738bf6" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-6d8b03ab00" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>1&nbsp;an</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg.rate | taux | 2">5,70&nbsp;%</span></td></tr><tr><td>2&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg2.rate | taux | 2">5,70&nbsp;%</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ouvert-taux-variable-regulier" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only">&nbsp;du prêt ouvert à taux variable régulier</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only">&nbsp;du prêt ouvert à taux variable régulier</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt ouvert à taux variable régulier"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-52a42f5d46" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-e0bb75b10b" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-ecfc38a206" class="cmp-text"><p>Votre taux est basé sur notre taux préférentiel plus ou moins un écart garanti tout au long du terme. Votre taux peut donc augmenter ou diminuer à chaque variation de notre taux préférentiel.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-9891efe340" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-85823463ac" class="cmp-text"><p>Écart garanti&nbsp;: -0,70&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-5f3151f62f" tabindex="-1"><h6 class="cmp-title__text ">Variation 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-c79fffa42d" class="cmp-text"><p>Taux préférentiel&nbsp;: 6,75&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,05&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-889bfc5800" tabindex="-1"><h6 class="cmp-title__text ">Variation 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-f31fb1785a" class="cmp-text"><p>Taux préférentiel&nbsp;: 6,95&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,25&nbsp;%</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-562b28e765" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypo­thécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-1c5876f40a" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-5">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-bbdf49d3fa" tabindex="-1"><h4 class="cmp-title__text ">Rembour­sement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-b2ead72d72" class="cmp-text"><p>Vous pouvez rembourser votre prêt au complet ou en partie sans frais d'indemnité et en tout temps. Il arrive cependant que des frais d'indemnité soient exigés si vous profitez de certaines offres et que vous remboursez votre prêt plus vite que prévu.</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-6ebefeea45" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-3d409fe732" class="cmp-text"><ul><li>Vous pouvez tolérer d'importantes variations de taux et votre budget est flexible.</li><li>Vous avez un niveau élevé de connaissances financières.</li><li>Vous planifiez vendre votre propriété ou rembourser la totalité de votre prêt à court terme.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="separator custom-mt-32 custom-mb-32 aem-GridColumn aem-GridColumn--default--12"><div id="separator-7380b9075d" class="cmp-separator"><hr class="cmp-separator__horizontal-rule"></div></div></div></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-7c5852ff25" class="cmp-container cmp-container-improved" style="" data-mw-element-visible="imp|hypo|taux-hypothecaires|na|Taux revisable"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-08c6cb5fcf" tabindex="-1"><h2 class="cmp-title__text ">Prêt à taux révisable annuel­lement</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-5acd498682" class="cmp-text"><p>Le <strong>taux révisable annuellement</strong> est ajusté chaque année en fonction de notre prêt fermé à taux fixe sur&nbsp;1&nbsp;an moins un écart. Cette option peut vous convenir si vous avez une <strong>certaine tolérance au risque</strong> et que vous avez la flexibilité financière de faire face à des possibles hausses annuelles.</p></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-b26a4ce3a9" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-3630a71a7a" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux révisable annuel­lement</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-8440886370" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-aa04f0ddb0" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>5&nbsp;ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tra.rate | taux | 2">5,49&nbsp;%</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-revisable-annuellement" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux révisable annuellement</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only">&nbsp;du prêt fermé à taux révisable annuellement</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux révisable annuellement"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-59adbcb4e9" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-6f876c251b" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-6a8563c1df" class="cmp-text"><p>Votre taux correspond à celui de notre prêt fermé à taux fixe sur&nbsp;1&nbsp;an moins un écart garanti. Le pourcentage de cet écart est connu pour chaque année du terme. Votre taux est révisé une fois par an, à la date anniversaire du prêt.</p><p>Vous pouvez convertir votre taux révisable annuellement en taux fixe à tout moment, sans frais d'indemnité et à certaines conditions.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-d841899752" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-2c57eb3f62" class="cmp-text"><p>Écart garanti&nbsp;: -0,20&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-57856e8b8e" tabindex="-1"><h6 class="cmp-title__text ">Année 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-460321f5ab" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1&nbsp;an&nbsp;: 6,99&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,79&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-3985ca04f2" tabindex="-1"><h6 class="cmp-title__text ">Année 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9980379742" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1&nbsp;an&nbsp;: 6,99&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,79&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-046208a8e4" tabindex="-1"><h6 class="cmp-title__text ">Année 3</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-1638de85f1" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1&nbsp;an&nbsp;: 6,24&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,04&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-be7f983760" tabindex="-1"><h6 class="cmp-title__text ">Année 4</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-ca7c02fe39" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1&nbsp;an&nbsp;: 6,74&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,54&nbsp;%</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-126af88da9" tabindex="-1"><h6 class="cmp-title__text ">Année 5</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-d7254c87aa" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1&nbsp;an&nbsp;: 6,49&nbsp;%<br></p><p>Taux personnalisé&nbsp;: 6,29&nbsp;%</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-f5fb7e6426" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypo­thécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-91b85a7ea9" class="cmp-text"><p>Égaux pendant 12&nbsp;mois et ajustés chaque année selon votre nouveau taux<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-6">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-357e4107f8" tabindex="-1"><h4 class="cmp-title__text ">Rembour­sement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-4b9eef1281" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à&nbsp;15&nbsp;% du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-95c75f27d1" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-deab148853" class="cmp-text"><ul><li>Vous avez une certaine tolérance au risque, mais vous cherchez une prévisibilité à court terme dans votre budget.</li><li>Vous connaissez le taux et le montant de vos paiements sur une base annuelle.</li><li>Vous voulez profiter des potentielles baisses de taux sans vous exposer pleinement aux risques d'un taux variable.<br></li><li>Vous pensez conserver votre propriété au moins 5&nbsp;ans.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-5c2a61d777" class="cmp-container cmp-container-improved" style="background-color:#ECF5F0;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-dsd-pt-24 cmp-container--main-dsd-pb-24 cmp-container--main-va-center aem-GridColumn aem-GridColumn--default--12"><div id="taux-preferentiel" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="image aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><div data-cmp-is="image" data-cmp-lazy data-cmp-lazythreshold="0" data-cmp-src="/fr/hypotheque/taux-hypothecaires/_jcr_content/root/container/container/container_1823686747/container_1674456545/image.coreimg.85{.width}.png/1677699008335/taux-preferentiel.png" data-cmp-widths="320,480,600,800,1024,1200,1600" data-asset="/content/dam/images/photos/particuliers/hypotheque/taux preferentiel.png" class="cmp-image image-p-0 image-m-0"><noscript data-cmp-hook-image="noscript"><img class="cmp-image__image image-br-md" src="/fr/hypotheque/taux-hypothecaires/_jcr_content/root/container/container/container_1823686747/container_1674456545/image.coreimg.png/1677699008335/taux-preferentiel.png" style="--image-translate: %; --image-translate-mob: %" alt data-cmp-hook-image="image"></noscript></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-32 cmp-container--main-custom-mb-32 aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><div id="container-1ef00051d5" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--6 aem-Grid--default--6 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-a49114274e" tabindex="-1"><h2 class="cmp-title__text ">Taux préférentiel</h2></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-8449b2d7f6" class="cmp-text"><p><span class="dsd-b-10"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tpcad.rate | taux | 2">4,45&nbsp;%</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/018-taux-preferentiel"><dsd-footnote-ref target="018-taux-preferentiel" id="018-taux-preferentiel-2">3</dsd-footnote-ref></span></strong></span><br></p></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-72be5a4af7" tabindex="-1"><h3 class="cmp-title__text ">Qu'est-ce que le taux préférentiel?</h3></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-42d354ea06" class="cmp-text"><p>C'est le taux que nous utilisons pour fixer les taux d'intérêt de plusieurs de nos prêts et marges de crédit. Comme celui des autres institutions financières, notre taux préférentiel se base sur le taux directeur de la Banque du Canada. Quand le taux directeur augmente ou baisse, notre taux préférentiel suit généralement et influence ensuite les taux de certains de nos produits financiers.</p></div></div><div class="title dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-b60de3f416" tabindex="-1"><h2 class="cmp-title__text ">Taux d'intérêt de la marge Atout</h2></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-58bf0595f3" class="cmp-text"><p>Le taux d'intérêt des prêts liés à votre marge, comme celui associé à votre propriété, est établi selon les conditions décidées au moment de créer le prêt.</p><p>Le taux d'intérêt variable de la marge de crédit hypothécaire est fixé en fonction de notre taux préférentiel plus ou moins un écart de base. Cet écart est ensuite personnalisé selon plusieurs critères, comme votre profil financier ou votre projet.</p></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-849abb5bc5" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Exemple</h3></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-6d51f26d6e" class="cmp-text"><p>Taux préférentiel&nbsp;: 6,70&nbsp;%<br> Taux de la marge avec l'écart de base&nbsp;: 7,70&nbsp;%<br> Taux personnalisé après évaluation du dossier&nbsp;: 7,30&nbsp;%</p></div></div><div class="action-link dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-action-link"><a href="/fr/hypotheque/marge-atout.html" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Découvrir la marge Atout </span> </span> </a></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-be3542b33e" class="cmp-container cmp-container-improved" style="background-color:#CCE7D7;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-40 cmp-container--main-dsd-pb-32 cmp-container--main-va-stretch aem-GridColumn aem-GridColumn--default--12"><div id="container-3d7cb5e087" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="experiencefragment dsd-pl-0 dsd-pr-0 aem-GridColumn aem-GridColumn--default--12"><div id="experiencefragment-ad71b8fe46" class="cmp-experiencefragment cmp-experiencefragment--calculateurs-hypothecaires"><div id="container-3556430b20" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_calculateur" fill="light-confirmation-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg dsd-mb-sm aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-1b62dc47a9" tabindex="-1"><h2 class="cmp-title__text ">Calculateurs hypo­thécaires</h2></div></div><div class="semantic-list accordion panelcontainer grid-flow grid-flow--2up aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-semantic-list" id="semantic-list-c463575761" data-panelcontainer="false"><ul class="cmp-semantic-list__unordered-list grid-flow__container"><li class="cmp-semantic-list__item grid-flow__child"><div class="tile responsivegrid"><a href="https://www.desjardins.com/outils/valeur-maison/index.jsp#/valeur-maison" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--5 aem-Grid--default--5 aem-Grid--xsmall--12 "><div class="text dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--5"><div id="text-5c783c9344" class="cmp-text"><p>Calculez combien vous pouvez emprunter</p></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div></li><li class="cmp-semantic-list__item grid-flow__child"><div class="tile responsivegrid"><a href="https://www.desjardins.com/outils/calcul-versements-hypothecaires/index.jsp" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--5 aem-Grid--default--5 aem-Grid--xsmall--12 "><div class="text dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--5"><div id="text-4fb1d9fbeb" class="cmp-text"><p>Calculez et optimisez vos paiements hypo­thécaires</p></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div></li></ul></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-c9bc1c628e" class="cmp-container cmp-container-improved" style="background-color:#f2f2f2;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-40 aem-GridColumn aem-GridColumn--default--12"><div id="container-ff9402e2e0" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-36221c373d" class="cmp-container cmp-container-improved" style="" data-mw-element-visible="imp|hypo|taux-hypothecaires|na|Faq"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title dsd-mb-lg aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-163861b25a" tabindex="-1"><h2 class="cmp-title__text ">Foire aux questions</h2></div></div><div class="faq dsd-mb-lg aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-faq"><dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">Pourquoi les taux hypothécaires augmentent-ils?</h3><p>La variation à la hausse ou à la baisse des taux hypothécaires dépend principalement du taux directeur établi par la Banque du Canada. Le taux directeur fluctue selon la situation économique au Canada et à l'étranger. Son rôle est de réguler l'inflation en fonction de la croissance économique. Une hausse du taux directeur, et donc des taux hypothécaires, sert à ralentir l'inflation, à stimuler l'épargne et à stabiliser le cycle économique.</p><p>Pour en savoir plus, lisez l'article <a href="/fr/conseils/taux-hypothecaires-4-questions-reponses.html">Hausse des taux hypothécaires : 4 questions et leurs réponses</a>.</p> </dsd-accordion> <dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">Pourquoi réserver mon taux hypothécaire?</h3><p>Réserver votre taux hypothécaire vous permet de vous protéger en cas de hausse des taux pendant vos démarches d'achat de propriété. Nous fixons votre taux en fonction de votre dossier et la durée pour laquelle il est garanti selon votre projet et vos besoins. Pour que votre taux reste garanti, votre dossier et les paramètres de votre financement doivent rester les mêmes durant la période convenue. Sinon, votre garantie de taux pourrait devoir être réévaluée en fonction des derniers taux en vigueur.</p><p>Contactez-nous pour en savoir plus ou réserver votre taux.</p> </dsd-accordion> <dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">Comment puis-je me protéger en cas de hausse des taux d'intérêt hypothécaires?</h3><p>Dès le début de vos démarches d'achat de maison, pensez à demander une préautorisation pour garantir votre taux. Évaluez aussi les incidences qu'une augmentation des taux d'intérêt aurait dans votre budget. Même si nous vérifions votre capacité à rembourser votre prêt à un taux plus élevé que celui proposé, votre situation financière peut changer au fil du temps. Assurez-vous donc d'avoir une marge de manœuvre suffisante et de mettre de l'argent de côté dans un <a href="https://www.desjardins.com/particuliers/comptes-services-relies/comptes-epargne/">compte d'épargne</a>.</p> </dsd-accordion> <dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">J'ai un prêt chez Desjardins. Où puis-je consulter mon taux hypothécaire actuel?</h3><p>Vous pouvez vérifier votre taux actuel et voir d'autres détails sur votre prêt hypothécaire dans AccèsD.</p><p><b>Dans un navigateur Web</b></p><ol><li>Connectez-vous à <a href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&amp;langueCible=fr&amp;executeTime=24">AccèsD</a>.</li><li>Sous <b>Cartes, prêts et marges de crédit</b>, choisissez le compte <b>Prêt hypothécaire résidentiel.</b></li><li>Ouvrez le tiroir <b>Information sur le compte</b> pour consulter votre taux hypothécaire et d'autres détails.</li></ol><p><b><br> Dans l'appli Services mobiles Desjardins</b></p><ol><li>Connectez-vous à <a href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&amp;langueCible=fr&amp;executeTime=24">AccèsD</a>.</li><li>Sous <b>Accès rapide</b>, choisissez <b>Mes comptes</b>.</li><li>Sous <b>Cartes, prêts et marges de crédit</b>, sélectionnez le compte associé à votre prêt hypothécaire résidentiel.</li><li>Sélectionnez <b>Information</b>.</li><li>Consultez le <b>Taux d'intérêt annuel en vigueur</b>.</li></ol> </dsd-accordion></div></div><div class="action-link aem-GridColumn aem-GridColumn--default--12"><div class="cmp-action-link"><a href="/fr/hypotheque/faq.html" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Voir plus de questions sur l'hypothèque </span> </span> </a></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-lg"><div id="at-0043-bloc-conversion" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="msm-experiencefragment experiencefragment dsd-pl-0 dsd-pr-0 aem-GridColumn aem-GridColumn--default--12"><div id="msm-experiencefragment-68d9822a65" class="cmp-experiencefragment cmp-experiencefragment--contactez-nous-preautorisation"><div id="container-1ee8446a39" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--small--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn aem-GridColumn--default--12"><div class="cmp-title" id="title-b7bd5e42c9" tabindex="-1"><h2 class="cmp-title__text ">Demandez une préauto­risation hypo­thécaire</h2></div></div><div class="separator dsd-mb-sm aem-GridColumn aem-GridColumn--default--12"><div id="separator-12c88996a5" class="cmp-separator"><hr class="cmp-separator__horizontal-rule" aria-hidden="true" role="none"></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--offset--default--0 aem-GridColumn--default--4"><div id="container-f1d836ac95" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--small--10 aem-Grid--default--4 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_en_ligne" fill="light-primary-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-de007fbfe7" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">En ligne<br></h3></div></div><div class="text aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-06bb0c523a" class="cmp-text"><p>Si vous êtes membre, demandez une préautorisation de façon autonome.</p></div></div><div class="action-link dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-action-link"><a href="https://accesdc.mouv.desjardins.com/services/navigation/aiguillage/mon-toit" class="link-principal link-principal-green " data-mw-action-clic="iaw|hypo|bloc demandez une preautorisation|bas|demander une preautorisation"> <span class="mask-button-states"> <span class="cmp-action-link__label">Demander une préauto­risation<span class="dsd-sr-only">&nbsp;hypothécaire dans nos services mobiles et en ligne.</span> </span> </span> </a></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--offset--default--0 aem-GridColumn--default--4"><div id="container-d50b5d98f4" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--small--10 aem-Grid--default--4 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_par_telephone" fill="light-primary-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-29dc628b4d" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Par téléphone</h3></div></div><div class="text aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-d74aeba8d7" class="cmp-text"><p>Prenez rendez-vous pour votre demande de préautorisation.</p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-1b04912587" class="cmp-text"><p>Lundi au vendredi&nbsp;: 8&nbsp;h à 21&nbsp;h<br> Samedi&nbsp;: 9&nbsp;h à 18&nbsp;h</p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-afbe42b1e6" class="cmp-text"><p>Région de Montréal&nbsp;:<br> <span class="dsd-b-10"><strong><a href="tel:5147459499" class="dsd-c-light-confirmation-5">514&nbsp;745-9499<span class="dsd-sr-only">&nbsp;Ce lien ouvre votre application de téléphonie.</span></a></strong></span></p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-ad09e46895" class="cmp-text"><p>Ailleurs au Canada&nbsp;:<br> <span class="dsd-b-10"><strong><a href="tel:18446262476" class="dsd-c-light-confirmation-5">1&nbsp;844&nbsp;626-2476<span class="dsd-sr-only">&nbsp;Ce lien ouvre votre application de téléphonie.</span></a></strong></span></p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-1bad9411b7" class="cmp-text"><p>Pour éviter l’attente, vous pouvez <a href="https://rappel.desjardins.com/#/dcom-pleine-page?struct=%5B%22VPA%22,%22DPCCCSC%22,%22Financement%22%5D&amp;dest=FIN_Hypotheque_Clic&amp;da=P" data-mw-action-clic="iat|hypo|bloc demandez une preautorisation|bas|planifier un appel">planifier un appel</a>.</p></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--offset--default--0 aem-GridColumn--default--4"><div id="container-ca2aff95c6" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--small--10 aem-Grid--default--4 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_conseiller" fill="light-primary-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-4f8395306f" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Avec un conseiller ou une conseillère</h3></div></div><div class="text aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-2271d5293b" class="cmp-text"><p>Si vous êtes membre, utilisez nos services mobiles et en ligne pour prendre un rendez-vous en personne, par téléphone ou par vidéo.</p></div></div><div class="action-link dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-action-link"><a href="https://accesdc.mouv.desjardins.com/services/navigation/aiguillage/prise-rendez-vous" class="link-secondary link-secondary-green " data-mw-action-clic="ias|hypo|bloc demandez une preautorisation|bas|prendre rendez vous"> <span class="mask-button-states"> <span class="cmp-action-link__label">Prendre rendez-vous<span class="dsd-sr-only">&nbsp;dans nos services mobiles et en ligne.</span> </span> </span> </a></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-51f51c993f" class="cmp-container cmp-container-improved" style="background-color:#f4f4f4;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-32 aem-GridColumn aem-GridColumn--default--12"><div id="container-791ad82872" class="cmp-container cmp-container-improved" style="background-color:rgba(255,255,255,0);"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-dsd-mb-sm cmp-container--main-va-stretch aem-GridColumn aem-GridColumn--default--12"><div id="container-5fb3234cb5" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--small--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title custom-mt-40 aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-acfb02f06e" tabindex="-1"><h2 class="cmp-title__text ">Obtenez d'autres informations utiles</h2></div></div><div class="tile responsivegrid aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0 aem-GridColumn--small--6"><a href="/fr/hypotheque/preautorisation-hypothecaire.html" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--6 aem-Grid--small--6 aem-Grid--default--6 aem-Grid--xsmall--12 aem-Grid--medium--6 "><div class="title dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6"><div class="cmp-title" id="title-f4918c858c" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Préau­torisation hypo­thécaire</h3></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div><div class="tile responsivegrid aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0 aem-GridColumn--small--6"><a href="/fr/hypotheque/renouvellement-hypothecaire.html" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--6 aem-Grid--small--6 aem-Grid--default--6 aem-Grid--xsmall--12 aem-Grid--large--6 aem-Grid--medium--6 "><div class="title dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--offset--large--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--large--4 aem-GridColumn--xsmall--none aem-GridColumn--large--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6"><div class="cmp-title" id="title-e6282c5919" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Renouvel­lement de votre prêt</h3></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div></div></div></div><div class="footnotes-dsd aem-GridColumn aem-GridColumn--default--12"><dsd-footnote-group class="cmp-footnotes-dsd" slot="list" footnote-group-title="Notes"><div slot="list"><dsd-footnote list-type="decimal" id="002-note-generale-taux-hypotheque" return-id="002-note-generale-taux-hypotheque-1">Ces taux peuvent être modifiés sans préavis. À moins d’indication contraire, ils peuvent être personnalisés et varier à la baisse ou à la hausse selon plusieurs critères, comme votre profil financier ou encore votre projet.<br><br> Les taux peuvent différer si l'amortissement de votre prêt hypothécaire est supérieur à 25&nbsp;ans. Contactez un conseiller ou une conseillère pour plus d'information.<br><br> Ces taux d'intérêt sont recommandés par la Fédération des caisses Desjardins du Québec à l'ensemble de ses caisses.</dsd-footnote><dsd-footnote list-type="decimal" id="005-taux-promo-conditions" return-id="005-taux-promo-conditions-1">Vous devez remplir les conditions applicables pour bénéficier de la promotion.</dsd-footnote><dsd-footnote list-type="decimal" id="018-taux-preferentiel" return-id="018-taux-preferentiel-1">Le taux préférentiel Desjardins était anciennement appelé le taux préférentiel de la Caisse centrale Desjardins.</dsd-footnote><dsd-footnote list-type="decimal" id="025-paiements-modifies" return-id="025-paiements-modifies-1">Vos paiements pourraient être modifiés dans certaines situations prévues à votre contrat.</dsd-footnote></div></dsd-footnote-group></div></div></div></div></div></div></div></div></div></div></div></main><footer class="msm-experiencefragment experiencefragment"><div id="msm-experiencefragment-ba829dffd6" class="cmp-experiencefragment cmp-experiencefragment--footer"><div id="container-49d3dcce9f" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="footer aem-GridColumn aem-GridColumn--default--12"><div class="cmp-footer"><div class="footer__main-footer"><div class="dsd-w-full"><h2 class="dsd-sr-only">Pied de page</h2> <img class="footer__logo" src="/content/dam/images/logos/commun/logo-desjardins-fr.svg" width="158" height="34" aria-label="Desjardins" alt=""><nav class="nav-footer nav-footer__columns" aria-label="Pied de page"><section class="nav-footer__section group-break"><h3 class="nav-footer__title ">Liens utiles</h3><ul class="nav-footer__list "><li><a href="/accompagnement-difficulte-financiere/index.jsp?navigMW=pp">Accompagnement en cas de difficulté financière </a></li><li><a href="/outils/index.jsp?navigMW=pp">Outils et calculateurs </a></li><li><a href="/fr/taux.html?navigMW=pp">Taux </a></li><li><a href="/localisateur/index.jsp?navigMW=pp">Points de service </a></li><li><a href="/securite/index.jsp?navigMW=pp">Sécurité </a></li><li><a href="/securite/suspendre-remplacer-carte/index.jsp?navigMW=pp">Carte perdue, volée ou défectueuse </a></li><li><a href="/fr/aide/profil-securite/changement-adresse-coordonnees.html?navigMW=pp">Changement d'adresse </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title ">Aide et contact</h3><ul class="nav-footer__list "><li><a href="/fr/aide.html?navigMW=pp">Centre d'aide </a></li><li><a href="/FAQ/index.jsp?navigMW=pp">Foire aux questions </a></li><li><a href="/nous-joindre/index.jsp?navigMW=pp">Nous joindre </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/particuliers/index.jsp?navigMW=pp"> Particuliers </a></h3><ul class="nav-footer__list d-none d-lg-block"><li><a href="/particuliers/comptes-services-relies/index.jsp?navigMW=pp">Comptes et services </a></li><li><a href="/fr/cartes-credit.html?navigMW=pp">Cartes de crédit </a></li><li><a href="/fr/hypotheque.html?navigMW=pp">Hypothèque </a></li><li><a href="/fr/prets-marges-credit.html?navigMW=pp">Prêts et marges de crédit </a></li><li><a href="/fr/epargne-placements.html?navigMW=pp">Épargne et placements </a></li><li><a href="/fr/assurances.html?navigMW=pp">Assurances<span class="dsd-sr-only">&nbsp;Particuliers</span> </a></li><li><a href="/fr/gestion-patrimoine.html?navigMW=pp">Gestion de patrimoine </a></li><li><a href="/fr/offres.html?navigMW=pp">Offres </a></li><li><a href="/fr/epargne-placements/epargne-retraite-collective-participants.html?navigMW=pp">Épargne-retraite collective </a></li></ul></section><section class="nav-footer__section "><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/entreprises.html?navigMW=pp"> Entreprises </a></h3><ul class="nav-footer__list d-none d-lg-block"><li><a href="/fr/entreprises/comptes-tresorerie.html?navigMW=pp">Comptes et gestion de trésorerie </a></li><li><a href="/fr/entreprises/financement-prets.html?navigMW=pp">Financement et prêts </a></li><li><a href="/fr/entreprises/cartes-credit.html?navigMW=pp">Cartes de crédit </a></li><li><a href="/fr/entreprises/projets.html?navigMW=pp">Projets d'entreprise </a></li><li><a href="/fr/entreprises/offres.html?navigMW=pp">Offres par secteur </a></li><li><a href="/fr/entreprises/solutions-outils/partenaires.html?navigMW=pp">Partenaires d’affaires et solutions pour entreprises </a></li><li><a href="/fr/entreprises/solutions-outils.html?navigMW=pp">Solutions pour les employeurs </a></li><li><a href="/fr/entreprises/assurances.html?navigMW=pp">Assurances<span class="dsd-sr-only">&nbsp; Entreprises</span> </a></li><li><a href="/fr/entreprises/international.html?navigMW=pp">Services internationaux </a></li><li><a href="/fr/entreprises/investissement-placements.html?navigMW=pp">Investissement et placements </a></li><li><a href="/fr/entreprises/marche-capitaux.html?navigMW=pp">Marché des capitaux </a></li><li><a href="https://www.fiduciedesjardins.com/fr/" target="_blank" class="consentRedirect">Services fiduciaires <span class="dsd-sr-only"> Lien externe. S'ouvre dans une nouvelle fenêtre.</span><svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" style="fill: #fff; height:.9em; margin-left:6px; width: .9em;"><path d="M12 3a1 1 0 110 2H2v17h17V12a1 1 0 012 0v11a1 1 0 01-1 1H1a1 1 0 01-1-1V4a1 1 0 011-1zm11-3a1 1 0 011 1v6a1 1 0 01-2 0V3.41L9.71 15.71a1 1 0 01-1.42 0 1 1 0 010-1.42L20.59 2H17a1 1 0 110-2z" fill-rule="evenodd" /></svg> </a></li><li><a href="/fr/entreprises/solutions-outils/epargne-retraite-collective.html?navigMW=pp">Épargne-retraite collective </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/a-propos/index.jsp?navigMW=pp"> À propos </a></h3></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/carriere.html?navigMW=pp"> Carrière </a></h3><ul class="nav-footer__list d-none d-lg-block"><li><a href="/fr/carriere/travailler-chez-desjardins.html?navigMW=pp">Travailler chez Desjardins </a></li><li><a href="/fr/carriere/processus-recrutement.html?navigMW=pp">Processus de recrutement </a></li><li><a href="/fr/carriere/domaines-emplois.html?navigMW=pp">Domaines d’emplois </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/conseils.html?navigMW=pp"> Conseils </a></h3></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/nouvelles.html?navigMW=pp"> Nouvelles </a></h3></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/conseillers.html?navigMW=pp"> Espace conseillers et conseillères </a></h3></section><section class="nav-footer__section social-media"><h3 class="nav-footer__title">Suivez-nous<span class="dsd-sr-only">&nbsp;sur les réseaux sociaux</span></h3><ul class="nav-footer__list nav-footer__list--inline"><li><a href="https://www.facebook.com/desjardins" class="social-media__link facebook" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only">Facebook</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.7 0H1.3C.59.01.01.59 0 1.3v21.4c.01.71.59 1.29 1.3 1.3h11.5v-9.3H9.7v-3.6h3.1V8.4c0-3.1 1.9-4.8 4.7-4.8 1.3 0 2.5.1 2.8.1V7h-1.9c-1.5 0-1.8.7-1.8 1.8v2.3h3.6l-.5 3.6h-3.1V24h6.1a1.32 1.32 0 001.3-1.3V1.3A1.32 1.32 0 0022.7 0z" fill-rule="evenodd" /></svg> </a></li><li><a href="https://instagram.com/desjardinscoop" class="social-media__link instagram" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only">Instagram</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M17 0c1 .05 1.97.25 2.9.6.8.3 1.52.78 2.1 1.4a4.6 4.6 0 011.3 2.2c.35.93.55 1.9.6 2.9l.04.55.02.3c.03.56.04 1.17.04 2.39V13.66c0 1.22-.01 1.83-.04 2.38l-.02.3-.04.56c-.05 1-.25 1.97-.6 2.9a7 7 0 01-1.4 2.1 4.87 4.87 0 01-2.1 1.4c-.93.34-1.9.55-2.9.6l-.55.04-.3.02c-.56.03-1.17.04-2.39.04H7c-1-.05-1.97-.25-2.9-.6-.8-.3-1.52-.78-2.1-1.4a4.6 4.6 0 01-1.3-2.2 9.76 9.76 0 01-.6-2.9l-.04-.55-.02-.3C.01 15.48 0 14.87 0 13.65v-3.32C0 9.12.01 8.5.04 7.96l.02-.31c0-.17.02-.35.04-.55a8.12 8.12 0 01.5-3A6.43 6.43 0 014.1.6a8.12 8.12 0 013-.5l.55-.04.3-.02C8.52.01 9.13 0 10.35 0H17zm-3.39 2.2H7.2c-.78.06-1.55.2-2.3.4-.54.18-1.02.49-1.4.9-.41.39-.72.87-.9 1.4-.2.75-.3 1.52-.3 2.3-.08.96-.1 1.4-.1 3.19v3.21c0 1.76.02 2.16.1 3.2a5 5 0 00.4 2.2c.18.53.49 1.01.9 1.4l.17.17c.35.33.77.58 1.23.73.7.26 1.45.4 2.2.4.96.08 1.4.1 3.19.1h3.22c1.75 0 2.15-.02 3.19-.1a5 5 0 002.2-.4 3.92 3.92 0 002.3-2.3c.26-.7.4-1.45.4-2.2l.04-.55.02-.2c.03-.58.04-1.18.04-2.44V12v-1.61c0-1.75-.02-2.15-.1-3.19a5 5 0 00-.4-2.2 3.39 3.39 0 00-.9-1.4l-.17-.17A3.38 3.38 0 0019 2.7c-.7-.26-1.45-.4-2.2-.4l-.55-.04-.2-.01c-.59-.04-1.18-.05-2.44-.05zM12 5.8a6.2 6.2 0 110 12.4 6.2 6.2 0 010-12.4zM12 8a4 4 0 100 8 4 4 0 000-8zm6.4-3.8a1.4 1.4 0 110 2.8 1.4 1.4 0 010-2.8z" /></svg> </a></li><li><a href="https://www.linkedin.com/company/desjardins" class="social-media__link linkedin" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only" lang="en">LinkedIn</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M22.11 0H1.79A1.77 1.77 0 000 1.71v20.58a1.7 1.7 0 001.79 1.7h20.42c.96.02 1.76-.74 1.79-1.7V1.7A1.94 1.94 0 0022.11 0zm-15 20.59H3.59V8.99h3.58v11.6h-.06zM5.28 7.43a2.11 2.11 0 112.09-2.11 2.05 2.05 0 01-2.09 2.11zm15.13 13.16h-3.58v-5.6c0-1.3 0-3-1.79-3S13 13.37 13 14.87v5.73H9.36V8.99h3.39v1.6a3.74 3.74 0 013.38-1.9c3.59 0 4.28 2.42 4.28 5.53v6.37z" /></svg> </a></li><li><a href="https://www.youtube.com/mouvementdesjardins" class="social-media__link youtube" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only" lang="en">YouTube</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.47 6.66a2.87 2.87 0 00-2.11-2.16C19.45 4 12 4 12 4s-7.56 0-9.46.5A3.05 3.05 0 00.42 6.62C.13 8.56 0 10.53 0 12.5c-.01 1.95.17 3.9.53 5.82a2.87 2.87 0 002.11 2.16c1.8.53 9.31.53 9.31.53s7.5 0 9.4-.53a3.06 3.06 0 002.12-2.12c.37-1.94.54-3.9.53-5.87-.05-1.95-.22-3.9-.53-5.83zM9.52 16.09v-7.2l6.23 3.6-6.23 3.6z" /></svg> </a></li></ul></section><section class="nav-footer__section mobile d-block d-md-none"><h3 class="nav-footer__title">Application mobile</h3><ul class="nav-footer__list nav-footer__list--inline"><li><a href="https://itunes.apple.com/ca/app/services-mobiles-desjardins/id386636953?l=fr&amp;ls=1&amp;mt=8" target="_blank" rel="noopener noreferrer"> <img src="/content/dam/images/logos/commun/logo-app-store-fr.svg" alt="Télécharger dans l'App Store. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre." width="159" height="48"> </a></li><li><a href="https://play.google.com/store/apps/details?id=com.desjardins.mobile&amp;hl=fr" target="_blank" rel="noopener noreferrer"> <img src="/content/dam/images/logos/commun/logo-app-google-fr.svg" alt="Disponible sur Google Play. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre." width="159" height="48"> </a></li></ul></section></nav><script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Desjardins","sameAs":["https://www.facebook.com/desjardins","https://instagram.com/desjardinscoop","https://www.linkedin.com/company/desjardins","https://www.youtube.com/mouvementdesjardins"]}</script></div></div><div class="footer__legal-footer"><div class="dsd-w-full"><div class="footer-legal"><div><nav class="secondary-nav-footer" aria-label="Zone légale"><ul class="secondary-nav-footer__list"><li><a href="/conditions-utilisation-notes-legales/index.jsp?navigMW=pp"> Conditions d'utilisation et notes légales </a></li><li><a href="/confidentialite/index.jsp?navigMW=pp"> Confidentialité </a></li><li><a href="#" class="ot-sdk-show-settings" role="button"> Personnaliser les témoins </a></li><li><a href="/fr/a-propos/communaute/accessibilite.html?navigMW=pp"> Accessibilité </a></li><li><a href="/plan-site/index.jsp?navigMW=pp"> Plan du site </a></li></ul></nav><p class="dsd-c-light-white small footer__copyright-text">© 1996-<span data-current-year></span>,&nbsp;Fédération des caisses Desjardins du Québec. Tous droits réservés.</p></div></div></div></div></div></div></div></div></div></footer></div></div><script src="/etc.clientlibs/dcom/clientlibs/clientlib-site.min.8a141e9b6ced4c3c99cc23c2687da7bc.js"></script><script src="/etc.clientlibs/core/wcm/components/commons/site/clientlibs/container.min.f103c0d3728926b3e68183cb0f66a564.js"></script><script src="/etc.clientlibs/dcom/clientlibs/clientlib-base.min.c563a4d0d4bb5918db7ab92bf3d07972.js"></script><script type="module" src="https://static.desjardins.com/applications/particulier/oel-clavardage-toolkit/oel-clavardage-toolkit.js"></script></body></html>
\ No newline at end of file
added tests/fixtures/mortgage/eq-bank.html +1 −0
@@ -0,0 +1 @@
1 +-symbol-en.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/3WE11Dm5S14ER67sTCsg5Z/10056c09a08796fcfd2565cc04c9f498/eq.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/v6dN0g1G8KgCrjZFaZHKf/75373fc60bf66e0cd9fd9a080f01bfb7/doc.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/4E9Qdzk4lUddTQece0WFh4/0a9d73a8bd204c795157075f193b837b/icon-universal-mortgage-default.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/5rRyfMd7kYee0o3QagefON/12644c3907c133328d1a3e016e1d11a9/icon-universal-phone-call-default.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/3Wv1EPcGa9I7qH4MelevI7/49ae86ee467e0038a6de7b52f6a41bd9/other-banks.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/5noxYcYlq8t9jttekJFGWB/87c3696343f6adce40566370b05a73d0/rsp.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/6pTxMkuJAvBBF9J0hmGWr4/3d2951e76864cc7c0914b4778b00ecdf/Badge_AppStore.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/1QDBdyk85oM64SmK9vgg2e/b648970a36f489f4213c3800e8fd5aa0/Badge_GooglePlay.svg\",\"image\"]\n1e:I[58395,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"TemplatingText\"]\n18:[[[\"$\",\"$1\",\"popupModal\",{\"children\":null}],[\"$\",\"$1\",\"notificationBanner\",{\"children\":null}],[\"$\",\"$1\",\"promoFloatingBanner\",{\"children\":null}]],[\"$\",\"main\",null,{\"id\":\"main-content\",\"tabIndex\":-1,\"children\":[null,[[\"$\",\"section\",\"section-0\",{\"className\":\"_2abK9jo6\",\"imageIsAnimated\":false,\"children\":[[\"$\",\"div\",null,{\"className\":\"exn5rbSy\",\"children\":[[\"$\",\"p\",null,{\"className\":\"_4HZoZws0 dl7e6E5Q dMbHxgb- IwNtFlOW\",\"children\":\"Mortgage rates\"}],[\"$\",\"$L1e\",null,{\"text\":\"Rates\",\"align\":\"center\",\"variant\":\"h1-max\",\"className\":\"_4eiuwmkF\",\"global\":{\"locale\":\"en-CA\",\"rates\":{\"APR-5-Year-Fixed\":{\"name\":\"APR-5-Year-Fixed\",\"rate\":5.673},\"APR-1-Year-Fixed\":{\"name\":\"APR-1-Year-Fixed\",\"rate\":6.544,\"decimalPlaces\":\"3\"},\"Standard-Mortgage-Rate-5-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-5-Year-Fixed\",\"rate\":5.14},\"Standard-Mortgage-Rate-1-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-1-Year-Fixed\",\"rate\":5.04},\"GIC-1-Year\":{\"name\":\"GIC 1 Year\",\"rate\":3.4},\"GIC-3-Month\":{\"name\":\"GIC 3 Month\",\"rate\":2.4},\"GIC-15-Month\":{\"name\":\"GIC 15 Month\",\"rate\":3.45},\"GIC-3-Year-Registered\":{\"name\":\"GIC 3 Year\",\"rate\":3.8},\"GIC-4-Year\":{\"name\":\"GIC 4 Year\",\"rate\":3.9},\"GIC-3-Month-Registered\":{\"name\":\"GIC 3 Month\",\"rate\":2.4},\"GIC-4-Year-Registered\":{\"name\":\"GIC 4 Year\",\"rate\":3.9},\"GIC-9-Month\":{\"name\":\"GIC 9 Month\",\"rate\":3.1},\"GIC-1-Year-Registered\":{\"name\":\"GIC 1 Year\",\"rate\":3.4},\"GIC-15-Month-Registered\":{\"name\":\"GIC 15 Month\",\"rate\":3.45},\"GIC-3-Year\":{\"name\":\"GIC 3 Year\",\"rate\":3.8},\"GIC-2-Year-Registered\":{\"name\":\"GIC 2 Year\",\"rate\":3.65},\"GIC-2-Year\":{\"name\":\"GIC 2 Year\",\"rate\":3.65},\"GIC-9-Month-Registered\":{\"name\":\"GIC 9 Month\",\"rate\":3.1},\"Annual-Percentage-Rate-(APR)-5-Year-Adjustable\":{\"name\":\"Annual-Percentage-Rate-(APR)-5-Year-Adjustable\",\"rate\":3.551,\"decimalPlaces\":\"3\"},\"Annual-Percentage-Rate-(APR)-5-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-5-Year-Fixed\",\"rate\":4.546},\"EQB-Evolution-Suite-5-Year-Adjustable\":{\"name\":\"EQB-Evolution-Suite-5-Year-Adjustable\",\"rate\":0.95},\"es-fixed-60-month\":{\"name\":\"esFixed60Month\",\"rate\":4.54},\"USD-SBB-Account\":{\"name\":\"Business US Dollar Account \",\"rate\":2.5},\"Annual-Percentage-Rate-(APR)-3-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-3-Year-Fixed\",\"rate\":4.379},\"es-fixed-36-month\":{\"name\":\"esFixed36Month\",\"rate\":4.34},\"Annual-Percentage-Rate-(APR)-1-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-1-Year-Fixed\",\"rate\":6.41,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR\",\"rate\":6.28,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR\",\"rate\":6.69,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR \",\"rate\":6.98,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR\",\"rate\":6.79,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR\",\"rate\":6.58,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR\",\"rate\":6.89,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR\",\"rate\":7.775},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable\",\"rate\":3.18},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR\",\"rate\":7.465},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed\",\"rate\":7.43},\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR\",\"rate\":7.984},\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed\",\"rate\":7.83},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR\",\"rate\":6.943},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR\",\"rate\":6.357},\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR\",\"rate\":6.782},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable\",\"rate\":2.34},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed\",\"rate\":6.28},\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed\",\"rate\":6.58},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR\",\"rate\":6.903},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR\",\"rate\":6.309},\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR\",\"rate\":6.753},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable\",\"rate\":2.3},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed\",\"rate\":6.23},\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed\",\"rate\":6.55},\"gic-1-year-non-registered\":{\"name\":\"GIC 1 Year\",\"rate\":3.3},\"equitable-prime-rate\":{\"name\":\"Equitable-Prime-Rate\",\"rate\":4.45},\"es-fixed-48-month\":{\"name\":\"esFixed48Month\",\"rate\":4.64},\"es-fixed-24-month\":{\"name\":\"esFixed24Month\",\"rate\":5.39},\"es-fixed-12-month\":{\"name\":\"esFixed12Month\",\"rate\":6.29},\"corporate-series-f-usd\":{\"name\":\"corporate-series-f-usd\",\"rate\":3},\"corporate-series-a-usd\":{\"name\":\"corporate-series-a-usd\",\"rate\":2.9},\"personal-series-f-usd\":{\"name\":\"personal-series-f-usd\",\"rate\":3.05},\"personal-series-a-usd\":{\"name\":\"personal-series-a-usd\",\"rate\":2.9},\"corporate-series-f\":{\"name\":\"corporate-series-f\",\"rate\":1.9},\"corporate-series-a\":{\"name\":\"corporate-series-a\",\"rate\":1.8},\"personal-series-f\":{\"name\":\"personal-series-f\",\"rate\":2.05},\"personal-series-a\":{\"name\":\"personal-series-a\",\"rate\":1.9},\"hisa-usd-eqb\":{\"name\":\"hisa-usd-eqb\",\"rate\":2.9},\"hisa-cad-eqb\":{\"name\":\"hisa-cad-eqb\",\"rate\":1.9},\"mortgage-rate-variable-5-year-apr\":{\"name\":\"Variable APR Mortgage Rate\",\"rate\":4.05},\"mortgage-rate-variable-5-year\":{\"name\":\"Variable Mortgage Rate\",\"rate\":4},\"mortgage-rate-fixed-5-year-apr\":{\"name\":\"Fixed APR Mortgage Rate\",\"rate\":4.06},\"mortgage-rate-fixed-5-year\":{\"name\":\"Fixed Mortgage Rate\",\"rate\":4.04},\"RRSP-Cash-Savings-Account\":{\"name\":\"RRSP Cash Savings Account\",\"rate\":1.5},\"US-Dollar-Account\":{\"name\":\"US Dollar Account\",\"rate\":2.5},\"SBB-cash-back\":{\"name\":\"SBB-cash-back\",\"rate\":1},\"APR-2-Year-Fixed\":{\"name\":\"APR-2-Year-Fixed\",\"rate\":5.951},\"Standard-Mortgage-Rate-2-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-2-Year-Fixed\",\"rate\":5.14},\"EQB-Evolution-Suite-6-Month-Fixed\":{\"name\":\"EQB-Evolution-Suite-6-month-Fixed\",\"rate\":7.54},\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR\",\"rate\":6.792},\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR\",\"rate\":7.512},\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR\",\"rate\":8.569},\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed\",\"rate\":6.49},\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed\",\"rate\":6.79},\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed\",\"rate\":6.88},\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR\",\"rate\":8.186},\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR\",\"rate\":8.808},\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR\",\"rate\":9.634},\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed\",\"rate\":7.94},\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed\",\"rate\":8.14},\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed\",\"rate\":7.98},\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR\",\"rate\":6.985},\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR\",\"rate\":7.608},\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed\",\"rate\":6.69},\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed\",\"rate\":6.89},\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR\",\"rate\":8.666},\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed\",\"rate\":6.98},\"Annual-Percentage-Rate-(APR)-4-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-4-Year-Fixed\",\"rate\":4.648},\"Annual-Percentage-Rate-(APR)-2-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-2-Year-Fixed\",\"rate\":5.432},\"APR-5-Year-Adjustable\":{\"name\":\"APR-5-Year-Adjustable\",\"rate\":4.999},\"APR-4-Year-Fixed\":{\"name\":\"APR-4-Year-Fixed\",\"rate\":6.416},\"APR-3-Year-Fixed\":{\"name\":\"APR-3-Year-Fixed\",\"rate\":5.847},\"Standard-Mortgage-Rate-5-Year-Adjustable\":{\"name\":\"Standard-Mortgage-Rate-5-Year-Adjustable\",\"rate\":0.04},\"Standard-Mortgage-Rate-4-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-4-Year-Fixed\",\"rate\":6.19},\"Standard-Mortgage-Rate-3-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-3-Year-Fixed\",\"rate\":5.24},\"GIC-10-Year-Registered\":{\"name\":\"GIC 10 Year\",\"rate\":2.35},\"GIC-7-Year-Registered\":{\"name\":\"GIC 7 Year\",\"rate\":2.35},\"GIC-5-Year-Registered\":{\"name\":\"GIC 5 Year\",\"rate\":4},\"GIC-27-Month-Registered\":{\"name\":\"GIC 27 Month\",\"rate\":3.7},\"GIC-6-Month-Registered\":{\"name\":\"GIC 6 Month\",\"rate\":2.75},\"Business-account\":{\"name\":\"sbb\",\"rate\":2.25},\"Joint-Account-Base-Rate\":{\"name\":\"Joint Account Base Rate \",\"rate\":1},\"GIC-6-Year-Registered\":{\"name\":\"GIC 6 Year\",\"rate\":2.35},\"Personal-Account-Base-Rate\":{\"name\":\"Personal Account Base Rate \",\"rate\":1},\"30 Day-Notice-Savings-Account\":{\"name\":\"30 Day Notice Savings Account\",\"rate\":2.75},\"GIC-6-Month\":{\"name\":\"GIC 6 Month\",\"rate\":2.75},\"GIC-27-Month\":{\"name\":\"GIC 27 Month\",\"rate\":3.7},\"GIC-7-Year\":{\"name\":\"GIC 7 Year\",\"rate\":2.35},\"GIC-5-Year\":{\"name\":\"GIC 5 Year\",\"rate\":4},\"GIC-6-Year\":{\"name\":\"GIC 6 Year\",\"rate\":2.35},\"GIC-10-Year\":{\"name\":\"GIC 10 Year\",\"rate\":2.35},\"10 Day-Notice-Savings-Account\":{\"name\":\"10 Day Notice Savings Account\",\"rate\":2.35},\"Joint-Account-Payroll-Account\":{\"name\":\"Joint Account Payroll Account\",\"rate\":2.75},\"Personal-Account-Payroll-Rate\":{\"name\":\"Personal Account Payroll Rate\",\"rate\":2.75},\"Personal-Account-bonus-interest-rate\":{\"name\":\"Personal Account bonus interest rate\",\"rate\":1.75},\"Joint-Account-bonus-interest-rate\":{\"name\":\"Joint Account bonus interest rate\",\"rate\":1.75},\"TFSA-Cash-Savings-Account\":{\"name\":\"TFSA Cash Savings Account\",\"rate\":1.5},\"FHSA-cash-savings-account\":{\"name\":\"FHSA Cash Savings Account\",\"rate\":1.5},\"cannex-annual-1-yr\":{\"name\":\"cannex-annual-1-yr\",\"rate\":3.01},\"cannex-annual-2-yr\":{\"name\":\"cannex-annual-2-yr\",\"rate\":3.69},\"cannex-annual-3-yr\":{\"name\":\"cannex-annual-3-yr\",\"rate\":3.96},\"cannex-annual-4-yr\":{\"name\":\"cannex-annual-4-yr\",\"rate\":4.04},\"cannex-annual-5-yr\":{\"name\":\"cannex-annual-5-yr\",\"rate\":4.16},\"cannex-annual-6-yr\":{\"name\":\"cannex-annual-6-yr\",\"rate\":2.25},\"cannex-annual-7-yr\":{\"name\":\"cannex-annual-7-yr\",\"rate\":2.25},\"cannex-annual-8-yr\":{\"name\":\"cannex-annual-8-yr\",\"rate\":2.25},\"cannex-annual-9-yr\":{\"name\":\"cannex-annual-9-yr\",\"rate\":2.25},\"cannex-annual-10-yr\":{\"name\":\"cannex-annual-10-yr\",\"rate\":2.25},\"cannex-semi-annual-1-yr\":{\"name\":\"cannex-semi-annual-1-yr\",\"rate\":2.97},\"cannex-semi-annual-2-yr\":{\"name\":\"cannex-semi-annual-2-yr\",\"rate\":3.65},\"cannex-semi-annual-3-yr\":{\"name\":\"cannex-semi-annual-3-yr\",\"rate\":3.92},\"cannex-semi-annual-4-yr\":{\"name\":\"cannex-semi-annual-4-yr\",\"rate\":4},\"cannex-semi-annual-5-yr\":{\"name\":\"cannex-semi-annual-5-yr\",\"rate\":4.12},\"cannex-semi-annual-6-yr\":{\"name\":\"cannex-semi-annual-6-yr\",\"rate\":2.21},\"cannex-semi-annual-7-yr\":{\"name\":\"cannex-semi-annual-7-yr\",\"rate\":2.21},\"cannex-semi-annual-8-yr\":{\"name\":\"cannex-semi-annual-8-yr\",\"rate\":2.21},\"cannex-semi-annual-9-yr\":{\"name\":\"cannex-semi-annual-9-yr\",\"rate\":2.21},\"cannex-semi-annual-10-yr\":{\"name\":\"cannex-semi-annual-10-yr\",\"rate\":2.21},\"cannex-quarterly-1-yr\":{\"name\":\"cannex-quarterly-1-yr\",\"rate\":2.94},\"cannex-quarterly-2-yr\":{\"name\":\"cannex-quarterly-2-yr\",\"rate\":3.62},\"cannex-quarterly-3-yr\":{\"name\":\"cannex-quarterly-3-yr\",\"rate\":3.89},\"cannex-quarterly-4-yr\":{\"name\":\"cannex-quarterly-4-yr\",\"rate\":3.97},\"cannex-quarterly-5-yr\":{\"name\":\"cannex-quarterly-5-yr\",\"rate\":4.09},\"cannex-quarterly-6-yr\":{\"name\":\"cannex-quarterly-6-yr\",\"rate\":2.18},\"cannex-quarterly-7-yr\":{\"name\":\"cannex-quarterly-7-yr\",\"rate\":2.18},\"cannex-quarterly-8-yr\":{\"name\":\"cannex-quarterly-8-yr\",\"rate\":2.18},\"cannex-quarterly-9-yr\":{\"name\":\"cannex-quarterly-9-yr\",\"rate\":2.18},\"cannex-quarterly-10-yr\":{\"name\":\"cannex-quarterly-10-yr\",\"rate\":2.18},\"cannex-monthly-1-yr\":{\"name\":\"cannex-monthly-1-yr\",\"rate\":2.92},\"cannex-monthly-2-yr\":{\"name\":\"cannex-monthly-2-yr\",\"rate\":3.6},\"cannex-monthly-3-yr\":{\"name\":\"cannex-monthly-3-yr\",\"rate\":3.87},\"cannex-monthly-4-yr\":{\"name\":\"cannex-monthly-4-yr\",\"rate\":3.95},\"cannex-monthly-5-yr\":{\"name\":\"cannex-monthly-5-yr\",\"rate\":4.07},\"cannex-monthly-6-yr\":{\"name\":\"cannex-monthly-6-yr\",\"rate\":2.16},\"cannex-monthly-7-yr\":{\"name\":\"cannex-monthly-7-yr\",\"rate\":2.16},\"cannex-monthly-8-yr\":{\"name\":\"cannex-monthly-8-yr\",\"rate\":2.16},\"cannex-monthly-9-yr\":{\"name\":\"cannex-monthly-9-yr\",\"rate\":2.16},\"cannex-monthly-10-yr\":{\"name\":\"cannex-monthly-10-yr\",\"rate\":2.16},\"cannex-cacheable\":{\"name\":\"cannex-cacheable\",\"rate\":1.5},\"cannex-ustd-annual-1-yr\":{\"name\":\"cannex-ustd-annual-1-yr\",\"rate\":4.1},\"cannex-ustd-annual-2-yr\":{\"name\":\"cannex-ustd-annual-2-yr\",\"rate\":3.95},\"cannex-ustd-annual-3-yr\":{\"name\":\"cannex-ustd-annual-3-yr\",\"rate\":3.95},\"cannex-ustd-annual-4-yr\":{\"name\":\"cannex-ustd-annual-4-yr\",\"rate\":4},\"cannex-ustd-annual-5-yr\":{\"name\":\"cannex-ustd-annual-5-yr\",\"rate\":4.05},\"cannex-ustd-annual-6-yr\":{\"name\":\"cannex-ustd-annual-6-yr\",\"rate\":2.5},\"cannex-ustd-annual-7-yr\":{\"name\":\"cannex-ustd-annual-7-yr\",\"rate\":2.5},\"cannex-ustd-annual-8-yr\":{\"name\":\"cannex-ustd-annual-8-yr\",\"rate\":2.5},\"cannex-ustd-annual-9-yr\":{\"name\":\"cannex-ustd-annual-9-yr\",\"rate\":2.5},\"cannex-ustd-annual-10-yr\":{\"name\":\"cannex-ustd-annual-10-yr\",\"rate\":2.5},\"cannex-ustd-semi-annual-1-yr\":{\"name\":\"cannex-ustd-semi-annual-1-yr\",\"rate\":4.06},\"cannex-ustd-semi-annual-2-yr\":{\"name\":\"cannex-ustd-semi-annual-2-yr\",\"rate\":3.91},\"cannex-ustd-semi-annual-3-yr\":{\"name\":\"cannex-ustd-semi-annual-3-yr\",\"rate\":3.91},\"cannex-ustd-semi-annual-4-yr\":{\"name\":\"cannex-ustd-semi-annual-4-yr\",\"rate\":3.96},\"cannex-ustd-semi-annual-5-yr\":{\"name\":\"cannex-ustd-semi-annual-5-yr\",\"rate\":4.01},\"cannex-ustd-semi-annual-6-yr\":{\"name\":\"cannex-ustd-semi-annual-6-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-7-yr\":{\"name\":\"cannex-ustd-semi-annual-7-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-8-yr\":{\"name\":\"cannex-ustd-semi-annual-8-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-9-yr\":{\"name\":\"cannex-ustd-semi-annual-9-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-10-yr\":{\"name\":\"cannex-ustd-semi-annual-10-yr\",\"rate\":2.46},\"cannex-ustd-quarterly-1-yr\":{\"name\":\"cannex-ustd-quarterly-1-yr\",\"rate\":4.03},\"cannex-ustd-quarterly-2-yr\":{\"name\":\"cannex-ustd-quarterly-2-yr\",\"rate\":3.88},\"cannex-ustd-quarterly-3-yr\":{\"name\":\"cannex-ustd-quarterly-3-yr\",\"rate\":3.88},\"cannex-ustd-quarterly-4-yr\":{\"name\":\"cannex-ustd-quarterly-4-yr\",\"rate\":3.93},\"cannex-ustd-quarterly-5-yr\":{\"name\":\"cannex-ustd-quarterly-5-yr\",\"rate\":3.98},\"cannex-ustd-quarterly-6-yr\":{\"name\":\"cannex-ustd-quarterly-6-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-7-yr\":{\"name\":\"cannex-ustd-quarterly-7-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-8-yr\":{\"name\":\"cannex-ustd-quarterly-8-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-9-yr\":{\"name\":\"cannex-ustd-quarterly-9-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-10-yr\":{\"name\":\"cannex-ustd-quarterly-10-yr\",\"rate\":2.43},\"cannex-ustd-monthly-1-yr\":{\"name\":\"cannex-ustd-monthly-1-yr\",\"rate\":4.01},\"cannex-ustd-monthly-2-yr\":{\"name\":\"cannex-ustd-monthly-2-yr\",\"rate\":3.86},\"cannex-ustd-monthly-3-yr\":{\"name\":\"cannex-ustd-monthly-3-yr\",\"rate\":3.86},\"cannex-ustd-monthly-4-yr\":{\"name\":\"cannex-ustd-monthly-4-yr\",\"rate\":3.91},\"cannex-ustd-monthly-5-yr\":{\"name\":\"cannex-ustd-monthly-5-yr\",\"rate\":3.96},\"cannex-ustd-monthly-6-yr\":{\"name\":\"cannex-ustd-monthly-6-yr\",\"rate\":2.41},\"cannex-ustd-monthly-7-yr\":{\"name\":\"cannex-ustd-monthly-7-yr\",\"rate\":2.41},\"cannex-ustd-monthly-8-yr\":{\"name\":\"cannex-ustd-monthly-8-yr\",\"rate\":2.41},\"cannex-ustd-monthly-9-yr\":{\"name\":\"cannex-ustd-monthly-9-yr\",\"rate\":2.41},\"cannex-ustd-monthly-10-yr\":{\"name\":\"cannex-ustd-monthly-10-yr\",\"rate\":2.41},\"cannex-ustd-cacheable\":{\"name\":\"cannex-ustd-cacheable\",\"rate\":1.75},\"cannex-short-term-30-days\":{\"name\":\"cannex-short-term-30-days\",\"rate\":0.2},\"cannex-short-term-60-days\":{\"name\":\"cannex-short-term-60-days\",\"rate\":0.8},\"cannex-short-term-90-days\":{\"name\":\"cannex-short-term-90-days\",\"rate\":2.15},\"cannex-short-term-120-days\":{\"name\":\"cannex-short-term-120-days\",\"rate\":2.2},\"cannex-short-term-180-days\":{\"name\":\"cannex-short-term-180-days\",\"rate\":2.7},\"cannex-short-term-270-days\":{\"name\":\"cannex-short-term-270-days\",\"rate\":2.8},\"cannex-ustd-short-term-30-days\":{\"name\":\"cannex-ustd-short-term-30-days\",\"rate\":0.05},\"cannex-ustd-short-term-60-days\":{\"name\":\"cannex-ustd-short-term-60-days\",\"rate\":1},\"cannex-ustd-short-term-90-days\":{\"name\":\"cannex-ustd-short-term-90-days\",\"rate\":2.95},\"cannex-ustd-short-term-120-days\":{\"name\":\"cannex-ustd-short-term-120-days\",\"rate\":3},\"cannex-ustd-short-term-180-days\":{\"name\":\"cannex-ustd-short-term-180-days\",\"rate\":3.15},\"cannex-ustd-short-term-270-days\":{\"name\":\"cannex-ustd-short-term-270-days\",\"rate\":3.3}},\"dynamicTexts\":{\"cannex-annual-deposit\":\"$$1000\",\"cannex-semi-annual-deposit\":\"$$1000\",\"cannex-quarterly-deposit\":\"$$1000\",\"cannex-monthly-deposit\":\"$$1000\",\"cannex-cacheable-deposit\":\"$$1000\",\"cannex-ustd-annual-deposit\":\"$$1000\",\"cannex-ustd-semi-annual-deposit\":\"$$1000\",\"cannex-ustd-quarterly-deposit\":\"$$1000\",\"cannex-ustd-monthly-deposit\":\"$$1000\",\"cannex-ustd-cacheable-deposit\":\"$$1000\",\"cannex-short-term-deposit\":\"$$1000\",\"cannex-ustd-short-term-deposit\":\"$$1000\"},\"dates\":{\"cannex-update-time\":\"2026-08-24T11:30:21.000+00:00\"},\"site\":{\"id\":\"eqbank\",\"name\":\"EQ Bank\",\"canonicalDomain\":\"eqbank.ca\",\"domains\":[\"eqbank.ca\",\"www.eqbank.ca\",\"dev.eqbank.ca\",\"qa.eqbank.ca\",\"stage.eqbank.ca\",\"preprod.eqbank.ca\",\"live-preview.eqbank.ca\",\"eqbank.localhost\"],\"environments\":{\"local\":\"http://eqbank.localhost:3000\",\"dev\":\"https://dev.eqbank.ca\",\"qa\":\"https://qa.eqbank.ca\",\"stage\":\"https://stage.eqbank.ca\",\"preprod\":\"https://preprod.eqbank.ca\",\"live-preview\":\"https://live-preview.eqbank.ca\",\"prod\":\"https://eqbank.ca\"},\"deploymentHostPatterns\":[\"^cms-marketing-frontend-.+-eqbank\\\\.vercel\\\\.app$\"],\"defaultLocale\":\"en-CA\",\"locales\":[\"en-CA\",\"fr-CA\"],\"homeSlug\":\"eqbank-home\",\"faviconPath\":\"/eqbank/eqbank-favicon.png\"},\"preview\":false,\"trustpilotConfig\":{\"templateId\":\"5419b732fbfb950b10de65e5\",\"businessUnitId\":\"61ba3de3d136c62d8cb4ffda\",\"publicToken\":\"0ad29663-8633-493a-b481-ce084db74a1d\"},\"breadcrumbs\":[{\"label\":\"Residential\",\"url\":\"/residential\"},{\"label\":\"Mortgage Rates | EQ Bank\"}],\"recaptchaSiteKey\":\"6LfRduosAAAAAC6UODtoNvU5myTiVIB0cYm765bL\"}}],false,false,\"$undefined\",\"$undefined\",\"$undefined\"]}],\"$undefined\",false]}],\"$L1f\",\"$L20\",\"$L21\",\"$L22\"]]}],[\"$L23\"],[\"$L24\"],[\"$L25\"],\"$L26\",false]\n27:I[53595,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"SuperscriptAnchor\"]\n2c:I[11675,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"Accordion\"]\n2d:I[17922,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"Tab\"]\n42:I[79520,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/7vfM8PDSeI0d5KVOI9R7v/e74f30e1781a2419fab4435dbf728f1a/cdic-digital-symbol-en.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/3WE11Dm5S14ER67sTCsg5Z/10056c09a08796fcfd2565cc04c9f498/eq.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/v6dN0g1G8KgCrjZFaZHKf/75373fc60bf66e0cd9fd9a080f01bfb7/doc.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/4E9Qdzk4lUddTQece0WFh4/0a9d73a8bd204c795157075f193b837b/icon-universal-mortgage-default.svg\",\"image\"]\n1f:[\"$\",\"section\",\"section-1\",{\"className\":\"d63g793G\",\"children\":[\"$\",\"div\",null,{\"className\":\"_3l8o1BG-\",\"children\":[[\"$\",\"div\",null,{\"className\":\"zQF3-HGX osMNYblD\",\"children\":[[\"$\",\"$L1e\",null,{\"variant\":\"h2\",\"align\":\"left\",\"text\":\"Mortgages\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}],\"$undefined\"]}],\"$undefined\",false,[\"$\",\"div\",null,{\"className\":\"aA-mr9Tm\",\"children\":[[\"$\",\"$1\",\"Mortgage Table-0\",{\"children\":[[\"$\",\"div\",\"section-0\",{\"className\":\"_8obCEoY-\",\"children\":[false,[\"$\",\"div\",null,{\"className\":\"\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"div\",\"0\",{\"className\":\"TIsw3vQr\",\"children\":[\"$\",\"div\",null,{\"className\":\"b35B6Buq\",\"children\":[\"$\",\"table\",null,{\"className\":\"kYHYNgYX UxR5MIf-\",\"children\":[[[\"$\",\"thead\",\".$0\",{\"className\":\"sOBWLSWW _8j9TiMPl\",\"children\":[\"$\",\"tr\",null,{\"children\":[[\"$\",\"th\",\"0\",{\"id\":\"_S_1_-col-0\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"Mortgage\"}]]}]]}]]}]}],[\"$\",\"th\",\"1\",{\"id\":\"_S_1_-col-1\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"6 Month\"}],[\"$\",\"$L27\",\"templating-text-node-1\",{\"label\":\"2\",\"href\":\"#two\"}],[\"$\",\"$1\",\"templating-text-node-2\",{\"children\":\" \"}]]}]]}]]}]}],[\"$\",\"th\",\"2\",{\"id\":\"_S_1_-col-2\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"1 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"3\",{\"id\":\"_S_1_-col-3\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"2 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"4\",{\"id\":\"_S_1_-col-4\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"3 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"5\",{\"id\":\"_S_1_-col-5\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"4 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"6\",{\"id\":\"_S_1_-col-6\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"5 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"7\",{\"id\":\"_S_1_-col-7\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"5 Year Adjustable\"}]]}]]}]]}]}]]}]}]],[\"$\",\"tbody\",null,{\"children\":[[\"$\",\"tr\",\".$1\",{\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-0\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003cbold\u003eStandard Mortgage Rate (Closed) \u003c/bold\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"1\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-1\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"--\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"2\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-2\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-1-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"3\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-3\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-2-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"4\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-4\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-3-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"5\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-5\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-4-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"6\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-6\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-5-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"7\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-7\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"P + \u003crate\u003eStandard-Mortgage-Rate-5-Year-Adjustable\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}]]}],\"$L28\",\"$L29\",\"$L2a\"]}]]}]}]}]]}]}]]}]]}],\"$L2b\"]}],\"$undefined\",\"$undefined\"]}]}]\n20:[\"$\",\"div\",\"section-2\",{\"className\":\"_8obCEoY-\",\"children\":[\"$undefined\",[\"$\",\"div\",null,{\"className\":\"\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"div\",\"0\",{\"className\":\"TIsw3vQr\",\"children\":[\"$\",\"div\",null,{\"className\":\"\",\"children\":[\"$\",\"table\",null,{\"className\":\"kYHYNgYX qFKpzMCz\",\"children\":[[],[\"$\",\"tbody\",null,{\"children\":[[\"$\",\"tr\",\".$0\",{\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"oWWJNKFk\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003cbold\u003eEquitable Prime Rate (P)\u003c/bold\u003e \",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"1\",{\"className\":\"oWWJNKFk\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eequitable-prime-rate\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}]]}]]}]]}]}]}],[\"$\",\"p\",\"1\",{\"className\":\"_4HZoZws0 nM-XXcw8\",\"children\":[[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"Equitable Prime Rate as of October 30\"}]],[\"$\",\"sup\",\"1\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"th\"}]]}],[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\", 2025. \"}]]]}]]}]}]]}]\n21:[\"$\",\"section\",\"section-3\",{\"className\":\"d63g793G\",\"children\":[\"$\",\"div\",null,{\"className\":\"_3l8o1BG-\",\"children\":[\"$undefined\",\"$undefined\",false,[\"$\",\"div\",null,{\"className\":\"aA-mr9Tm\",\"children\":[[\"$\",\"$1\",\"General Mortgage Rate Information-0\",{\"children\":[[\"$\",\"$L2c\",\"section-0\",{\"anchorId\":\"General Mortgage Rate Information\",\"accordionItems\":[{\"title\":\"General Mortgage Rate Information\",\"answer\":{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"The Equitable Prime Rate (P) is the annual rate of interest that is established from time to time by Equitable Bank, at its discretion, as a point of reference, and may change at any time. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Adjustable rate mortgages offer a variable interest rate that consists of the Equitable Prime Rate plus or minus an adjustment factor and varies automatically if and when the Equitable Prime Rate varies. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"The interest rate for adjustable rate mortgages is compounded monthly, not in advance, and charged monthly. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"The interest rate for fixed rate mortgages is compounded twice per year, not in advance, and charged at the same frequency as the payment frequency selected. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Standard Mortgage Rates are based on our most favourable rates in Ontario and are for reference only and not guaranteed for any particular application. Interest rates are subject to applicants meeting Equitable Bank's credit granting criteria and other conditions and restrictions may apply. Interest rates are subject to change without notice at any time. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"}],\"nodeType\":\"unordered-list\"}],\"nodeType\":\"document\"},\"idField\":\"general-mortgage-rate-information\",\"internalName\":\"General Mortgage Rate Information\"},{\"title\":\"Equitable Prime Rate History \",\"answer\":{\"data\":{},\"content\":[{\"data\":{\"target\":{\"metadata\":{\"tags\":[],\"concepts\":[]},\"sys\":{\"space\":{\"sys\":{\"type\":\"Link\",\"linkType\":\"Space\",\"id\":\"ymwa45h4u77x\"}},\"id\":\"6MbMfqIF9RUnTY2QgiWVJL\",\"type\":\"Entry\",\"createdAt\":\"2026-06-04T17:46:33.989Z\",\"updatedAt\":\"2026-06-07T22:09:53.903Z\",\"environment\":{\"sys\":{\"id\":\"master\",\"type\":\"Link\",\"linkType\":\"Environment\"}},\"publishedVersion\":119,\"revision\":4,\"contentType\":{\"sys\":{\"type\":\"Link\",\"linkType\":\"ContentType\",\"id\":\"table\"}},\"locale\":\"en-CA\"},\"fields\":{\"internalName\":\"Equitable Bank Prime Rate History\",\"content\":{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"\",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Effective Date \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-header-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Equitable Prime Rate \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-header-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"October 30, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"4.45% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"September 18, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"4.70% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"March 13, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"4.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"January 30, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"5.20% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"December 12, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"5.45% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"October 24, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"5.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"September 05, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.45% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"July 25, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.70% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"June 06, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"July 13, 2023 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"7.20% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"June 08, 2023 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"January 26, 2023 \",\"nodeType\":\
\ No newline at end of file
added tests/fixtures/mortgage/eq-bank.json +883 −0
@@ -0,0 +1,883 @@
1 +{
2 + "APR-5-Year-Fixed": {
3 + "name": "APR-5-Year-Fixed",
4 + "rate": 5.673
5 + },
6 + "APR-1-Year-Fixed": {
7 + "name": "APR-1-Year-Fixed",
8 + "rate": 6.544,
9 + "decimalPlaces": "3"
10 + },
11 + "Standard-Mortgage-Rate-5-Year-Fixed": {
12 + "name": "Standard-Mortgage-Rate-5-Year-Fixed",
13 + "rate": 5.14
14 + },
15 + "Standard-Mortgage-Rate-1-Year-Fixed": {
16 + "name": "Standard-Mortgage-Rate-1-Year-Fixed",
17 + "rate": 5.04
18 + },
19 + "GIC-1-Year": {
20 + "name": "GIC 1 Year",
21 + "rate": 3.4
22 + },
23 + "GIC-3-Month": {
24 + "name": "GIC 3 Month",
25 + "rate": 2.4
26 + },
27 + "GIC-15-Month": {
28 + "name": "GIC 15 Month",
29 + "rate": 3.45
30 + },
31 + "GIC-3-Year-Registered": {
32 + "name": "GIC 3 Year",
33 + "rate": 3.8
34 + },
35 + "GIC-4-Year": {
36 + "name": "GIC 4 Year",
37 + "rate": 3.9
38 + },
39 + "GIC-3-Month-Registered": {
40 + "name": "GIC 3 Month",
41 + "rate": 2.4
42 + },
43 + "GIC-4-Year-Registered": {
44 + "name": "GIC 4 Year",
45 + "rate": 3.9
46 + },
47 + "GIC-9-Month": {
48 + "name": "GIC 9 Month",
49 + "rate": 3.1
50 + },
51 + "GIC-1-Year-Registered": {
52 + "name": "GIC 1 Year",
53 + "rate": 3.4
54 + },
55 + "GIC-15-Month-Registered": {
56 + "name": "GIC 15 Month",
57 + "rate": 3.45
58 + },
59 + "GIC-3-Year": {
60 + "name": "GIC 3 Year",
61 + "rate": 3.8
62 + },
63 + "GIC-2-Year-Registered": {
64 + "name": "GIC 2 Year",
65 + "rate": 3.65
66 + },
67 + "GIC-2-Year": {
68 + "name": "GIC 2 Year",
69 + "rate": 3.65
70 + },
71 + "GIC-9-Month-Registered": {
72 + "name": "GIC 9 Month",
73 + "rate": 3.1
74 + },
75 + "Annual-Percentage-Rate-(APR)-5-Year-Adjustable": {
76 + "name": "Annual-Percentage-Rate-(APR)-5-Year-Adjustable",
77 + "rate": 3.551,
78 + "decimalPlaces": "3"
79 + },
80 + "Annual-Percentage-Rate-(APR)-5-Year-Fixed": {
81 + "name": "Annual-Percentage-Rate-(APR)-5-Year-Fixed",
82 + "rate": 4.546
83 + },
84 + "EQB-Evolution-Suite-5-Year-Adjustable": {
85 + "name": "EQB-Evolution-Suite-5-Year-Adjustable",
86 + "rate": 0.95
87 + },
88 + "es-fixed-60-month": {
89 + "name": "esFixed60Month",
90 + "rate": 4.54
91 + },
92 + "USD-SBB-Account": {
93 + "name": "Business US Dollar Account ",
94 + "rate": 2.5
95 + },
96 + "Annual-Percentage-Rate-(APR)-3-Year-Fixed": {
97 + "name": "Annual-Percentage-Rate-(APR)-3-Year-Fixed",
98 + "rate": 4.379
99 + },
100 + "es-fixed-36-month": {
101 + "name": "esFixed36Month",
102 + "rate": 4.34
103 + },
104 + "Annual-Percentage-Rate-(APR)-1-Year-Fixed": {
105 + "name": "Annual-Percentage-Rate-(APR)-1-Year-Fixed",
106 + "rate": 6.41,
107 + "decimalPlaces": "3"
108 + },
109 + "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR": {
110 + "name": "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR",
111 + "rate": 6.28,
112 + "decimalPlaces": "3"
113 + },
114 + "Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR": {
115 + "name": "Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR",
116 + "rate": 6.69,
117 + "decimalPlaces": "3"
118 + },
119 + "Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR": {
120 + "name": "Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR ",
121 + "rate": 6.98,
122 + "decimalPlaces": "3"
123 + },
124 + "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR": {
125 + "name": "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR",
126 + "rate": 6.79,
127 + "decimalPlaces": "3"
128 + },
129 + "Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR": {
130 + "name": "Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR",
131 + "rate": 6.58,
132 + "decimalPlaces": "3"
133 + },
134 + "Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR": {
135 + "name": "Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR",
136 + "rate": 6.89,
137 + "decimalPlaces": "3"
138 + },
139 + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR": {
140 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR",
141 + "rate": 7.775
142 + },
143 + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable": {
144 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable",
145 + "rate": 3.18
146 + },
147 + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR": {
148 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR",
149 + "rate": 7.465
150 + },
151 + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed": {
152 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed",
153 + "rate": 7.43
154 + },
155 + "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR": {
156 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR",
157 + "rate": 7.984
158 + },
159 + "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed": {
160 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed",
161 + "rate": 7.83
162 + },
163 + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR": {
164 + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR",
165 + "rate": 6.943
166 + },
167 + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR": {
168 + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR",
169 + "rate": 6.357
170 + },
171 + "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR": {
172 + "name": "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR",
173 + "rate": 6.782
174 + },
175 + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable": {
176 + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable",
177 + "rate": 2.34
178 + },
179 + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed": {
180 + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed",
181 + "rate": 6.28
182 + },
183 + "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed": {
184 + "name": "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed",
185 + "rate": 6.58
186 + },
187 + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR": {
188 + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR",
189 + "rate": 6.903
190 + },
191 + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR": {
192 + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR",
193 + "rate": 6.309
194 + },
195 + "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR": {
196 + "name": "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR",
197 + "rate": 6.753
198 + },
199 + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable": {
200 + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable",
201 + "rate": 2.3
202 + },
203 + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed": {
204 + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed",
205 + "rate": 6.23
206 + },
207 + "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed": {
208 + "name": "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed",
209 + "rate": 6.55
210 + },
211 + "gic-1-year-non-registered": {
212 + "name": "GIC 1 Year",
213 + "rate": 3.3
214 + },
215 + "equitable-prime-rate": {
216 + "name": "Equitable-Prime-Rate",
217 + "rate": 4.45
218 + },
219 + "es-fixed-48-month": {
220 + "name": "esFixed48Month",
221 + "rate": 4.64
222 + },
223 + "es-fixed-24-month": {
224 + "name": "esFixed24Month",
225 + "rate": 5.39
226 + },
227 + "es-fixed-12-month": {
228 + "name": "esFixed12Month",
229 + "rate": 6.29
230 + },
231 + "corporate-series-f-usd": {
232 + "name": "corporate-series-f-usd",
233 + "rate": 3
234 + },
235 + "corporate-series-a-usd": {
236 + "name": "corporate-series-a-usd",
237 + "rate": 2.9
238 + },
239 + "personal-series-f-usd": {
240 + "name": "personal-series-f-usd",
241 + "rate": 3.05
242 + },
243 + "personal-series-a-usd": {
244 + "name": "personal-series-a-usd",
245 + "rate": 2.9
246 + },
247 + "corporate-series-f": {
248 + "name": "corporate-series-f",
249 + "rate": 1.9
250 + },
251 + "corporate-series-a": {
252 + "name": "corporate-series-a",
253 + "rate": 1.8
254 + },
255 + "personal-series-f": {
256 + "name": "personal-series-f",
257 + "rate": 2.05
258 + },
259 + "personal-series-a": {
260 + "name": "personal-series-a",
261 + "rate": 1.9
262 + },
263 + "hisa-usd-eqb": {
264 + "name": "hisa-usd-eqb",
265 + "rate": 2.9
266 + },
267 + "hisa-cad-eqb": {
268 + "name": "hisa-cad-eqb",
269 + "rate": 1.9
270 + },
271 + "mortgage-rate-variable-5-year-apr": {
272 + "name": "Variable APR Mortgage Rate",
273 + "rate": 4.05
274 + },
275 + "mortgage-rate-variable-5-year": {
276 + "name": "Variable Mortgage Rate",
277 + "rate": 4
278 + },
279 + "mortgage-rate-fixed-5-year-apr": {
280 + "name": "Fixed APR Mortgage Rate",
281 + "rate": 4.06
282 + },
283 + "mortgage-rate-fixed-5-year": {
284 + "name": "Fixed Mortgage Rate",
285 + "rate": 4.04
286 + },
287 + "RRSP-Cash-Savings-Account": {
288 + "name": "RRSP Cash Savings Account",
289 + "rate": 1.5
290 + },
291 + "US-Dollar-Account": {
292 + "name": "US Dollar Account",
293 + "rate": 2.5
294 + },
295 + "SBB-cash-back": {
296 + "name": "SBB-cash-back",
297 + "rate": 1
298 + },
299 + "APR-2-Year-Fixed": {
300 + "name": "APR-2-Year-Fixed",
301 + "rate": 5.951
302 + },
303 + "Standard-Mortgage-Rate-2-Year-Fixed": {
304 + "name": "Standard-Mortgage-Rate-2-Year-Fixed",
305 + "rate": 5.14
306 + },
307 + "EQB-Evolution-Suite-6-Month-Fixed": {
308 + "name": "EQB-Evolution-Suite-6-month-Fixed",
309 + "rate": 7.54
310 + },
311 + "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR": {
312 + "name": "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR",
313 + "rate": 6.792
314 + },
315 + "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR": {
316 + "name": "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR",
317 + "rate": 7.512
318 + },
319 + "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR": {
320 + "name": "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR",
321 + "rate": 8.569
322 + },
323 + "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed": {
324 + "name": "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed",
325 + "rate": 6.49
326 + },
327 + "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed": {
328 + "name": "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed",
329 + "rate": 6.79
330 + },
331 + "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed": {
332 + "name": "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed",
333 + "rate": 6.88
334 + },
335 + "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR": {
336 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR",
337 + "rate": 8.186
338 + },
339 + "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR": {
340 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR",
341 + "rate": 8.808
342 + },
343 + "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR": {
344 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR",
345 + "rate": 9.634
346 + },
347 + "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed": {
348 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed",
349 + "rate": 7.94
350 + },
351 + "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed": {
352 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed",
353 + "rate": 8.14
354 + },
355 + "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed": {
356 + "name": "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed",
357 + "rate": 7.98
358 + },
359 + "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR": {
360 + "name": "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR",
361 + "rate": 6.985
362 + },
363 + "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR": {
364 + "name": "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR",
365 + "rate": 7.608
366 + },
367 + "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed": {
368 + "name": "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed",
369 + "rate": 6.69
370 + },
371 + "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed": {
372 + "name": "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed",
373 + "rate": 6.89
374 + },
375 + "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR": {
376 + "name": "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR",
377 + "rate": 8.666
378 + },
379 + "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed": {
380 + "name": "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed",
381 + "rate": 6.98
382 + },
383 + "Annual-Percentage-Rate-(APR)-4-Year-Fixed": {
384 + "name": "Annual-Percentage-Rate-(APR)-4-Year-Fixed",
385 + "rate": 4.648
386 + },
387 + "Annual-Percentage-Rate-(APR)-2-Year-Fixed": {
388 + "name": "Annual-Percentage-Rate-(APR)-2-Year-Fixed",
389 + "rate": 5.432
390 + },
391 + "APR-5-Year-Adjustable": {
392 + "name": "APR-5-Year-Adjustable",
393 + "rate": 4.999
394 + },
395 + "APR-4-Year-Fixed": {
396 + "name": "APR-4-Year-Fixed",
397 + "rate": 6.416
398 + },
399 + "APR-3-Year-Fixed": {
400 + "name": "APR-3-Year-Fixed",
401 + "rate": 5.847
402 + },
403 + "Standard-Mortgage-Rate-5-Year-Adjustable": {
404 + "name": "Standard-Mortgage-Rate-5-Year-Adjustable",
405 + "rate": 0.04
406 + },
407 + "Standard-Mortgage-Rate-4-Year-Fixed": {
408 + "name": "Standard-Mortgage-Rate-4-Year-Fixed",
409 + "rate": 6.19
410 + },
411 + "Standard-Mortgage-Rate-3-Year-Fixed": {
412 + "name": "Standard-Mortgage-Rate-3-Year-Fixed",
413 + "rate": 5.24
414 + },
415 + "GIC-10-Year-Registered": {
416 + "name": "GIC 10 Year",
417 + "rate": 2.35
418 + },
419 + "GIC-7-Year-Registered": {
420 + "name": "GIC 7 Year",
421 + "rate": 2.35
422 + },
423 + "GIC-5-Year-Registered": {
424 + "name": "GIC 5 Year",
425 + "rate": 4
426 + },
427 + "GIC-27-Month-Registered": {
428 + "name": "GIC 27 Month",
429 + "rate": 3.7
430 + },
431 + "GIC-6-Month-Registered": {
432 + "name": "GIC 6 Month",
433 + "rate": 2.75
434 + },
435 + "Business-account": {
436 + "name": "sbb",
437 + "rate": 2.25
438 + },
439 + "Joint-Account-Base-Rate": {
440 + "name": "Joint Account Base Rate ",
441 + "rate": 1
442 + },
443 + "GIC-6-Year-Registered": {
444 + "name": "GIC 6 Year",
445 + "rate": 2.35
446 + },
447 + "Personal-Account-Base-Rate": {
448 + "name": "Personal Account Base Rate ",
449 + "rate": 1
450 + },
451 + "30 Day-Notice-Savings-Account": {
452 + "name": "30 Day Notice Savings Account",
453 + "rate": 2.75
454 + },
455 + "GIC-6-Month": {
456 + "name": "GIC 6 Month",
457 + "rate": 2.75
458 + },
459 + "GIC-27-Month": {
460 + "name": "GIC 27 Month",
461 + "rate": 3.7
462 + },
463 + "GIC-7-Year": {
464 + "name": "GIC 7 Year",
465 + "rate": 2.35
466 + },
467 + "GIC-5-Year": {
468 + "name": "GIC 5 Year",
469 + "rate": 4
470 + },
471 + "GIC-6-Year": {
472 + "name": "GIC 6 Year",
473 + "rate": 2.35
474 + },
475 + "GIC-10-Year": {
476 + "name": "GIC 10 Year",
477 + "rate": 2.35
478 + },
479 + "10 Day-Notice-Savings-Account": {
480 + "name": "10 Day Notice Savings Account",
481 + "rate": 2.35
482 + },
483 + "Joint-Account-Payroll-Account": {
484 + "name": "Joint Account Payroll Account",
485 + "rate": 2.75
486 + },
487 + "Personal-Account-Payroll-Rate": {
488 + "name": "Personal Account Payroll Rate",
489 + "rate": 2.75
490 + },
491 + "Personal-Account-bonus-interest-rate": {
492 + "name": "Personal Account bonus interest rate",
493 + "rate": 1.75
494 + },
495 + "Joint-Account-bonus-interest-rate": {
496 + "name": "Joint Account bonus interest rate",
497 + "rate": 1.75
498 + },
499 + "TFSA-Cash-Savings-Account": {
500 + "name": "TFSA Cash Savings Account",
501 + "rate": 1.5
502 + },
503 + "FHSA-cash-savings-account": {
504 + "name": "FHSA Cash Savings Account",
505 + "rate": 1.5
506 + },
507 + "cannex-annual-1-yr": {
508 + "name": "cannex-annual-1-yr",
509 + "rate": 3.01
510 + },
511 + "cannex-annual-2-yr": {
512 + "name": "cannex-annual-2-yr",
513 + "rate": 3.69
514 + },
515 + "cannex-annual-3-yr": {
516 + "name": "cannex-annual-3-yr",
517 + "rate": 3.96
518 + },
519 + "cannex-annual-4-yr": {
520 + "name": "cannex-annual-4-yr",
521 + "rate": 4.04
522 + },
523 + "cannex-annual-5-yr": {
524 + "name": "cannex-annual-5-yr",
525 + "rate": 4.16
526 + },
527 + "cannex-annual-6-yr": {
528 + "name": "cannex-annual-6-yr",
529 + "rate": 2.25
530 + },
531 + "cannex-annual-7-yr": {
532 + "name": "cannex-annual-7-yr",
533 + "rate": 2.25
534 + },
535 + "cannex-annual-8-yr": {
536 + "name": "cannex-annual-8-yr",
537 + "rate": 2.25
538 + },
539 + "cannex-annual-9-yr": {
540 + "name": "cannex-annual-9-yr",
541 + "rate": 2.25
542 + },
543 + "cannex-annual-10-yr": {
544 + "name": "cannex-annual-10-yr",
545 + "rate": 2.25
546 + },
547 + "cannex-semi-annual-1-yr": {
548 + "name": "cannex-semi-annual-1-yr",
549 + "rate": 2.97
550 + },
551 + "cannex-semi-annual-2-yr": {
552 + "name": "cannex-semi-annual-2-yr",
553 + "rate": 3.65
554 + },
555 + "cannex-semi-annual-3-yr": {
556 + "name": "cannex-semi-annual-3-yr",
557 + "rate": 3.92
558 + },
559 + "cannex-semi-annual-4-yr": {
560 + "name": "cannex-semi-annual-4-yr",
561 + "rate": 4
562 + },
563 + "cannex-semi-annual-5-yr": {
564 + "name": "cannex-semi-annual-5-yr",
565 + "rate": 4.12
566 + },
567 + "cannex-semi-annual-6-yr": {
568 + "name": "cannex-semi-annual-6-yr",
569 + "rate": 2.21
570 + },
571 + "cannex-semi-annual-7-yr": {
572 + "name": "cannex-semi-annual-7-yr",
573 + "rate": 2.21
574 + },
575 + "cannex-semi-annual-8-yr": {
576 + "name": "cannex-semi-annual-8-yr",
577 + "rate": 2.21
578 + },
579 + "cannex-semi-annual-9-yr": {
580 + "name": "cannex-semi-annual-9-yr",
581 + "rate": 2.21
582 + },
583 + "cannex-semi-annual-10-yr": {
584 + "name": "cannex-semi-annual-10-yr",
585 + "rate": 2.21
586 + },
587 + "cannex-quarterly-1-yr": {
588 + "name": "cannex-quarterly-1-yr",
589 + "rate": 2.94
590 + },
591 + "cannex-quarterly-2-yr": {
592 + "name": "cannex-quarterly-2-yr",
593 + "rate": 3.62
594 + },
595 + "cannex-quarterly-3-yr": {
596 + "name": "cannex-quarterly-3-yr",
597 + "rate": 3.89
598 + },
599 + "cannex-quarterly-4-yr": {
600 + "name": "cannex-quarterly-4-yr",
601 + "rate": 3.97
602 + },
603 + "cannex-quarterly-5-yr": {
604 + "name": "cannex-quarterly-5-yr",
605 + "rate": 4.09
606 + },
607 + "cannex-quarterly-6-yr": {
608 + "name": "cannex-quarterly-6-yr",
609 + "rate": 2.18
610 + },
611 + "cannex-quarterly-7-yr": {
612 + "name": "cannex-quarterly-7-yr",
613 + "rate": 2.18
614 + },
615 + "cannex-quarterly-8-yr": {
616 + "name": "cannex-quarterly-8-yr",
617 + "rate": 2.18
618 + },
619 + "cannex-quarterly-9-yr": {
620 + "name": "cannex-quarterly-9-yr",
621 + "rate": 2.18
622 + },
623 + "cannex-quarterly-10-yr": {
624 + "name": "cannex-quarterly-10-yr",
625 + "rate": 2.18
626 + },
627 + "cannex-monthly-1-yr": {
628 + "name": "cannex-monthly-1-yr",
629 + "rate": 2.92
630 + },
631 + "cannex-monthly-2-yr": {
632 + "name": "cannex-monthly-2-yr",
633 + "rate": 3.6
634 + },
635 + "cannex-monthly-3-yr": {
636 + "name": "cannex-monthly-3-yr",
637 + "rate": 3.87
638 + },
639 + "cannex-monthly-4-yr": {
640 + "name": "cannex-monthly-4-yr",
641 + "rate": 3.95
642 + },
643 + "cannex-monthly-5-yr": {
644 + "name": "cannex-monthly-5-yr",
645 + "rate": 4.07
646 + },
647 + "cannex-monthly-6-yr": {
648 + "name": "cannex-monthly-6-yr",
649 + "rate": 2.16
650 + },
651 + "cannex-monthly-7-yr": {
652 + "name": "cannex-monthly-7-yr",
653 + "rate": 2.16
654 + },
655 + "cannex-monthly-8-yr": {
656 + "name": "cannex-monthly-8-yr",
657 + "rate": 2.16
658 + },
659 + "cannex-monthly-9-yr": {
660 + "name": "cannex-monthly-9-yr",
661 + "rate": 2.16
662 + },
663 + "cannex-monthly-10-yr": {
664 + "name": "cannex-monthly-10-yr",
665 + "rate": 2.16
666 + },
667 + "cannex-cacheable": {
668 + "name": "cannex-cacheable",
669 + "rate": 1.5
670 + },
671 + "cannex-ustd-annual-1-yr": {
672 + "name": "cannex-ustd-annual-1-yr",
673 + "rate": 4.1
674 + },
675 + "cannex-ustd-annual-2-yr": {
676 + "name": "cannex-ustd-annual-2-yr",
677 + "rate": 3.95
678 + },
679 + "cannex-ustd-annual-3-yr": {
680 + "name": "cannex-ustd-annual-3-yr",
681 + "rate": 3.95
682 + },
683 + "cannex-ustd-annual-4-yr": {
684 + "name": "cannex-ustd-annual-4-yr",
685 + "rate": 4
686 + },
687 + "cannex-ustd-annual-5-yr": {
688 + "name": "cannex-ustd-annual-5-yr",
689 + "rate": 4.05
690 + },
691 + "cannex-ustd-annual-6-yr": {
692 + "name": "cannex-ustd-annual-6-yr",
693 + "rate": 2.5
694 + },
695 + "cannex-ustd-annual-7-yr": {
696 + "name": "cannex-ustd-annual-7-yr",
697 + "rate": 2.5
698 + },
699 + "cannex-ustd-annual-8-yr": {
700 + "name": "cannex-ustd-annual-8-yr",
701 + "rate": 2.5
702 + },
703 + "cannex-ustd-annual-9-yr": {
704 + "name": "cannex-ustd-annual-9-yr",
705 + "rate": 2.5
706 + },
707 + "cannex-ustd-annual-10-yr": {
708 + "name": "cannex-ustd-annual-10-yr",
709 + "rate": 2.5
710 + },
711 + "cannex-ustd-semi-annual-1-yr": {
712 + "name": "cannex-ustd-semi-annual-1-yr",
713 + "rate": 4.06
714 + },
715 + "cannex-ustd-semi-annual-2-yr": {
716 + "name": "cannex-ustd-semi-annual-2-yr",
717 + "rate": 3.91
718 + },
719 + "cannex-ustd-semi-annual-3-yr": {
720 + "name": "cannex-ustd-semi-annual-3-yr",
721 + "rate": 3.91
722 + },
723 + "cannex-ustd-semi-annual-4-yr": {
724 + "name": "cannex-ustd-semi-annual-4-yr",
725 + "rate": 3.96
726 + },
727 + "cannex-ustd-semi-annual-5-yr": {
728 + "name": "cannex-ustd-semi-annual-5-yr",
729 + "rate": 4.01
730 + },
731 + "cannex-ustd-semi-annual-6-yr": {
732 + "name": "cannex-ustd-semi-annual-6-yr",
733 + "rate": 2.46
734 + },
735 + "cannex-ustd-semi-annual-7-yr": {
736 + "name": "cannex-ustd-semi-annual-7-yr",
737 + "rate": 2.46
738 + },
739 + "cannex-ustd-semi-annual-8-yr": {
740 + "name": "cannex-ustd-semi-annual-8-yr",
741 + "rate": 2.46
742 + },
743 + "cannex-ustd-semi-annual-9-yr": {
744 + "name": "cannex-ustd-semi-annual-9-yr",
745 + "rate": 2.46
746 + },
747 + "cannex-ustd-semi-annual-10-yr": {
748 + "name": "cannex-ustd-semi-annual-10-yr",
749 + "rate": 2.46
750 + },
751 + "cannex-ustd-quarterly-1-yr": {
752 + "name": "cannex-ustd-quarterly-1-yr",
753 + "rate": 4.03
754 + },
755 + "cannex-ustd-quarterly-2-yr": {
756 + "name": "cannex-ustd-quarterly-2-yr",
757 + "rate": 3.88
758 + },
759 + "cannex-ustd-quarterly-3-yr": {
760 + "name": "cannex-ustd-quarterly-3-yr",
761 + "rate": 3.88
762 + },
763 + "cannex-ustd-quarterly-4-yr": {
764 + "name": "cannex-ustd-quarterly-4-yr",
765 + "rate": 3.93
766 + },
767 + "cannex-ustd-quarterly-5-yr": {
768 + "name": "cannex-ustd-quarterly-5-yr",
769 + "rate": 3.98
770 + },
771 + "cannex-ustd-quarterly-6-yr": {
772 + "name": "cannex-ustd-quarterly-6-yr",
773 + "rate": 2.43
774 + },
775 + "cannex-ustd-quarterly-7-yr": {
776 + "name": "cannex-ustd-quarterly-7-yr",
777 + "rate": 2.43
778 + },
779 + "cannex-ustd-quarterly-8-yr": {
780 + "name": "cannex-ustd-quarterly-8-yr",
781 + "rate": 2.43
782 + },
783 + "cannex-ustd-quarterly-9-yr": {
784 + "name": "cannex-ustd-quarterly-9-yr",
785 + "rate": 2.43
786 + },
787 + "cannex-ustd-quarterly-10-yr": {
788 + "name": "cannex-ustd-quarterly-10-yr",
789 + "rate": 2.43
790 + },
791 + "cannex-ustd-monthly-1-yr": {
792 + "name": "cannex-ustd-monthly-1-yr",
793 + "rate": 4.01
794 + },
795 + "cannex-ustd-monthly-2-yr": {
796 + "name": "cannex-ustd-monthly-2-yr",
797 + "rate": 3.86
798 + },
799 + "cannex-ustd-monthly-3-yr": {
800 + "name": "cannex-ustd-monthly-3-yr",
801 + "rate": 3.86
802 + },
803 + "cannex-ustd-monthly-4-yr": {
804 + "name": "cannex-ustd-monthly-4-yr",
805 + "rate": 3.91
806 + },
807 + "cannex-ustd-monthly-5-yr": {
808 + "name": "cannex-ustd-monthly-5-yr",
809 + "rate": 3.96
810 + },
811 + "cannex-ustd-monthly-6-yr": {
812 + "name": "cannex-ustd-monthly-6-yr",
813 + "rate": 2.41
814 + },
815 + "cannex-ustd-monthly-7-yr": {
816 + "name": "cannex-ustd-monthly-7-yr",
817 + "rate": 2.41
818 + },
819 + "cannex-ustd-monthly-8-yr": {
820 + "name": "cannex-ustd-monthly-8-yr",
821 + "rate": 2.41
822 + },
823 + "cannex-ustd-monthly-9-yr": {
824 + "name": "cannex-ustd-monthly-9-yr",
825 + "rate": 2.41
826 + },
827 + "cannex-ustd-monthly-10-yr": {
828 + "name": "cannex-ustd-monthly-10-yr",
829 + "rate": 2.41
830 + },
831 + "cannex-ustd-cacheable": {
832 + "name": "cannex-ustd-cacheable",
833 + "rate": 1.75
834 + },
835 + "cannex-short-term-30-days": {
836 + "name": "cannex-short-term-30-days",
837 + "rate": 0.2
838 + },
839 + "cannex-short-term-60-days": {
840 + "name": "cannex-short-term-60-days",
841 + "rate": 0.8
842 + },
843 + "cannex-short-term-90-days": {
844 + "name": "cannex-short-term-90-days",
845 + "rate": 2.15
846 + },
847 + "cannex-short-term-120-days": {
848 + "name": "cannex-short-term-120-days",
849 + "rate": 2.2
850 + },
851 + "cannex-short-term-180-days": {
852 + "name": "cannex-short-term-180-days",
853 + "rate": 2.7
854 + },
855 + "cannex-short-term-270-days": {
856 + "name": "cannex-short-term-270-days",
857 + "rate": 2.8
858 + },
859 + "cannex-ustd-short-term-30-days": {
860 + "name": "cannex-ustd-short-term-30-days",
861 + "rate": 0.05
862 + },
863 + "cannex-ustd-short-term-60-days": {
864 + "name": "cannex-ustd-short-term-60-days",
865 + "rate": 1
866 + },
867 + "cannex-ustd-short-term-90-days": {
868 + "name": "cannex-ustd-short-term-90-days",
869 + "rate": 2.95
870 + },
871 + "cannex-ustd-short-term-120-days": {
872 + "name": "cannex-ustd-short-term-120-days",
873 + "rate": 3
874 + },
875 + "cannex-ustd-short-term-180-days": {
876 + "name": "cannex-ustd-short-term-180-days",
877 + "rate": 3.15
878 + },
879 + "cannex-ustd-short-term-270-days": {
880 + "name": "cannex-ustd-short-term-270-days",
881 + "rate": 3.3
882 + }
883 +}
\ No newline at end of file
added tests/fixtures/mortgage/first-national.html +1654 −0
@@ -0,0 +1,1654 @@
1 + <!DOCTYPE html> <html prefix="og: http://ogp.me/ns#" lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="format-detection" content="telephone=no"> <title>
2 + Mortgage rates - gain insight into costs at each stage of your mortgage
3 +</title> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
4 + new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
5 + j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6 + 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
7 + })(window,document,'script','dataLayer','GTM-NKTBZWG');</script> <!-- End Google Tag Manager --> <link href="https://cloud.typography.com/7553114/7403352/css/fonts.css" rel="stylesheet" type="text/css" /><link href="/ResourcePackages/FirstNationalBootstrap/assets/dist/css/styles.min.css?v=639227790237590839" rel="stylesheet" type="text/css" /> <meta property="og:title" content="Mortgage rates - gain insight into costs at each stage of your mortgage" /><meta property="og:description" content="First National’s rates for qualified residential mortgages." /><meta property="og:url" content="https://www.firstnational.ca/residential/mortgage-rates" /><meta property="og:type" content="website" /><meta property="og:site_name" content="Default" /><style type="text/css" media="all">.cookie-message {
8 + padding: 15px;
9 + background-color: #036936;
10 + color: #ffffff;
11 + margin-bottom: 5px;
12 + font-size: 14px;
13 + display: none;
14 + width: 100%;
15 +}
16 +
17 +.cookie-message a, .cookie-message a:hover, .cookie-message a:focus { color: #fff; text-decoration: underline; transition: 0.25s opacity ease-in; } .cookie-message a:hover, .cookie-message a:focus { opacity: 0.75; } .cookie-message .cookie-close-button { background-color: #eee; border-color: #eee; color: #036936; text-decoration: none; } .cookie-message .cookie-close-button:hover, .cookie-message .cookie-close-button:focus { text-decoration: none; color: #036936; } .covid-19-message { height: 0; overflow: hidden; transition: 0.2s height ease; } .covid-19-message.js-enable { height: auto; padding: 15px 0px 10px; } .covid-19-message.js-minimized .content-wrapper { display: none; } .covid-19-message .covid19-expand-button, .covid-19-message.js-minimized .content-wrapper, .covid-19-message.js-minimized .covid19-close-button { display: none; } .covid-19-message .covid19-close-button, .covid-19-message.js-minimized .covid19-expand-button { display: inline-block; } .covid19-expand-button { padding-left: 1rem; padding-right: 1rem; margin-top: 0; font-size: 12px; color: #fff !important; text-decoration: none; } .covid19-expand-button:hover, .covid19-expand-button:focus { opacity: 0.75; } .covid-19-message.js-minimized h4, .covid-19-message.js-minimized .content-wrapper + p { margin: 0; } .covid-19-message.js-minimized h4 { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } @media (max-width: 767px) { .covid-19-message.js-minimized h4 { font-size: 1.25rem; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .covid-19-message.js-minimized h4 > .inner-wrapper { width: 100%; } .covid-19-message.js-minimized .covid19-expand-button { margin-top: 1rem; text-align: center; font-size: 9px; } }.v-commercialcontent__body, .v-commercialcontent__header { grid-template-columns: repeat(auto-fill,minmax(25rem,1fr));}</style><style type="text/css" media="all">@media screen and (min-width: 1200px) {
18 + html[lang="fr"] .c-menu-primary__link {
19 + font-size: 1.8rem;
20 + }
21 +}
22 +
23 +.o-button--link:hover {
24 + background-color: transparent;
25 + color: #363636;
26 + opacity: .8;
27 +}
28 +.col-sm-auto {
29 + width: auto;
30 +}
31 +.o-button--secondary:hover {
32 + background-color: transparent;
33 + color: #f6be1b;
34 +}
35 +.flex-basis-auto {
36 + flex-basis: auto;
37 +}
38 +.l-region--bg-our-business {
39 + background: #F4F4F4 url('/images/default-source/brand/about-us-16-9/skyline-green.png') center/cover no-repeat;
40 +}</style><style type="text/css" media="all">@media screen and (min-width: 768px) {
41 + /*.nav__primary {
42 + display: none;
43 + }
44 + .nav__primary--rmn {
45 + display: block;
46 + }*/
47 +}
48 +@media screen and (max-width: 767px) {
49 +}
50 +.col-content-block-h-100 > .content-block,
51 +.col-content-block-h-100 > .content-block > div {
52 + height: 100%;
53 +}
54 +
55 +.col-content-block-h-100-flex > .content-block > div {
56 + display: -webkit-box;
57 + display: -ms-flexbox;
58 + display: flex;
59 + -webkit-box-orient: vertical;
60 + -webkit-box-direction: normal;
61 + -ms-flex-direction: column;
62 + flex-direction: column;
63 +}
64 +.card-video--alt .card-video__play {
65 + margin-left: auto;
66 +}
67 +.l-region--soft-gray-keyline {
68 + border-top: solid 2px $F6BE1B;
69 + background-color: #f4f4f4;
70 +}
71 +
72 +.l-region--soft-gray-whiteline {
73 + border-top: solid 2px #fff;
74 + background-color: #f4f4f4;
75 +}
76 +.card-video--alt.card-video--alt-no-caption > a {
77 + -webkit-box-orient: horizontal;
78 +-webkit-box-direction: normal;
79 + -ms-flex-direction: row;
80 + flex-direction: row;
81 + -ms-flex-wrap: wrap;
82 + flex-wrap: wrap;
83 +}
84 +.card-video--alt.card-video--alt-no-caption .card-video__thumbnail {
85 + margin-bottom: 0;
86 +}
87 +.card-video--alt.card-video--alt-no-caption .card-video__ctrl {
88 + width: auto;
89 + margin-top: auto;
90 + margin-left: auto;
91 +}
92 +
93 +@media screen and (min-width: 768px) {
94 + .form-horizontal .control-label {
95 + text-align: left;
96 + }
97 +}
98 +
99 +@media screen and (max-width: 767px) {
100 + .card-video--alt.card-video--alt-no-caption .card-video__thumbnail {
101 + width: 80% !important;
102 + margin-bottom: 0;
103 + }
104 + .card-video--alt.card-video--alt-no-caption .card-video__play {
105 + margin-left: 0;
106 + }
107 +}
108 +
109 +.o-button > button[type="submit"],
110 +.o-button > .btn-primary:active,
111 +.o-button > .btn-primary:active:focus {
112 + background-color: inherit;
113 + text-transform: uppercase;
114 + color: inherit;
115 + border: none;
116 + width: inherit;
117 + height: inherit;
118 +}
119 +
120 +.nav__quickie li+li {
121 + border-top: 1px solid #d9d9d9;
122 +}
123 +.o-button--secondary {
124 + background-color: transparent;
125 +}
126 +.o-button--secondary:hover {
127 + color: #F6BE1B;
128 +}
129 +
130 +.css-select {
131 + border-radius: 3px;
132 + -moz-appearance: none;
133 + -webkit-appearance: none;
134 + appearance: none;
135 + background-color: #fff;
136 +background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjkyLjQgMjkyLjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI5Mi40IDI5Mi40OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGw6IzU1NTU1NTt9PC9zdHlsZT48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjg3LDY5LjRjLTMuNC0zLjUtOC4xLTUuNS0xMy01LjRIMTguNGMtNSwwLTkuMywxLjgtMTIuOSw1LjRDMiw3Mi43LDAsNzcuNCwwLDgyLjJjMCw1LDEuOCw5LjMsNS40LDEyLjlsMTI4LDEyNy45YzMuNiwzLjYsNy44LDUuNCwxMi44LDUuNHM5LjItMS44LDEyLjgtNS40TDI4Nyw5NWMzLjUtMy41LDUuNC03LjgsNS40LTEyLjhzLTEuOS05LjItNS41LTEyLjhMMjg3LDY5LjR6Ii8+PC9zdmc+');
137 + background-repeat: no-repeat, repeat;
138 + /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/
139 + background-position: right .7em top 50%, 0 0;
140 + /* icon size, then gradient */
141 + background-size: .65em auto, 100%;
142 +}
143 +
144 +/* IE 11 rules */
145 +@media all and (-ms-high-contrast:none) {
146 + *::-ms-backdrop, .img-responsive {
147 + width: 100%;
148 + }
149 + *::-ms-backdrop, .o-button > button[type="submit"],
150 + *::-ms-backdrop, .o-button > .btn-primary:active,
151 + *::-ms-backdrop, .o-button > .btn-primary:active:focus {
152 + background-color: #f6be1b;
153 + }
154 + *::-ms-backdrop, .card-video--alt .card-video__thumbnail {
155 + height: 100%;
156 + }
157 +}
158 +
159 +.l-region--white {
160 + background: #ffffff;
161 +}
162 +
163 +h1.o-text-h1+h2.o-text-h2 {
164 + line-height: 1.5em;
165 +}
166 +
167 +.l-region--soft-green-keyline {
168 + background-color: rgba(239, 245, 241);
169 +}
170 +
171 +.media-left {
172 + padding-right: 20px;
173 +}</style><meta name="Generator" content="Sitefinity 15.4.8630.0 DX" /><link rel="canonical" href="https://www.firstnational.ca/residential/mortgage-rates" /><meta name="description" content="First National’s rates for qualified residential mortgages." /></head> <body> <!-- Google Tag Manager (noscript) --> <noscript> <iframe sandbox src="https://www.googletagmanager.com/ns.html?id=GTM-NKTBZWG"
174 + height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <!-- End Google Tag Manager (noscript) --> <script src="/ScriptResource.axd?d=6DQe8ARl7A9TiuWej5ttCvuAePl8522bEkBxB9yeiRF0EdTrCZ9vqHPu4WE4TE1hTN6WeE1DyQO1UMqES1b4oOOvWqFN7H1eDCCsy3yrDilFJcaUvQrYvnG2k0iBlxiRg2kX-fUR_52TH7S1-8vf3l8Y7nJFZEE_uXcskpF0HqJzDomH0&amp;t=ffffffff8869f732" type="text/javascript"></script><script src="/ScriptResource.axd?d=74FHISOx3fOPKwLxL0RMYg9_zSeppcSSreCteN8HMxjAEmkb6bfrZPeqVUHco7qzLH31T0uhAiCLkjihq9Xw989fay3HHhXZNmY8pzaX4VZL9dQBGsB9tlVAznc3dzwCC2DO8g2qGLODP30q1sNR4skfLnqRcdqkVDWpY79fqU88W1H00&amp;t=ffffffff8869f732" type="text/javascript"></script> <div class="region__page"> <div class="l-region-notification"> <div class="container">
175 +
176 +
177 + </div> </div> <header class="l-region-header">
178 +<div id="Header_T240A2D21018_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row" data-sf-element="Row">
179 + <div id="Header_T240A2D21019_Col00" class="sf_colsIn col-sm-4 col-xs-6" data-sf-element="Column 1" data-placeholder-label="Column 1">
180 +<div class="content-block" >
181 + <div ><a href="/home"><img src="/images/default-source/brand/global/first-national-logo-color1655feae-7538-4ce4-ada0-a924d05951b2.svg?sfvrsn=a8ed488b_2" width="215" alt="First National Financial LP®" title="First National Financial LP®" sf-image-responsive="false" sf-size="8290" class="img-responsive" /></a></div>
182 +</div>
183 +
184 + </div>
185 + <div id="Header_T240A2D21019_Col01" class="sf_colsIn col-sm-8 col-xs-6" data-sf-element="Column 2" data-placeholder-label="Column 2"><div id="Header_T240A2D21037_Col00" class="sf_colsIn nav-utility justify-end" data-sf-element="Region" data-placeholder-label="Region">
186 +<div class="nav-lang">
187 + <ul class="sf-lang-selector list-inline">
188 + <li>
189 + <a href="#" onclick="openLink('fr'); return false;" class="">
190 + <span class="xs-hide sm-hide md-block">fran&#231;ais</span>
191 + <span class="md-hide" title="fran&#231;ais">fr</span>
192 + </a>
193 + </li>
194 + </ul>
195 +</div>
196 +
197 +
198 +
199 +
200 +
201 +
202 +
203 +
204 +<ul class="list-unstyled nav-utility__item xs-hide">
205 +
206 + <li class=""><a href="/contact-us" target="_self">Contact us</a></li>
207 +</ul>
208 +
209 +
210 +
211 +
212 +
213 +
214 +
215 +<div class="nav-utility__item">
216 +<button aria-expanded="false" aria-haspopup="true" class="btn-link" data-target="#dropdown_search" data-toggle="dropdown" id="toggleSearch" type="button">
217 + <span class="sr-only">Toggle search</span>
218 + <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
219 +<path d="M17.71 16.29L14.31 12.9C15.407 11.5025 16.0022 9.77666 16 8C16 6.41775 15.5308 4.87103 14.6518 3.55544C13.7727 2.23985 12.5233 1.21447 11.0615 0.608967C9.59966 0.00346625 7.99113 -0.15496 6.43928 0.153721C4.88743 0.462403 3.46197 1.22433 2.34315 2.34315C1.22433 3.46197 0.462403 4.88743 0.153721 6.43928C-0.15496 7.99113 0.00346625 9.59966 0.608967 11.0615C1.21447 12.5233 2.23985 13.7727 3.55544 14.6518C4.87103 15.5308 6.41775 16 8 16C9.77666 16.0022 11.5025 15.407 12.9 14.31L16.29 17.71C16.383 17.8037 16.4936 17.8781 16.6154 17.9289C16.7373 17.9797 16.868 18.0058 17 18.0058C17.132 18.0058 17.2627 17.9797 17.3846 17.9289C17.5064 17.8781 17.617 17.8037 17.71 17.71C17.8037 17.617 17.8781 17.5064 17.9289 17.3846C17.9797 17.2627 18.0058 17.132 18.0058 17C18.0058 16.868 17.9797 16.7373 17.9289 16.6154C17.8781 16.4936 17.8037 16.383 17.71 16.29ZM2 8C2 6.81332 2.3519 5.65328 3.01119 4.66658C3.67047 3.67989 4.60755 2.91085 5.7039 2.45673C6.80026 2.0026 8.00666 1.88378 9.17055 2.11529C10.3344 2.3468 11.4035 2.91825 12.2426 3.75736C13.0818 4.59648 13.6532 5.66558 13.8847 6.82946C14.1162 7.99335 13.9974 9.19975 13.5433 10.2961C13.0892 11.3925 12.3201 12.3295 11.3334 12.9888C10.3467 13.6481 9.18669 14 8 14C6.4087 14 4.88258 13.3679 3.75736 12.2426C2.63214 11.1174 2 9.5913 2 8Z" fill="#7D7D7D" />
220 +</svg>
221 + </button>
222 +</div>
223 +<div class="region__search" id="dropdown_search">
224 +<form action="/residential/mortgage-rates/search" method="POST" name="GoogleSearchController"> <label class="sr-only" for="s">Enter search terms</label>
225 + <input class="form-control" id="s" name="s" type="search" placeholder="Enter search terms&hellip;" value="" />
226 + <input class="sr-only" type="submit" value="Search">
227 + <button class="btn btn-icon btn-link" type="button">
228 + X
229 + </button>
230 +</form></div>
231 +
232 +<div class="nav-utility__item nav-utility__item--nohr xs-order-1">
233 + <button
234 + aria-expanded="false"
235 + aria-haspopup="true"
236 + data-target="#dropdown_login"
237 + data-toggle="dropdown"
238 + id="toggleLogin"
239 + class="nav-utility__login"
240 + type="button"
241 + >
242 + Login
243 + </button>
244 +
245 + <div class="dropdown-login" id="dropdown_login">
246 + <a
247 + href="https://mymortgage.firstnational.ca/?LanguageCode=en-CA"
248 + target="_blank"
249 + rel="noopener noreferrer">
250 + <img src="https://www.firstnational.ca/images/default-source/brand/global/home-yellow.svg?sfvrsn=da59728b_2" alt=""/>
251 + <span class="color-primary o-text-h6" style="display: block;">My Mortgage Login</span><span class="o-text-bodysmall" style="display: block; margin-top: 5px;">For residential mortgage holders</span></a
252 + >
253 +
254 + <a
255 + href="https://merlinonline.firstnational.ca/Account/LogOn?ReturnUrl=%2flogon.aspx%3fLanguageCode%3den-CA&amp;LanguageCode=en-CA"
256 + target="_blank"
257 + rel="noopener noreferrer">
258 + <img width="34" src="https://www.firstnational.ca/images/default-source/brand/global/merlin.png?sfvrsn=e659728b_2" alt=""/>
259 + <span class="color-primary o-text-h6" style="display: block">MERLIN Login</span><span class="o-text-bodysmall" style="display: block; margin-top: 5px;">For residential mortgage brokers</span></a
260 + >
261 + </div>
262 +</div>
263 +
264 +<div class="nav-utility__item nav-utility__item--nohr xs-block sm-hide">
265 + <button aria-expanded="false" aria-haspopup="true" class="nav-utility__mobile-menu" data-target="#Header_T240A2D21021_Col00" data-toggle="dropdown" id="togglePrimaryNav" type="button">
266 + <span class="sr-only">Toggle navigation</span>
267 + <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px">
268 + <path d="M0 0h24v24H0z" fill="none" />
269 + <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" />
270 + </svg>
271 + <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px">
272 + <path d="M0 0h24v24H0V0z" fill="none"/>
273 + <path d="M3 18h13v-2H3v2zm0-5h10v-2H3v2zm0-7v2h13V6H3zm18 9.59L17.42 12 21 8.41 19.59 7l-5 5 5 5L21 15.59z"/>
274 + </svg>
275 + </button>
276 +</div>
277 +</div>
278 +
279 + </div>
280 +</div>
281 +
282 +</div>
283 +<div id="Header_T240A2D21020_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row" data-sf-element="Row">
284 + <div id="Header_T240A2D21021_Col00" class="sf_colsIn col-xs-12 c-wrapper-menu-primary" data-sf-element="Column 1" data-placeholder-label="Column 1">
285 +
286 +<nav class="c-menu-primary spacing-40 xs-spacing-30" aria-label="Primary navigation">
287 +
288 +
289 + <ul class="c-menu-primary__list list-unstyled">
290 + <li class="c-menu-primary__item ">
291 + <a class="c-menu-primary__link" href="/commercial">
292 + Commercial Mortgages
293 + </a>
294 +
295 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-0">
296 + <span class="sr-only">Toggle sub-menu for Commercial Mortgages</span>
297 + </button>
298 +
299 + <div class="c-menu-primary__dropdown">
300 + <div class="container">
301 + <div class="row">
302 + <div class="col-xs-12">
303 + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-0">
304 + <li>
305 + <a href="/commercial/first-national-difference" target="_self" aria-label="">
306 + First National difference
307 + </a>
308 +
309 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-0-0">
310 + <span class="sr-only">Toggle sub-menu for First National difference</span>
311 + </button>
312 +
313 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-0-0">
314 + <li class="">
315 + <a href="/commercial/first-national-difference/working-with-us" target="_self" aria-label="">
316 + Working with us
317 + </a>
318 + </li>
319 +
320 + </ul>
321 + </li>
322 + <li class="">
323 + <a href="/commercial/our-team" target="_self" aria-label="Commercial mortgages: Our team">
324 + Our team
325 + </a>
326 + </li>
327 + <li>
328 + <a href="/commercial/resources-insights" target="_self" aria-label="">
329 + Resources and insights
330 + </a>
331 +
332 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-2-0">
333 + <span class="sr-only">Toggle sub-menu for Resources and insights</span>
334 + </button>
335 +
336 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-2-0">
337 + <li class="">
338 + <a href="/commercial/resources-insights/capital-markets-update" target="_self" aria-label="">
339 + Capital Markets update
340 + </a>
341 + </li>
342 + <li class="">
343 + <a href="/commercial/resources-insights/economic-insights" target="_self" aria-label="">
344 + Economic insights
345 + </a>
346 + </li>
347 + <li class="">
348 + <a href="/commercial/resources-insights/expert-perspectives" target="_self" aria-label="">
349 + Expert perspectives
350 + </a>
351 + </li>
352 + <li class="">
353 + <a href="/commercial/resources-insights/project-spotlight" target="_self" aria-label="">
354 + Project spotlight
355 + </a>
356 + </li>
357 +
358 + </ul>
359 + </li>
360 + <li>
361 + <a href="/commercial/mortgage-solutions" target="_self" aria-label="">
362 + Mortgage solutions
363 + </a>
364 +
365 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-3-0">
366 + <span class="sr-only">Toggle sub-menu for Mortgage solutions</span>
367 + </button>
368 +
369 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-3-0">
370 + <li class="">
371 + <a href="/commercial/mortgage-solutions/retail" target="_self" aria-label="">
372 + Retail
373 + </a>
374 + </li>
375 + <li class="">
376 + <a href="/commercial/mortgage-solutions/multi-family" target="_self" aria-label="">
377 + Multi-family residential
378 + </a>
379 + </li>
380 + <li class="">
381 + <a href="/commercial/mortgage-solutions/office" target="_self" aria-label="">
382 + Office
383 + </a>
384 + </li>
385 + <li class="">
386 + <a href="/commercial/mortgage-solutions/industrial" target="_self" aria-label="">
387 + Industrial
388 + </a>
389 + </li>
390 + <li class="">
391 + <a href="/commercial/mortgage-solutions/storage" target="_self" aria-label="">
392 + Storage
393 + </a>
394 + </li>
395 + <li class="">
396 + <a href="/commercial/mortgage-solutions/student-housing" target="_self" aria-label="">
397 + Student housing
398 + </a>
399 + </li>
400 + <li class="">
401 + <a href="/commercial/mortgage-solutions/mixed-use" target="_self" aria-label="">
402 + Mixed-use
403 + </a>
404 + </li>
405 + <li class="">
406 + <a href="/commercial/mortgage-solutions/land" target="_self" aria-label="">
407 + Land
408 + </a>
409 + </li>
410 +
411 + </ul>
412 + </li>
413 + <li>
414 + <a href="/commercial/commercial-asset-management" target="_self" aria-label="">
415 + Commercial Asset Management
416 + </a>
417 +
418 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-0">
419 + <span class="sr-only">Toggle sub-menu for Commercial Asset Management</span>
420 + </button>
421 +
422 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-0">
423 + <li class="">
424 + <a href="/commercial/commercial-asset-management/financial-requirements" target="_self" aria-label="">
425 + Financial requirements
426 + </a>
427 + </li>
428 + <li class="">
429 + <a href="/commercial/commercial-asset-management/undertaking" target="_self" aria-label="">
430 + Undertaking
431 + </a>
432 + </li>
433 + <li class="">
434 + <a href="/commercial/commercial-asset-management/insurance-requirements" target="_self" aria-label="">
435 + Insurance requirements
436 + </a>
437 + </li>
438 + <li class="">
439 + <a href="/commercial/commercial-asset-management/property-tax" target="_self" aria-label="">
440 + Property tax
441 + </a>
442 + </li>
443 + <li class="">
444 + <a href="/commercial/commercial-asset-management/mortgage-information" target="_self" aria-label="">
445 + Mortgage information
446 + </a>
447 + </li>
448 + <li class="">
449 + <a href="/commercial/commercial-asset-management/annual-compliance-forms" target="_self" aria-label="">
450 + Annual Compliance Forms
451 + </a>
452 + </li>
453 + <li class="">
454 + <a href="/commercial/commercial-asset-management/rental-rate-increase" target="_self" aria-label="">
455 + Rental Rate Increase
456 + </a>
457 + </li>
458 +
459 + </ul>
460 + </li>
461 + <li class="">
462 + <a href="/commercial/bond-yields" target="_self" aria-label="">
463 + Bond yields
464 + </a>
465 + </li>
466 + <li class="">
467 + <a href="/commercial/recent-financings" target="_self" aria-label="">
468 + Recent Financings
469 + </a>
470 + </li>
471 +
472 + </ul>
473 + </div>
474 + </div>
475 + </div>
476 + </div>
477 +
478 + </li>
479 + <li class="c-menu-primary__item active">
480 + <a class="c-menu-primary__link" href="/residential">
481 + Residential Mortgages
482 + </a>
483 +
484 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-1">
485 + <span class="sr-only">Toggle sub-menu for Residential Mortgages</span>
486 + </button>
487 +
488 + <div class="c-menu-primary__dropdown">
489 + <div class="container">
490 + <div class="row">
491 + <div class="col-xs-12">
492 + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-1">
493 + <li>
494 + <a href="/residential/about" target="_self" aria-label="">
495 + About Us
496 + </a>
497 +
498 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-0-1">
499 + <span class="sr-only">Toggle sub-menu for About Us</span>
500 + </button>
501 +
502 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-0-1">
503 + <li class="">
504 + <a href="/residential/about/first-national-difference" target="_self" aria-label="">
505 + First National difference
506 + </a>
507 + </li>
508 + <li class="">
509 + <a href="/residential/about/working-with-a-mortgage-broker" target="_self" aria-label="">
510 + Working with a mortgage broker
511 + </a>
512 + </li>
513 +
514 + </ul>
515 + </li>
516 + <li>
517 + <a href="/residential/for-home-buyers" target="_self" aria-label="">
518 + For home buyers
519 + </a>
520 +
521 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-1-1">
522 + <span class="sr-only">Toggle sub-menu for For home buyers</span>
523 + </button>
524 +
525 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-1-1">
526 + <li class="">
527 + <a href="/residential/for-home-buyers/buying-your-first-home" target="_self" aria-label="">
528 + Buying your first home
529 + </a>
530 + </li>
531 + <li class="">
532 + <a href="/residential/for-home-buyers/buying-your-next-home" target="_self" aria-label="">
533 + Buying your next home
534 + </a>
535 + </li>
536 + <li class="">
537 + <a href="/residential/for-home-buyers/moving-your-mortgage-to-first-national" target="_self" aria-label="">
538 + Moving your mortgage to First National
539 + </a>
540 + </li>
541 +
542 + </ul>
543 + </li>
544 + <li>
545 + <a href="/residential/for-customers" target="_self" aria-label="">
546 + For customers
547 + </a>
548 +
549 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-2-1">
550 + <span class="sr-only">Toggle sub-menu for For customers</span>
551 + </button>
552 +
553 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-2-1">
554 + <li class="">
555 + <a href="/residential/for-customers/new-to-first-national" target="_self" aria-label="">
556 + New to First National
557 + </a>
558 + </li>
559 + <li class="">
560 + <a href="/residential/for-customers/managing-your-mortgage" target="_self" aria-label="">
561 + Managing Your Mortgage
562 + </a>
563 + </li>
564 + <li class="">
565 + <a href="/residential/for-customers/renewing-your-mortgage" target="_self" aria-label="">
566 + Renewing your mortgage
567 + </a>
568 + </li>
569 + <li class="">
570 + <a href="/residential/for-customers/refinancing-your-mortgage" target="_self" aria-label="">
571 + Refinancing your mortgage
572 + </a>
573 + </li>
574 + <li class="">
575 + <a href="/residential/for-customers/mortgage-videos" target="_self" aria-label="">
576 + Mortgage videos
577 + </a>
578 + </li>
579 +
580 + </ul>
581 + </li>
582 + <li class="">
583 + <a href="/residential/my-mortgage" target="_self" aria-label="">
584 + My Mortgage® by First National
585 + </a>
586 + </li>
587 + <li>
588 + <a href="/residential/mortgage-calculators" target="_self" aria-label="">
589 + Mortgage calculators
590 + </a>
591 +
592 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-1">
593 + <span class="sr-only">Toggle sub-menu for Mortgage calculators</span>
594 + </button>
595 +
596 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-1">
597 + <li class="">
598 + <a href="/residential/mortgage-calculators/how-much-can-i-afford" target="_self" aria-label="">
599 + How much can I afford?
600 + </a>
601 + </li>
602 + <li class="">
603 + <a href="/residential/mortgage-calculators/mortgage-payment-calculator" target="_self" aria-label="">
604 + Mortgage payment calculator
605 + </a>
606 + </li>
607 + <li class="">
608 + <a href="/residential/mortgage-calculators/prepayment-calculator" target="_self" aria-label="">
609 + Prepayment calculator
610 + </a>
611 + </li>
612 + <li class="">
613 + <a href="/residential/mortgage-calculators/calculate-prepayment-charges" target="_self" aria-label="">
614 + Calculate prepayment charges
615 + </a>
616 + </li>
617 +
618 + </ul>
619 + </li>
620 + <li>
621 + <a href="/residential/mortgage-rates" target="_self" aria-label="Residential Mortgages: Mortgage rates">
622 + Mortgage rates
623 + </a>
624 +
625 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-5-1">
626 + <span class="sr-only">Toggle sub-menu for Mortgage rates</span>
627 + </button>
628 +
629 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-5-1">
630 + <li class="">
631 + <a href="/residential/mortgage-rates/prime-rates" target="_self" aria-label="Residential Mortgages: Prime rates">
632 + Prime rates
633 + </a>
634 + </li>
635 + <li class="">
636 + <a href="/residential/mortgage-rates/excalibur-rates" target="_self" aria-label="Residential Mortgages: Excalibur rates">
637 + Excalibur rates
638 + </a>
639 + </li>
640 +
641 + </ul>
642 + </li>
643 + <li>
644 + <a href="/residential/mortgage-resources" target="_self" aria-label="">
645 + Mortgage resources
646 + </a>
647 +
648 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-6-1">
649 + <span class="sr-only">Toggle sub-menu for Mortgage resources</span>
650 + </button>
651 +
652 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-6-1">
653 + <li class="">
654 + <a href="/residential/mortgage-resources/fraud-prevention" target="_self" aria-label="">
655 + Fraud prevention
656 + </a>
657 + </li>
658 + <li class="">
659 + <a href="/residential/mortgage-resources/glossary-of-terms" target="_self" aria-label="">
660 + Glossary of terms
661 + </a>
662 + </li>
663 +
664 + </ul>
665 + </li>
666 + <li>
667 + <a href="/residential/home-warranty-and-mortgage-insurance" target="_self" aria-label="">
668 + Home Warranty and Mortgage Insurance
669 + </a>
670 +
671 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-7-1">
672 + <span class="sr-only">Toggle sub-menu for Home Warranty and Mortgage Insurance</span>
673 + </button>
674 +
675 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-7-1">
676 + <li class="">
677 + <a href="/residential/home-warranty-and-mortgage-insurance/echelon--home-system-warranty-program" target="_self" aria-label="">
678 + Echelon- Home System Warranty Program
679 + </a>
680 + </li>
681 + <li class="">
682 + <a href="/residential/home-warranty-and-mortgage-insurance/credit-security-plan---mortgage-life-and-disability-insurance" target="_self" aria-label="">
683 + Credit Security Plan - Mortgage Life and Disability Insurance
684 + </a>
685 + </li>
686 +
687 + </ul>
688 + </li>
689 + <li class="">
690 + <a href="/residential/solicitor-documents" target="_self" aria-label="">
691 + Solicitor Documents
692 + </a>
693 + </li>
694 + <li class="">
695 + <a href="/residential/home-equity-secured-mastercard" target="_self" aria-label="">
696 + Home Equity Secured Mastercard
697 + </a>
698 + </li>
699 +
700 + </ul>
701 + </div>
702 + </div>
703 + </div>
704 + </div>
705 +
706 + </li>
707 + <li class="c-menu-primary__item ">
708 + <a class="c-menu-primary__link" href="/mortgage-brokers">
709 + Mortgage Brokers
710 + </a>
711 +
712 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-2">
713 + <span class="sr-only">Toggle sub-menu for Mortgage Brokers</span>
714 + </button>
715 +
716 + <div class="c-menu-primary__dropdown">
717 + <div class="container">
718 + <div class="row">
719 + <div class="col-xs-12">
720 + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-2">
721 + <li class="">
722 + <a href="/mortgage-brokers/first-national-difference" target="_self" aria-label="">
723 + First National difference
724 + </a>
725 + </li>
726 + <li class="">
727 + <a href="/mortgage-brokers/our-team" target="_self" aria-label="Mortgage brokers: Our team">
728 + Our team
729 + </a>
730 + </li>
731 + <li>
732 + <a href="/mortgage-brokers/mortgage-solutions" target="_self" aria-label="">
733 + Mortgage solutions
734 + </a>
735 +
736 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-2-2">
737 + <span class="sr-only">Toggle sub-menu for Mortgage solutions</span>
738 + </button>
739 +
740 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-2-2">
741 + <li class="">
742 + <a href="/mortgage-brokers/mortgage-solutions/transferring-a-mortgage" target="_self" aria-label="">
743 + Transferring a mortgage
744 + </a>
745 + </li>
746 + <li class="">
747 + <a href="/mortgage-brokers/mortgage-solutions/home-improvements" target="_self" aria-label="">
748 + Home improvements
749 + </a>
750 + </li>
751 + <li class="">
752 + <a href="/mortgage-brokers/mortgage-solutions/self-employed-and-contract-home-buyers" target="_self" aria-label="">
753 + Self-employed and contract home buyers
754 + </a>
755 + </li>
756 + <li class="">
757 + <a href="/mortgage-brokers/mortgage-solutions/buying-a-rental-or-investment-property" target="_self" aria-label="">
758 + Buying a rental or investment property
759 + </a>
760 + </li>
761 + <li class="">
762 + <a href="/mortgage-brokers/mortgage-solutions/home-warranty-and-mortgage-life-insurance" target="_self" aria-label="">
763 + Home Warranty and Mortgage Life Insurance
764 + </a>
765 + </li>
766 + <li class="">
767 + <a href="/mortgage-brokers/mortgage-solutions/accessing-alternative-mortgage-options-(excalibur)" target="_self" aria-label="">
768 + Accessing alternative mortgage options (Excalibur)
769 + </a>
770 + </li>
771 +
772 + </ul>
773 + </li>
774 + <li>
775 + <a href="/mortgage-brokers/broker-registration" target="_self" aria-label="">
776 + Broker registration
777 + </a>
778 +
779 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-3-2">
780 + <span class="sr-only">Toggle sub-menu for Broker registration</span>
781 + </button>
782 +
783 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-3-2">
784 + <li class="">
785 + <a href="/mortgage-brokers/broker-registration/agent-registration" target="_blank" aria-label="">
786 + Agent registration
787 + </a>
788 + </li>
789 +
790 + </ul>
791 + </li>
792 + <li>
793 + <a href="/mortgage-brokers/resources-for-mortgage-brokers" target="_self" aria-label="">
794 + Resources for Mortgage Brokers
795 + </a>
796 +
797 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-2">
798 + <span class="sr-only">Toggle sub-menu for Resources for Mortgage Brokers</span>
799 + </button>
800 +
801 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-2">
802 + <li class="">
803 + <a href="/mortgage-brokers/resources-for-mortgage-brokers/be-the-expert" target="_self" aria-label="">
804 + Be the expert
805 + </a>
806 + </li>
807 + <li class="">
808 + <a href="/mortgage-brokers/resources-for-mortgage-brokers/own-the-moment" target="_self" aria-label="">
809 + Own the moment
810 + </a>
811 + </li>
812 + <li class="">
813 + <a href="/mortgage-brokers/resources-for-mortgage-brokers/assist-your-clients" target="_self" aria-label="">
814 + Assist your clients
815 + </a>
816 + </li>
817 +
818 + </ul>
819 + </li>
820 + <li>
821 + <a href="/mortgage-brokers/mortgage-rates" target="_self" aria-label="Mortgage Brokers: Mortgage rates">
822 + Mortgage rates
823 + </a>
824 +
825 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-5-2">
826 + <span class="sr-only">Toggle sub-menu for Mortgage rates</span>
827 + </button>
828 +
829 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-5-2">
830 + <li class="">
831 + <a href="/mortgage-brokers/mortgage-rates/prime-rates" target="_self" aria-label="Mortgage Brokers: Prime rates">
832 + Prime rates
833 + </a>
834 + </li>
835 + <li class="">
836 + <a href="/mortgage-brokers/mortgage-rates/excalibur-rates" target="_self" aria-label="Mortgage Brokers: Excalibur rates">
837 + Excalibur rates
838 + </a>
839 + </li>
840 +
841 + </ul>
842 + </li>
843 + <li class="">
844 + <a href="/mortgage-brokers/merlin-login" target="_self" aria-label="">
845 + MERLIN®
846 + </a>
847 + </li>
848 + <li class="">
849 + <a href="/mortgage-brokers/appraisal-firm-onboarding-application" target="_self" aria-label="">
850 + Appraisal Firm Onboarding Application
851 + </a>
852 + </li>
853 +
854 + </ul>
855 + </div>
856 + </div>
857 + </div>
858 + </div>
859 +
860 + </li>
861 + <li class="c-menu-primary__item ">
862 + <a class="c-menu-primary__link" href="/investor-relations">
863 + Investors
864 + </a>
865 +
866 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-3">
867 + <span class="sr-only">Toggle sub-menu for Investors</span>
868 + </button>
869 +
870 + <div class="c-menu-primary__dropdown">
871 + <div class="container">
872 + <div class="row">
873 + <div class="col-xs-12">
874 + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-3">
875 + <li class="">
876 + <a href="/investor-relations/news-releases" target="_self" aria-label="">
877 + News Releases
878 + </a>
879 + </li>
880 + <li class="">
881 + <a href="/investor-relations/financial-reports-filings" target="_self" aria-label="">
882 + Financial reports & filings
883 + </a>
884 + </li>
885 + <li class="">
886 + <a href="/investor-relations/shareholder-information-dividends" target="_self" aria-label="">
887 + Information for Corporate Bondholders
888 + </a>
889 + </li>
890 + <li>
891 + <a href="/investor-relations/corporate-governance" target="_self" aria-label="">
892 + Corporate Governance
893 + </a>
894 +
895 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-3-3">
896 + <span class="sr-only">Toggle sub-menu for Corporate Governance</span>
897 + </button>
898 +
899 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-3-3">
900 + <li class="">
901 + <a href="/investor-relations/corporate-governance/board-of-directors" target="_self" aria-label="">
902 + Board of Directors
903 + </a>
904 + </li>
905 + <li class="">
906 + <a href="/investor-relations/corporate-governance/committees-and-policies" target="_self" aria-label="">
907 + Committees and policies
908 + </a>
909 + </li>
910 + <li class="">
911 + <a href="/investor-relations/corporate-governance/board-and-committee-mandates" target="_self" aria-label="">
912 + Board and Committee Mandates
913 + </a>
914 + </li>
915 +
916 + </ul>
917 + </li>
918 +
919 + </ul>
920 + </div>
921 + </div>
922 + </div>
923 + </div>
924 +
925 + </li>
926 + <li class="c-menu-primary__item ">
927 + <a class="c-menu-primary__link" href="/about/careers">
928 + Careers
929 + </a>
930 +
931 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-4">
932 + <span class="sr-only">Toggle sub-menu for Careers</span>
933 + </button>
934 +
935 + <div class="c-menu-primary__dropdown">
936 + <div class="container">
937 + <div class="row">
938 + <div class="col-xs-12">
939 + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-4">
940 + <li class="">
941 + <a href="/about/careers/current-opportunities" target="_self" aria-label="">
942 + Current opportunities
943 + </a>
944 + </li>
945 + <li class="">
946 + <a href="/about/careers/life-at-first-national" target="_self" aria-label="">
947 + Life at First National
948 + </a>
949 + </li>
950 + <li class="">
951 + <a href="/about/careers/compensation-and-benefits" target="_self" aria-label="">
952 + Compensation and benefits
953 + </a>
954 + </li>
955 + <li class="">
956 + <a href="/about/careers/community-and-social-initiatives" target="_self" aria-label="">
957 + Community and social initiatives
958 + </a>
959 + </li>
960 + <li class="">
961 + <a href="/about/careers/starting-your-career" target="_self" aria-label="">
962 + Starting your career
963 + </a>
964 + </li>
965 + <li class="">
966 + <a href="/about/careers/get-to-know-our-leaders" target="_self" aria-label="">
967 + Get to know our senior leaders
968 + </a>
969 + </li>
970 + <li class="">
971 + <a href="/about/careers/stories" target="_self" aria-label="">
972 + Stories
973 + </a>
974 + </li>
975 +
976 + </ul>
977 + </div>
978 + </div>
979 + </div>
980 + </div>
981 +
982 + </li>
983 + <li class="c-menu-primary__item ">
984 + <a class="c-menu-primary__link" href="/about">
985 + About
986 + </a>
987 +
988 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-5">
989 + <span class="sr-only">Toggle sub-menu for About</span>
990 + </button>
991 +
992 + <div class="c-menu-primary__dropdown">
993 + <div class="container">
994 + <div class="row">
995 + <div class="col-xs-12">
996 + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-5">
997 + <li class="">
998 + <a href="/about/who-we-are" target="_self" aria-label="">
999 + Who we are
1000 + </a>
1001 + </li>
1002 + <li>
1003 + <a href="/about/leadership" target="_self" aria-label="">
1004 + Executive Leadership
1005 + </a>
1006 +
1007 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-1-5">
1008 + <span class="sr-only">Toggle sub-menu for Executive Leadership</span>
1009 + </button>
1010 +
1011 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-1-5">
1012 + <li class="">
1013 + <a href="/about/leadership/moray-tawse" target="_self" aria-label="">
1014 + Moray Tawse
1015 + </a>
1016 + </li>
1017 + <li class="">
1018 + <a href="/about/leadership/jason-ellis" target="_self" aria-label="">
1019 + Jason Ellis
1020 + </a>
1021 + </li>
1022 + <li class="">
1023 + <a href="/about/leadership/robert-inglis" target="_self" aria-label="">
1024 + Robert Inglis
1025 + </a>
1026 + </li>
1027 + <li class="">
1028 + <a href="/about/leadership/thomas-kim" target="_self" aria-label="">
1029 + Thomas Kim
1030 + </a>
1031 + </li>
1032 + <li class="">
1033 + <a href="/about/leadership/scott-c-mckenzie" target="_self" aria-label="">
1034 + Scott C. McKenzie
1035 + </a>
1036 + </li>
1037 + <li class="">
1038 + <a href="/about/leadership/jeremy-wedgbury" target="_self" aria-label="">
1039 + Jeremy Wedgbury
1040 + </a>
1041 + </li>
1042 + <li class="">
1043 + <a href="/about/leadership/hilda-wong" target="_self" aria-label="">
1044 + Hilda Wong
1045 + </a>
1046 + </li>
1047 +
1048 + </ul>
1049 + </li>
1050 + <li class="">
1051 + <a href="/about/our-business" target="_self" aria-label="">
1052 + Our business
1053 + </a>
1054 + </li>
1055 + <li class="">
1056 + <a href="/about/outsourced-mortgage-servicing-solutions" target="_self" aria-label="">
1057 + Outsourced Mortgage Servicing Solutions
1058 + </a>
1059 + </li>
1060 + <li>
1061 + <a href="/about/corporate-governance" target="_self" aria-label="">
1062 + Corporate Governance
1063 + </a>
1064 +
1065 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-5">
1066 + <span class="sr-only">Toggle sub-menu for Corporate Governance</span>
1067 + </button>
1068 +
1069 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-5">
1070 + <li class="">
1071 + <a href="/about/corporate-governance/board-of-directors" target="_self" aria-label="">
1072 + Board of Directors
1073 + </a>
1074 + </li>
1075 + <li class="">
1076 + <a href="/about/corporate-governance/committees-of-the-board" target="_self" aria-label="">
1077 + Committees of the Board
1078 + </a>
1079 + </li>
1080 +
1081 + </ul>
1082 + </li>
1083 + <li>
1084 + <a href="/about/media-centre" target="_self" aria-label="">
1085 + Media centre
1086 + </a>
1087 +
1088 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-5-5">
1089 + <span class="sr-only">Toggle sub-menu for Media centre</span>
1090 + </button>
1091 +
1092 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-5-5">
1093 + <li class="">
1094 + <a href="/about/media-centre/press-releases" target="_self" aria-label="">
1095 + Press releases
1096 + </a>
1097 + </li>
1098 + <li class="">
1099 + <a href="/about/media-centre/media-toolkit" target="_self" aria-label="">
1100 + Media toolkit
1101 + </a>
1102 + </li>
1103 + <li class="">
1104 + <a href="/about/media-centre/media-contacts" target="_self" aria-label="">
1105 + Media contacts
1106 + </a>
1107 + </li>
1108 +
1109 + </ul>
1110 + </li>
1111 + <li>
1112 + <a href="/about/policies-disclaimers" target="_self" aria-label="">
1113 + Policies and Disclaimers
1114 + </a>
1115 +
1116 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-6-5">
1117 + <span class="sr-only">Toggle sub-menu for Policies and Disclaimers</span>
1118 + </button>
1119 +
1120 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-6-5">
1121 + <li class="">
1122 + <a href="/about/policies-disclaimers/privacy-policy" target="_self" aria-label="">
1123 + Privacy Policy
1124 + </a>
1125 + </li>
1126 + <li class="">
1127 + <a href="/about/policies-disclaimers/whistleblower-policy" target="_self" aria-label="">
1128 + Whistleblower Policy
1129 + </a>
1130 + </li>
1131 + <li class="">
1132 + <a href="/about/policies-disclaimers/aoda" target="_self" aria-label="">
1133 + Accessibility for Ontarians with Disabilities Act
1134 + </a>
1135 + </li>
1136 + <li class="">
1137 + <a href="/about/policies-disclaimers/disclaimers" target="_self" aria-label="">
1138 + Disclaimers
1139 + </a>
1140 + </li>
1141 + <li class="">
1142 + <a href="/about/policies-disclaimers/code-of-business-ethics" target="_self" aria-label="">
1143 + Code of Business Ethics
1144 + </a>
1145 + </li>
1146 +
1147 + </ul>
1148 + </li>
1149 + <li>
1150 + <a href="/about/careers" target="_self" aria-label="">
1151 + Careers
1152 + </a>
1153 +
1154 + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-7-5">
1155 + <span class="sr-only">Toggle sub-menu for Careers</span>
1156 + </button>
1157 +
1158 + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-7-5">
1159 + <li class="">
1160 + <a href="/about/careers/current-opportunities" target="_self" aria-label="">
1161 + Current opportunities
1162 + </a>
1163 + </li>
1164 + <li class="">
1165 + <a href="/about/careers/life-at-first-national" target="_self" aria-label="">
1166 + Life at First National
1167 + </a>
1168 + </li>
1169 + <li class="">
1170 + <a href="/about/careers/compensation-and-benefits" target="_self" aria-label="">
1171 + Compensation and benefits
1172 + </a>
1173 + </li>
1174 + <li class="">
1175 + <a href="/about/careers/community-and-social-initiatives" target="_self" aria-label="">
1176 + Community and social initiatives
1177 + </a>
1178 + </li>
1179 + <li class="">
1180 + <a href="/about/careers/starting-your-career" target="_self" aria-label="">
1181 + Starting your career
1182 + </a>
1183 + </li>
1184 + <li class="">
1185 + <a href="/about/careers/get-to-know-our-leaders" target="_self" aria-label="">
1186 + Get to know our senior leaders
1187 + </a>
1188 + </li>
1189 + <li class="">
1190 + <a href="/about/careers/stories" target="_self" aria-label="">
1191 + Stories
1192 + </a>
1193 + </li>
1194 +
1195 + </ul>
1196 + </li>
1197 +
1198 + </ul>
1199 + </div>
1200 + </div>
1201 + </div>
1202 + </div>
1203 +
1204 + </li>
1205 + </ul>
1206 +</nav>
1207 +
1208 +
1209 +
1210 +
1211 +
1212 +
1213 +
1214 +
1215 +
1216 +
1217 +
1218 +
1219 +
1220 +
1221 +
1222 +
1223 +<ul class="list-unstyled nav-utility justify-end spacing-20 sm-hide">
1224 +
1225 + <li class=""><a href="/contact-us" target="_self">Contact us</a></li>
1226 + <li class=""><a href="/about/careers" target="_self">Careers</a></li>
1227 +</ul>
1228 +
1229 +
1230 +
1231 +
1232 +
1233 +
1234 + <div>
1235 + <ul class="sf-breadscrumb breadcrumb">
1236 + <li><a href="/residential">Residential Mortgages</a></li>
1237 + <li class="active">Mortgage rates</li>
1238 + </ul>
1239 + </div>
1240 +
1241 + </div>
1242 +</div>
1243 +
1244 +</div>
1245 + </header> <main class="region__body">
1246 +<div id="Body_C001_Col00" class="sf_colsIn region__content l-region--soft-gray-gradient gutter-top md-padding-bottom-5 padding-bottom-2" data-sf-element="Region" data-placeholder-label="Region"><div id="Body_C002_Col00" class="sf_colsIn container container-hero" data-sf-element="Container" data-placeholder-label="Container"><div class="row align-center" data-sf-element="Row">
1247 + <div id="Body_C003_Col00" class="sf_colsIn col-xs-12 col-md-4 padding-bottom-2 md-padding-bottom-0" data-sf-element="Column 1" data-placeholder-label="Column 1">
1248 +<div class="content-block" >
1249 + <div ><div class="media-figure" style="background:url('/images/default-source/residential/bg-mortgage-rates.jpg?sfvrsn=95c46b8b_2') center/cover no-repeat;"></div></div>
1250 +</div>
1251 +
1252 + </div>
1253 + <div id="Body_C003_Col01" class="sf_colsIn col-xs-12 col-md-7 col-md-offset-1" data-sf-element="Column 2" data-placeholder-label="Column 2">
1254 +<div class="content-block" >
1255 + <div ><h1 class="o-text-h1">Mortgage Rates</h1><h2 class="o-text-h2">Our rates for qualified residential mortgages</h2><p class="o-text-lead color-gray">When you&rsquo;re buying your dream home, what you pay for your mortgage is a key consideration. But there are other vital priorities as well. Making mortgage decisions based on rate alone doesn&rsquo;t always deliver value in the long run. At First National,
1256 + we want to help you secure a competitive mortgage and provide value along the way &mdash; simplified management, ongoing education, accessible expertise &ndash; so you can own your dream home and achieve your financial goals.</p></div>
1257 +</div>
1258 +
1259 + </div>
1260 +</div>
1261 +
1262 +</div>
1263 +<div id="Body_C004_Col00" class="sf_colsIn container margin-top-3" data-sf-element="Container" data-placeholder-label="Container"><div id="Body_C030_Col00" class="sf_colsIn card card-white card-floating padding-1 md-padding-3" data-sf-element="Region" data-placeholder-label="Region"><div class="row align-top" data-sf-element="Row">
1264 + <div id="Body_C005_Col00" class="sf_colsIn col-xs-12 col-md-12 margin-bottom-2" data-sf-element="Column 1" data-placeholder-label="Column 1">
1265 +
1266 +
1267 +<div class="card card-white card-floating padding-1 md-padding-3">
1268 + <p>Rates effective as of <strong>Tuesday, August 18, 2026</strong> for qualified residential properties.</p>
1269 + <h2 class="color-primary o-text-h1">Posted Rates</h2>
1270 + <h3>Fixed rate mortgages – closed terms</h3>
1271 + <div class="table-responsive margin-top-2">
1272 + <table class="table table-striped table-rwd">
1273 + <thead>
1274 + <tr>
1275 + <th><span class="sr-only">Mortgage type</span></th>
1276 + <th>
1277 + 1&#160;year
1278 + </th>
1279 + <th>
1280 + 2&#160;year
1281 + </th>
1282 + <th>
1283 + 3&#160;year
1284 + </th>
1285 + <th>
1286 + 4&#160;year
1287 + </th>
1288 + <th>
1289 + 5&#160;year
1290 + </th>
1291 + <th>
1292 + 7&#160;year
1293 + </th>
1294 + <th>
1295 + 10&#160;year
1296 + </th>
1297 + </tr>
1298 + </thead>
1299 + <tbody>
1300 + <tr>
1301 + <th>Insured</th>
1302 + <td aria-label="1 year">5.14</td>
1303 + <td aria-label="2 year">4.74</td>
1304 + <td aria-label="3 year">4.94</td>
1305 + <td aria-label="4 year">4.89</td>
1306 + <td aria-label="5 year">4.64</td>
1307 + <td aria-label="7 year">5.14</td>
1308 + <td aria-label="10 year">5.49</td>
1309 + </tr>
1310 +
1311 + <tr>
1312 + <th>Insurable up to 65% LTV</th>
1313 + <td aria-label="1 year">5.14</td>
1314 + <td aria-label="2 year">4.74</td>
1315 + <td aria-label="3 year">4.94</td>
1316 + <td aria-label="4 year">4.89</td>
1317 + <td aria-label="5 year">4.69</td>
1318 + <td aria-label="7 year">N/A</td>
1319 + <td aria-label="10 year">N/A</td>
1320 + </tr>
1321 +
1322 + <tr>
1323 + <th>Insurable &gt; 65% - 70% LTV</th>
1324 + <td aria-label="1 year">5.14</td>
1325 + <td aria-label="2 year">4.74</td>
1326 + <td aria-label="3 year">4.94</td>
1327 + <td aria-label="4 year">4.89</td>
1328 + <td aria-label="5 year">4.79</td>
1329 + <td aria-label="7 year">N/A</td>
1330 + <td aria-label="10 year">N/A</td>
1331 + </tr>
1332 +
1333 + <tr>
1334 + <th>Insurable &gt; 70% - 75% LTV</th>
1335 + <td aria-label="1 year">5.14</td>
1336 + <td aria-label="2 year">4.74</td>
1337 + <td aria-label="3 year">4.94</td>
1338 + <td aria-label="4 year">4.89</td>
1339 + <td aria-label="5 year">4.89</td>
1340 + <td aria-label="7 year">N/A</td>
1341 + <td aria-label="10 year">N/A</td>
1342 + </tr>
1343 +
1344 + <tr>
1345 + <th>Insurable &gt; 75% - 80% LTV</th>
1346 + <td aria-label="1 year">5.14</td>
1347 + <td aria-label="2 year">4.74</td>
1348 + <td aria-label="3 year">4.94</td>
1349 + <td aria-label="4 year">4.89</td>
1350 + <td aria-label="5 year">4.94</td>
1351 + <td aria-label="7 year">N/A</td>
1352 + <td aria-label="10 year">N/A</td>
1353 + </tr>
1354 +
1355 +
1356 + <tr>
1357 + <th>Conventional</th>
1358 + <td aria-label="1 year">5.14</td>
1359 + <td aria-label="2 year">4.74</td>
1360 + <td aria-label="3 year">4.94</td>
1361 + <td aria-label="4 year">4.89</td>
1362 + <td aria-label="5 year">4.94</td>
1363 + <td aria-label="7 year">5.14</td>
1364 + <td aria-label="10 year">5.49</td>
1365 + </tr>
1366 + </tbody>
1367 + </table>
1368 +
1369 +
1370 +
1371 + </div>
1372 +</div>
1373 +
1374 +<div class="card card-white card-floating padding-1 md-padding-3 margin-top-3">
1375 + <h3>Adjustable rate mortgages</h3>
1376 + <table class="table table-striped margin-top-2">
1377 + <thead>
1378 + <tr>
1379 + <th><span class="sr-only">Mortgage type</span></th>
1380 +
1381 + <th>
1382 + 5 year
1383 + </th>
1384 + </tr>
1385 + </thead>
1386 + <tbody>
1387 + <tr>
1388 + <th style="width: 55%;">Insured</th>
1389 + <td>
1390 +Prime - 0.75% for the entire term </td>
1391 + </tr>
1392 + <tr>
1393 + <th>Insurable up to 65% LTV</th>
1394 + <td>
1395 +Prime - 0.70% for the entire term </td>
1396 + </tr>
1397 + <tr>
1398 + <th>Insurable &gt; 65% - 70% LTV</th>
1399 + <td>
1400 +Prime - 0.50% for the entire term </td>
1401 + </tr>
1402 + <tr>
1403 + <th>Insurable &gt; 70% - 75% LTV</th>
1404 + <td>
1405 +Prime - 0.45% for the entire term </td>
1406 + </tr>
1407 + <tr>
1408 + <th>Insurable &gt; 75% - 80% LTV</th>
1409 + <td>
1410 +Prime - 0.40% for the entire term </td>
1411 + </tr>
1412 + <tr>
1413 + <th>Conventional</th>
1414 + <td>
1415 +Prime - 0.16% for the entire term </td>
1416 + </tr>
1417 +
1418 + </tbody>
1419 + </table>
1420 +
1421 + <p class="gutter-bottom">
1422 + <strong>
1423 + First National Prime Rate:
1424 + <span> 4.45</span>
1425 + </strong>
1426 + </p>
1427 +</div>
1428 +
1429 +<div class="card card-white card-floating padding-1 md-padding-3 margin-top-3">
1430 + <h3>Open term mortgage</h3>
1431 + <table class="table table-striped margin-top-2">
1432 + <tbody>
1433 + <tr>
1434 + <th style="width: 55%;">6 month fixed term</th>
1435 + <td><span>9.95</span></td>
1436 + </tr>
1437 + </tbody>
1438 + </table>
1439 +</div>
1440 +
1441 +
1442 + </div>
1443 +</div>
1444 +
1445 +
1446 +
1447 +
1448 +<div class="card card-white card-floating padding-1 md-padding-3 margin-top-3" id="excalibur">
1449 + <h3>Excalibur Mortgage Rates</h3>
1450 + <div class="table-responsive margin-top-2">
1451 + <table class="table table-striped table-rwd">
1452 + <thead>
1453 + <tr>
1454 + <th><span class="sr-only">Year</span></th>
1455 + <th>680+</th>
1456 + <th>650-679</th>
1457 + <th>600-649</th>
1458 + <th>580-599</th>
1459 + <th>&lt; 580</th>
1460 + </tr>
1461 + </thead>
1462 +
1463 + <tbody>
1464 + <tr>
1465 + <th>1 Year</th>
1466 + <td aria-label="680+">4.99%</td>
1467 + <td aria-label="650-679">5.14%</td>
1468 + <td aria-label="600-649">5.39%</td>
1469 + <td aria-label="580-599">5.64%</td>
1470 + <td aria-label="&lt; 580">5.89%</td>
1471 + </tr>
1472 +
1473 + <tr>
1474 + <th>2 Year</th>
1475 + <td aria-label="680+">5.09%</td>
1476 + <td aria-label="650-679">5.34%</td>
1477 + <td aria-label="600-649">5.59%</td>
1478 + <td aria-label="580-599">5.84%</td>
1479 + <td aria-label="&lt; 580">5.99%</td>
1480 + </tr>
1481 +
1482 + <tr>
1483 + <th>3 Year</th>
1484 + <td aria-label="680+">5.14%</td>
1485 + <td aria-label="650-679">5.39%</td>
1486 + <td aria-label="600-649">5.64%</td>
1487 + <td aria-label="580-599">5.89%</td>
1488 + <td aria-label="&lt; 580">6.14%</td>
1489 + </tr>
1490 + </tbody>
1491 + </table>
1492 + </div>
1493 +</div>
1494 +</div>
1495 +
1496 +</div>
1497 +<div id="Body_C008_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row align-center" data-sf-element="Row">
1498 + <div id="Body_C009_Col00" class="sf_colsIn col-xs-12" data-sf-element="Column 1" data-placeholder-label="Column 1">
1499 +<div class="content-block" >
1500 + <div ><div class="card padding-top-1 md-padding-top-3 padding-left-1 md-padding-left-3 padding-right-1 md-padding-right-3 padding-bottom-0 md-padding-bottom-0"><small class="o-text-tiny text-muted"><p>Not familiar with these mortgage terms? <a href="/residential/mortgage-resources/glossary-of-terms">Visit our glossary here.</a></p><p>Rates are for single-family residential mortgages.</p><p>Actual rates may vary. Please contact First National toll-free at 1.888.670.2111 or send us a message through your <a target="_blank" href="http://mymortgage.firstnational.ca">My Mortgage</a> account.&nbsp;</p><p>Rates are subject to change without notice.<br />E. &amp; O. E.</p></small>
1501 +</div></div>
1502 +</div>
1503 +
1504 + </div>
1505 +</div>
1506 +
1507 +</div>
1508 +
1509 +</div>
1510 +<div id="Body_C010_Col00" class="sf_colsIn region__content l-region--default-keyline padding-top-2 padding-bottom-2 md-padding-top-4 md-padding-bottom-4" data-sf-element="Region" data-placeholder-label="Region"><div id="Body_C011_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row" data-sf-element="Row">
1511 + <div id="Body_C028_Col00" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 md-padding-top-1 md-padding-bottom-1 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 1" data-placeholder-label="Column 1">
1512 +<div class="content-block" >
1513 + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="57" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/calculator.svg" width="45" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-how-much">How much can I afford?<br />&nbsp;</h3></div><p>Estimate your potential mortgage amount for a realistic picture of what you can afford when buying your dream home.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-how-much" href="/residential/mortgage-calculators/how-much-can-i-afford" aria-labelledby="b-how-much h-how-much">Try the calculator</a></small></li></ul></div></div>
1514 +</div>
1515 +
1516 + </div>
1517 + <div id="Body_C028_Col01" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 position-relative md-divider divider-left padding-top-2 md-padding-top-1 md-padding-bottom-1 md-padding-left-2 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 2" data-placeholder-label="Column 2">
1518 +<div class="content-block" >
1519 + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="57" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/calculator.svg" width="45" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-mortgage-payment">Mortgage payment calculator</h3></div><p>Get a better idea of your monthly mortgage costs by estimating your potential payments.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-mortgage-payment" href="/residential/mortgage-calculators/mortgage-payment-calculator" aria-labelledby="b-mortgage-payment h-mortgage-payment">CALCULATE YOUR PAYMENTS</a></small></li></ul></div></div>
1520 +</div>
1521 +
1522 + </div>
1523 + <div id="Body_C028_Col02" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 position-relative md-divider divider-left padding-top-2 md-padding-top-1 md-padding-bottom-1 md-padding-left-2 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 3" data-placeholder-label="Column 3">
1524 +<div class="content-block" >
1525 + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="59" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/television.svg" width="59" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-mortgage-videos">Mortgage videos<br />&nbsp;</h3></div><p>Learn about key mortgage concepts in a simple and clear way so you can make decisions and manage your mortgage with confidence.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-mortgage-videos" href="/residential/for-customers/mortgage-videos" aria-labelledby="b-mortgage-videos h-mortgage-videos">WATCH THE VIDEOS</a></small></li></ul></div></div>
1526 +</div>
1527 +
1528 + </div>
1529 + <div id="Body_C028_Col03" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 position-relative md-divider divider-left padding-top-2 md-padding-top-1 md-padding-bottom-1 md-padding-left-2 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 4" data-placeholder-label="Column 4">
1530 +<div class="content-block" >
1531 + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="59" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/support.svg" width="67" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-mortgage-broker">Working with a Mortgage Broker</h3></div><p>Take the stress out of the mortgage process by relying on a credible professional who can provide trusted advice about mortgage rates, options and advantages.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-mortgage-broker" href="/residential/about/working-with-a-mortgage-broker" aria-labelledby="b-mortgage-broker h-mortgage-broker"><span class="sr-only">Working with a Mortgage Broker: </span>LEARN MORE</a></small></li></ul></div></div>
1532 +</div>
1533 +
1534 + </div>
1535 +</div>
1536 +
1537 +</div>
1538 +
1539 +</div>
1540 + </main> <footer class="l-region-footer">
1541 +<div id="Footer_T240A2D21001_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row align-center xs-text-center" data-sf-element="Row">
1542 + <div id="Footer_T240A2D21002_Col00" class="sf_colsIn col-xs-12 col-md-5 col-sm-6" data-sf-element="Column 1" data-placeholder-label="Column 1">
1543 +<div class="content-block" >
1544 + <div ><img src="/images/default-source/brand/global/first-national-logo-color1655feae-7538-4ce4-ada0-a924d05951b2.svg?sfvrsn=a8ed488b_2" width="215" title="first-national-logo-color" style="max-width:100%;height:auto;" sf-image-responsive="true" sf-size="8290" alt="" /></div>
1545 +</div>
1546 +
1547 + </div>
1548 + <div id="Footer_T240A2D21002_Col01" class="sf_colsIn col-xs-12 col-sm-6 col-md-offset-1 xs-spacing-30" data-sf-element="Column 2" data-placeholder-label="Column 2">
1549 +<div class="content-block" >
1550 + <div ><div class="c-nav-social"><p id="hdrSocialLinks" class="c-nav-social__label o-text-h6 color-fn-green">Follow us:</p><ul class="c-nav-social__list list-unstyled" aria-labelledby="hdrSocialLinks"><li><a href="https://www.linkedin.com/company/first-national-financial-lp" target="_blank" rel="noopener noreferrer"><img src="/images/default-source/brand/global/linkedin.svg?sfvrsn=537a738b_4" alt="LinkedIn" /><span class="sr-only">(opens in new window)</span></a>
1551 + </li><li><a href="https://www.youtube.com/channel/UCZt79dOBS8dGZAvWhd3uq0g" target="_blank" rel="noopener noreferrer"><img src="/images/default-source/brand/global/youtube.svg?sfvrsn=5c7a738b_6" alt="YouTube" /><span class="sr-only">(opens in new window)</span></a>
1552 + </li></ul></div></div>
1553 +</div>
1554 +
1555 + </div>
1556 +</div>
1557 +<div class="row spacing-60 align-center xs-text-center" data-sf-element="Row">
1558 + <div id="Footer_T240A2D21003_Col00" class="sf_colsIn col-xs-12 col-md-5 col-sm-6" data-sf-element="Column 1" data-placeholder-label="Column 1">
1559 +<div class="content-block" >
1560 + <div ><p>First National is one of Canada's largest non-bank mortgage lenders, offering both commercial mortgages and residential mortgage solutions.</p></div>
1561 +</div>
1562 +
1563 + </div>
1564 + <div id="Footer_T240A2D21003_Col01" class="sf_colsIn col-xs-12 col-sm-6 col-md-offset-1 xs-spacing-30" data-sf-element="Column 2" data-placeholder-label="Column 2">
1565 +<div class="content-block" >
1566 + <div ><div class="c-form-subscribe" id="formEmailAlerts"><p class="c-form-subscribe__legend o-text-h6 color-fn-green" id="hdrEmailAlerts" role="heading" aria-level="2">Keep up to date with email alerts</p><div class="c-form-subscribe__combo"><label class="sr-only" for="alert_email">Email address</label>
1567 + <input class="c-form-subscribe__combo__input" id="alert_email" name="alert_email" placeholder="Enter your email address" type="email" value="" /><button class="c-form-subscribe__combo__submit" type="submit">Subscribe</button></div></div></div>
1568 +</div>
1569 +
1570 + </div>
1571 +</div>
1572 +<div class="row align-center spacing-50" data-sf-element="Row">
1573 + <div id="Footer_T240A2D21040_Col00" class="sf_colsIn col-xs-12" data-sf-element="Column 1" data-placeholder-label="Column 1">
1574 +
1575 +
1576 +
1577 +
1578 +<ul class="list-unstyled nav-utility xs-justify-center">
1579 +
1580 + <li class=""><a href="/about/policies-disclaimers/privacy-policy" target="_self">Privacy Policy</a></li>
1581 + <li class=""><a href="/accessibility" target="_self">Accessibility</a></li>
1582 + <li class=""><a href="/contact-us" target="_self">Contact us</a></li>
1583 + <li class=""><a href="/about/policies-and-disclaimers/privacy-policy#cookies" target="_self">Cookies</a></li>
1584 + <li class=""><a href="/residential/mortgage-resources/fraud-prevention" target="_self">Fraud prevention</a></li>
1585 + <li class=""><a href="/licenses" target="_self">Licenses</a></li>
1586 +</ul>
1587 +
1588 +
1589 +
1590 +
1591 +
1592 +
1593 +
1594 + </div>
1595 +</div>
1596 +<div class="row align-center spacing-20" data-sf-element="Row">
1597 + <div id="Footer_T240A2D21041_Col00" class="sf_colsIn col-xs-12" data-sf-element="Column 1" data-placeholder-label="Column 1">
1598 +<div class="content-block" >
1599 + <div ><ul class="list-inline o-text-bodysmall xs-text-center"><li>FSRA License Nos. 10514 &amp; 11252</li><li>&copy; First National Financial LP</li></ul></div>
1600 +</div>
1601 +
1602 + </div>
1603 +</div>
1604 +
1605 +</div>
1606 +
1607 +<script>
1608 + var cdJsHost = (("https:" == document.location.protocol) ? "https://" : "http://");
1609 + document.write(unescape("%3Cscript src='" + cdJsHost + "analytics.clickdimensions.com/ts.js' type='text/javascript'%3E%3C/script%3E"));
1610 +</script>
1611 +
1612 +<script>
1613 + var cdAnalytics = new clickdimensions.Analytics('analytics.clickdimensions.com');
1614 + cdAnalytics.setAccountKey('aChIusjvxA066jajDAVjFg');
1615 + cdAnalytics.setDomain('firstnational.ca');
1616 + cdAnalytics.trackPage();
1617 +</script>
1618 +
1619 +<div class="modal fade" id="modalExternalLinks" tabindex="-1" role="dialog" aria-labelledby="modalExternalLinksLabel">
1620 + <div class="modal-dialog" role="document">
1621 + <div class="container">
1622 + <div class="row">
1623 + <div class="col-sm-8 col-sm-offset-2 col-xs-12">
1624 + <div class="modal-content">
1625 + <div class="modal-header">
1626 + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
1627 + <h2 class="modal-title" id="modalExternalLinksLabel">You are now leaving the First National website</h2>
1628 + </div>
1629 + <div class="modal-body">
1630 + <p id="modalExtLinksContent"></p>
1631 + </div>
1632 + <div class="modal-footer">
1633 + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
1634 + <a class="btn btn-primary" href="#" id="modalExternalLinksTarget" target="_blank">Ok</a>
1635 + </div>
1636 + </div>
1637 + </div>
1638 + </div>
1639 + </div>
1640 + </div>
1641 +</div>
1642 +<script>
1643 +document.getElementById("modalExtLinksContent").innerHTML = "The website you will be entering is not owned or operated by First National or any of its affiliates or subsidiaries. The content, products and information contained on third party websites are not owned or controlled by First National and/or any of its subsidiaries. We make no representations about, do not endorse, and are not responsible or liable for damages relating to the third party, its products or services, its website, its privacy policies or practices, or the content of the third party website.";
1644 +</script>
1645 +<div class="content-block cookie-message" >
1646 + <div ><div class="container"><div class="row"><div class="col-xs-12"><p>First National uses cookies to make sure you receive the best experience on our website and we collect anonymous information to improve the site&rsquo;s functionality. By continuing on our site without changing your settings, you consent to First National&rsquo;s use of <a href="/about/policies-disclaimers/privacy-policy#cookies">cookies</a>.&nbsp; To understand more, visit our <a href="/about/policies-disclaimers/privacy-policy">Privacy Policy</a>.</p><p><button class="cookie-close-button btn btn-default">Got it</button></p></div></div></div></div>
1647 +</div>
1648 +
1649 +
1650 +
1651 +
1652 + </footer> </div> <script src="/ResourcePackages/FirstNationalBootstrap/assets/dist/js/app.min.js?v=639227790309152293" type="text/javascript"></script><input data-sf-role='fr' type='hidden' value='https://www.firstnational.ca/fr/clients-r&#233;sidentiels/taux-hypoth&#233;caires'><script type="text/javascript" src="/js/jquery.cookieBar.min.js"></script><script type="text/javascript">
1653 +$(document).ready(function() { $(".cookie-message").prependTo(".region__page"); $(".cookie-message").cookieBar({ closeButton: ".cookie-close-button" }); });
1654 +</script> <script>(function () { var v = 1787609799 * 3.1415926535898; v = Math.floor(v); document.cookie = "__zjc1546="+v+"; expires=Mon, 24 Aug 2026 22:17:39 UTC; path=/"; })()</script></body> </html>
added tests/fixtures/mortgage/mcap.html +1376 −0
@@ -0,0 +1,1376 @@
1 +
2 +
3 +<!DOCTYPE html>
4 +<html lang="en-CA">
5 +
6 +<head>
7 +
8 +
9 +<meta charset="UTF-8" />
10 +<meta name="viewport" content="width=device-width, initial-scale=1">
11 +<meta name="accept-language" content="en-CA" />
12 +<meta name="description" content="Competitive mortgage rates paired with mortgage features you’ll love — available from Canada’s largest independent Mortgage Finance Company. Learn more about MCAP!">
13 +<meta name="keywords" content="mortgage,rate,rates,mcap">
14 +<meta name="facebook-domain-verification" content="9nc0ncxgm6jjmi6532xkjsyru2l5mf" />
15 +
16 +
17 + <!--Twitter-->
18 + <meta name="twitter:title" content="Mortgage Rates | MCAP">
19 + <meta name="twitter:description" content="Competitive mortgage rates paired with mortgage features you’ll love — available from Canada’s largest independent Mortgage Finance Company. Learn more about MCAP!">
20 + <meta name="twitter:image" content="https://www.mcap.com/Content/MCAP/UploadedImages/MCAP_Mortgage-Rates-canada_Social-Image-Preview.jpg">
21 + <!--OG-Facebook-->
22 + <meta property="og:title" content="Mortgage Rates | MCAP">
23 + <meta property="og:image" content="https://www.mcap.com/Content/MCAP/UploadedImages/MCAP_Mortgage-Rates-canada_Social-Image-Preview.jpg">
24 + <meta property="og:description" content="Competitive mortgage rates paired with mortgage features you’ll love — available from Canada’s largest independent Mortgage Finance Company. Learn more about MCAP!">
25 +
26 +
27 + <title>
28 + Mortgage Rates | MCAP
29 + </title>
30 +
31 +
32 +
33 + <link rel="alternate" href="https://www.mcap.com/residential-mortgages/advice/mortgage-rates-canada" hreflang="en-ca" />
34 + <link rel="alternate" href="https://www.mcap.com/fr/residentiel/conseils/taux-hypothecaires-canada" hreflang="fr-ca" />
35 + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DINPro-Regular.woff" type="font/woff2" crossorigin="anonymous">
36 + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DINPro-Medium.woff" type="font/woff2" crossorigin="anonymous">
37 + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DIN-Bold.woff" type="font/woff2" crossorigin="anonymous">
38 + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DINPro-Black.woff" type="font/woff2" crossorigin="anonymous">
39 + <script type="application/ld+json">
40 +
41 +
42 +
43 +
44 + { "@context": "http://schema.org", "@type": "MortgageLoan", "name": "Agency 30 Year Fixed", "description": "Experience easier budgeting with predictable monthly payments. Relax knowing you’ll never have to worry about rising interest rates for the life of your loan.", "amount": { "@type": "MonetaryAmount", "amount": "200000", "currency": "USD" }, "loanTerm": { "@type": "QuantitativeValue", "value": "30", "unitCode": "ANN" }, "interestRate": "3.625", "annualPercentageRate": "3.8047", "loanRepaymentForm": { "@type": "RepaymentSpecification", "loanPaymentAmount": { "@type": "MonetaryAmount", "amount": "909.3", "currency": "USD" }, "downPayment": "20", "numberOfLoanPayments": "360", "loanPaymentFrequency": "Monthly" } }{  "@context": "http://schema.org", "@type": "MortgageLoan", "name": "1-10 Year Closed - Fixed Rate Mortgage", "brand": "MCAP", "description": "With a fixed interest rate mortgage payments are guaranteed not to change for the entire length of the term selected.", "currency": "CAD", "offers": "Owner-occupied with a maximum of 4 units", "offers": "Small rental with MCAP’s Small Rental Program (5 year only)", "offers": "Secondary home (1 unit)","loanTerm": { "@type": "QuantitativeValue", "value": "1", "unitCode": "ANN" },"loanTerm": { "@type": "QuantitativeValue", "value": "2", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "3", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "4", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "5", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "7", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "10", "unitCode": "ANN" },  "loanPaymentFrequency": "Monthly","loanPaymentFrequency": "Semi-monthly","loanPaymentFrequency": "Bi-weekly","loanPaymentFrequency": "Weekly (accelerated)","url": "https://www.mcap.com/residential-mortgages/customers/products/1-10-year-closed",   }}
45 + </script>
46 +
47 + <link rel="icon" href="/Content/MCAP/favicon.ico" />
48 + <link href="/Content/MCAP/Modern/css/mcap.min.css?v=2" rel="stylesheet" />
49 + <script type="text/javascript" defer="defer">
50 + var readMoreText = 'Read More'
51 +var readLessText = 'Read Less'
52 +var emailCorrection = 'Did you mean'
53 +var unsupportedbrowser = 'This site does not fully support your web browser version. Please update your web browser for a better experience and enhanced security on this site. Visit your web browser to download the latest version.'
54 +
55 + </script>
56 +
57 + <script type="text/javascript" src="/Scripts/jquery-3.5.1.min.js"></script>
58 +
59 +
60 +
61 +
62 + <style>
63 + main .big-blue-bar{
64 +margin-top: 50px;
65 +}
66 +
67 +
68 +@media (min-width: 769px) {
69 +main .article-list-row.mb-5 {margin-bottom: 90px !important;}
70 +.charts1 {margin-top: -12px;}
71 +}
72 + </style>
73 +</head>
74 +
75 +<body id="mcap-site" data-title="Mortgage Rates">
76 + <a class="skip-main" id="skip-main" href="#main">Skip to main content</a>
77 +
78 +
79 +<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
80 +
81 +<div class="container-fluid bg-accent-blue text-white banner-overlap">
82 + <div class="container">
83 + <p class="font-weight-300 mb-20">
84 +
85 + </p>
86 + <p class="font-weight-300 mb-0">
87 + <p margin-bottom: 10px;">Want to learn more about the impact of a prime rate change? <a href="https://www.mcap.com/residential-mortgages/advice/mortgage-rates-canada/impact-of-a-prime-rate-change" style="color:#ffffff; text-decoration:underline;">Click here</a> to find out more.</p>
88 +
89 +<!--<p><strong>Canada Post Labour Disruption</strong></p><p>Canada Post has announced that mail delivery will resume on a rotating basis. You may experience delivery delays as they work through the backlog. For instant access to your mortgage, log in to <a href="https://www.mcap.com/mymcap/login?lang=en" style="color:#ffffff; text-decoration: underline;">MyMCAP</a>. As always, our customer service team is available to help. <a href="https://www.mcap.com/contact-us/residential-mortgages" style="color:#ffffff; text-decoration: underline;">Contact us here</a>.</p>-->
90 +
91 +
92 +
93 +
94 +
95 +
96 +
97 +
98 + </p>
99 + </div>
100 + <button class="close-btn" title="Close banner"></button>
101 +</div>
102 +
103 + <!-- used for Language toggle to keep the same pages-->
104 + <!-- Prepares language toggle for: engUrl and frURL temp data are intialized in contentController.cs, blogController.cs, and _index.cshtml-->
105 + <!--setting logo URL-->
106 + <!--if anything other than about-mcap, set it to the main BU otherwise set it to about-mcap-->
107 +
108 +<nav class="navbar navbar-expand-sm bg-primary-blue static-top" aria-label="top navigation" id="navbar-main">
109 + <div class="container">
110 + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarMCAP" aria-controls="navbarMCAP" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
111 + <div class="collapse navbar-collapse" id="navbarMCAP">
112 + <ul class="navbar-nav mr-auto text-uppercase">
113 + <li class="nav-item active">
114 + <a class="nav-link" href="/residential-mortgages" aria-label="you are on RESIDENTIAL MORTGAGES ">
115 + RESIDENTIAL MORTGAGES
116 +
117 + </a>
118 + </li>
119 + <li class="nav-item ">
120 + <a class="nav-link" href="/commercial-mortgages" >
121 + COMMERCIAL MORTGAGES
122 +
123 + </a>
124 + </li>
125 + <li class="nav-item ">
126 + <a class="nav-link" href="/development-finance" >
127 + DEVELOPMENT FINANCE
128 +
129 + </a>
130 + </li>
131 + </ul>
132 + <ul class="navbar-nav ml-auto text-uppercase">
133 + <li class="nav-item "><a class="nav-link" href="/corporate/about-mcap">About MCAP</a></li>
134 +
135 + <li class="nav-item "><a class="nav-link" href="/corporate/careers">Careers</a></li>
136 +
137 + <li class="nav-item "><a class="nav-link" href="/contact-us/residential-mortgages" aria-label="Contact Us">Contact Us</a></li>
138 + <li class="nav-item"><a class="nav-link" href="/fr/residentiel/conseils/taux-hypothecaires-canada">FR</a></li>
139 + </ul>
140 + </div>
141 + </div>
142 +</nav>
143 +
144 +<!-- Header-->
145 +<header class="menu-container position-relative">
146 + <div class="container">
147 + <div class="logo">
148 + <a href="/residential-mortgages">
149 + <img src="/Content/MCAP/Modern/assets/images/logos/mcap.svg" alt="MCAP logo" />
150 + </a>
151 + </div>
152 + <nav aria-label="sub navigation">
153 +
154 + <ul class="menu" role="menubar" id="mainNav">
155 +
156 + <li class="menu-item active" role="none">
157 + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" aria-label="you are on ADVICE "><span>ADVICE</span></a>
158 +
159 + <div class="megamenu-content">
160 + <div class="container">
161 + <div class="row">
162 + <div class="offset-lg-2 col-lg-3 col-md-6">
163 + <ul role="menu">
164 + <li class="submenu-item" role="none">
165 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/first-time-home-buyer"><span>Buying Your First Home</span></a>
166 + </li>
167 + <li class="submenu-item" role="none">
168 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/existing-home-buyer"><span>Buying Your Next Home</span></a>
169 + </li>
170 + <li class="submenu-item" role="none">
171 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/refinance"><span>Refinancing Your Mortgage</span></a>
172 + </li>
173 + <li class="submenu-item" role="none">
174 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/secondary-property"><span>Buying a Second Property</span></a>
175 + </li>
176 + <li class="submenu-item" role="none">
177 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/renewals"><span>Renewing Your Mortgage</span></a>
178 + </li>
179 + <li class="submenu-item" role="none">
180 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/switch-to-mcap"><span>Switching to MCAP</span></a>
181 + </li>
182 + <li class="submenu-item" role="none">
183 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/mortgage-rates-canada"><span>Mortgage Rates</span></a>
184 + </li>
185 + </ul>
186 + </div>
187 + </div>
188 + </div>
189 + </div>
190 + </li>
191 + <li class="menu-item " role="none">
192 + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>PRODUCTS</span></a>
193 +
194 + <div class="megamenu-content">
195 + <div class="container">
196 + <div class="row">
197 + <div class="offset-lg-2 col-lg-3 col-md-6">
198 + <ul role="menu">
199 + <li class="submenu-item" role="none">
200 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/products/our-mortgages"><span>MCAP Mortgages</span></a>
201 + </li>
202 + <li class="submenu-item" role="none">
203 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/products/mortgage-life-and-disability-insurance"><span>Home Mortgage Protection: Mortgage Life &amp; Disability Insurance</span></a>
204 + </li>
205 + <li class="submenu-item" role="none">
206 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/products/home-service-plan"><span>Home Service Plan</span></a>
207 + </li>
208 + </ul>
209 + </div>
210 + </div>
211 + </div>
212 + </div>
213 + </li>
214 + <li class="menu-item " role="none">
215 + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>PROGRAMS</span></a>
216 +
217 + <div class="megamenu-content">
218 + <div class="container">
219 + <div class="row">
220 + <div class="offset-lg-2 col-lg-3 col-md-6">
221 + <ul role="menu">
222 + <li class="submenu-item" role="none">
223 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/programs/property-tax-service"><span>Property Tax Service</span></a>
224 + </li>
225 + <li class="submenu-item" role="none">
226 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/programs/register-for-key-to-hope"><span>Key to Hope™ - Supporting Habitat for Humanity</span></a>
227 + </li>
228 + <li class="submenu-item" role="none">
229 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/programs/myhome-sweepstakes"><span>MyHome Sweepstakes</span></a>
230 + </li>
231 + </ul>
232 + </div>
233 + </div>
234 + </div>
235 + </div>
236 + </li>
237 + <li class="menu-item " role="none">
238 + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>RESOURCES</span></a>
239 +
240 + <div class="megamenu-content">
241 + <div class="container">
242 + <div class="row">
243 + <div class="offset-lg-2 col-lg-3 col-md-6">
244 + <ul role="menu">
245 + <li class="submenu-item" role="none">
246 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/satisfying-your-mortgage-conditions"><span>Satisfying Your Mortgage Conditions</span></a>
247 + </li>
248 + <li class="submenu-item" role="none">
249 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/payment-assistance"><span>Payment Assistance</span></a>
250 + </li>
251 + <li class="submenu-item" role="none">
252 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mortgage-documents"><span>Mortgage Documents</span></a>
253 + </li>
254 + <li class="submenu-item" role="none">
255 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mortgage-payment-calculator"><span>Mortgage Payment Calculator</span></a>
256 + </li>
257 + <li class="submenu-item" role="none">
258 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mortgage-videos"><span>Mortgage Videos</span></a>
259 + </li>
260 + <li class="submenu-item" role="none">
261 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/common-mortgage-terminology"><span>Mortgage Glossary</span></a>
262 + </li>
263 + <li class="submenu-item" role="none">
264 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mymcap"><span>MyMCAP Homeowner Portal</span></a>
265 + </li>
266 + </ul>
267 + </div>
268 + </div>
269 + </div>
270 + </div>
271 + </li>
272 + <li class="menu-item " role="none">
273 + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>FOR BROKERS</span></a>
274 +
275 + <div class="megamenu-content">
276 + <div class="container">
277 + <div class="row">
278 + <div class="offset-lg-2 col-lg-3 col-md-6">
279 + <ul role="menu">
280 + <li class="submenu-item" role="none">
281 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/for-brokers/why-work-with-mcap"><span>Why Work with MCAP</span></a>
282 + </li>
283 + <li class="submenu-item" role="none">
284 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/for-brokers/earn-rewards-and-compensation"><span>Broker Rewards &amp; Compensation</span></a>
285 + </li>
286 + <li class="submenu-item" role="none">
287 + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/for-brokers/national-sales-team"><span>National Sales Team</span></a>
288 + </li>
289 + </ul>
290 + </div>
291 + </div>
292 + </div>
293 + </div>
294 + </li>
295 + <li class="menu-item " role="none">
296 + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="/residential-mortgages/blog" ><span>BLOG</span></a>
297 +
298 + </li>
299 +
300 + </ul>
301 + </nav>
302 +
303 + <div class="header-buttons float-right">
304 +
305 + <button class="btn btn-primary" onclick="location.href='/residential-mortgages/resources/find-a-mortgage-broker'">FIND A BROKER</button>
306 +
307 + <div class="search-container">
308 + <button class="search" aria-label="open search form"></button>
309 + <div class="search-input-container hidden">
310 +
311 +<form action="/Search" id="SearchForm" method="post" name="SearchForm"><input name="__RequestVerificationToken" type="hidden" value="CCMJNxY5opq5EFPfIvButMK7gKN3RyF-PH4hqdSL4uawabWIUwmVQrjGCASidZbuaHDS7bgwCox4qqaeJfSkag2" /> <label class="hidden" for="search">Search site contents</label>
312 + <input type="text" title="textInput" name="search" id="search" placeholder="Search">
313 + <button class="search-close" aria-label="close search form"></button>
314 +</form> </div>
315 + </div>
316 +
317 + <button class="hamburger" aria-label="Open menu" aria-expanded="false">
318 + <span class="hamburger-shapes"></span>
319 + </button>
320 +
321 +
322 +
323 + <div class="menu-item login-container disclosure-nav">
324 + <div>
325 + <button class="login link link--metis" aria-expanded="true" aria-controls="id_login_menu">LOGIN</button>
326 + <div class="megamenu-content login-submenu" id="id_login_menu">
327 + <div class="container">
328 + <div class="row">
329 + <div class="offset-md-9 col-sm-3">
330 + <ul>
331 + <li class="submenu-item">
332 + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://www.mcap.com/mymcap/login?lang=en"><span>MyMCAP - HomeOWNER Portal</span></a>
333 + </li>
334 + <li class="submenu-item">
335 + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://professor.mcap.com/login"><span>Professor - Broker Portal</span></a>
336 + </li>
337 + <li class="submenu-item">
338 + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://investorlink.mcap.com/account/login"><span>Investor Link</span></a>
339 + </li>
340 + <li class="submenu-item">
341 + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://lenderlink.mcap.com/account/login"><span>Lender Link</span></a>
342 + </li>
343 + <li class="submenu-item">
344 + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://mcap.csod.com/ats/careersite/login.aspx"><span>Careers portal</span></a>
345 + </li>
346 + </ul>
347 + </div>
348 + </div>
349 + </div>
350 +
351 + </div>
352 + </div>
353 + </div>
354 +
355 + </div>
356 +
357 + <nav class="d-inline" aria-label="mobile menu">
358 + <div class="mobile-menu" aria-hidden="true" style="display: none;">
359 + <a class="mobile-menu-back" href="#!" role="button">back</a>
360 + <ul>
361 + <li>
362 + <a href="/residential-mortgages" class="top-level-menu">RESIDENTIAL MORTGAGES</a>
363 + <button class="mobile-menu-expander" aria-label="open Residential Mortgages submenu" data-controls="collapsible-1" role="button" aria-expanded="false" aria-controls="collapsible-1"></button>
364 + <ul id="collapsible-1" class="collapsible" aria-hidden="true">
365 + <li>
366 +
367 +
368 +
369 + <a href="javascript:void(0);" class="trigger-last-menu">Advice</a>
370 + <button class="mobile-menu-clickthrough" aria-label="open Advice submenu" data-controls="collapsible-10" role="button" aria-expanded="false" aria-controls="collapsible-10"></button>
371 +
372 + <ul id="collapsible-10">
373 + <li>
374 + <a class="" href="/residential-mortgages/advice/first-time-home-buyer">Buying Your First Home</a>
375 + </li>
376 + <li>
377 + <a class="" href="/residential-mortgages/advice/existing-home-buyer">Buying Your Next Home</a>
378 + </li>
379 + <li>
380 + <a class="" href="/residential-mortgages/advice/refinance">Refinancing Your Mortgage</a>
381 + </li>
382 + <li>
383 + <a class="" href="/residential-mortgages/advice/secondary-property">Buying a Second Property</a>
384 + </li>
385 + <li>
386 + <a class="" href="/residential-mortgages/advice/renewals">Renewing Your Mortgage</a>
387 + </li>
388 + <li>
389 + <a class="" href="/residential-mortgages/advice/switch-to-mcap">Switching to MCAP</a>
390 + </li>
391 + <li>
392 + <a class="text-accent-green" href="/residential-mortgages/advice/mortgage-rates-canada">Mortgage Rates</a>
393 + </li>
394 + </ul>
395 + </li>
396 + <li>
397 +
398 +
399 +
400 + <a href="javascript:void(0);" class="trigger-last-menu">Products</a>
401 + <button class="mobile-menu-clickthrough" aria-label="open Products submenu" data-controls="collapsible-7077" role="button" aria-expanded="false" aria-controls="collapsible-7077"></button>
402 +
403 + <ul id="collapsible-7077">
404 + <li>
405 + <a class="" href="/residential-mortgages/products/our-mortgages">MCAP Mortgages</a>
406 + </li>
407 + <li>
408 + <a class="" href="/residential-mortgages/products/mortgage-life-and-disability-insurance">Home Mortgage Protection: Mortgage Life &amp; Disability Insurance</a>
409 + </li>
410 + <li>
411 + <a class="" href="/residential-mortgages/products/home-service-plan">Home Service Plan</a>
412 + </li>
413 + </ul>
414 + </li>
415 + <li>
416 +
417 +
418 +
419 + <a href="javascript:void(0);" class="trigger-last-menu">Programs</a>
420 + <button class="mobile-menu-clickthrough" aria-label="open Programs submenu" data-controls="collapsible-7263" role="button" aria-expanded="false" aria-controls="collapsible-7263"></button>
421 +
422 + <ul id="collapsible-7263">
423 + <li>
424 + <a class="" href="/residential-mortgages/programs/property-tax-service">Property Tax Service</a>
425 + </li>
426 + <li>
427 + <a class="" href="/residential-mortgages/programs/register-for-key-to-hope">Key to Hope™ - Supporting Habitat for Humanity</a>
428 + </li>
429 + <li>
430 + <a class="" href="/residential-mortgages/programs/myhome-sweepstakes">MyHome Sweepstakes</a>
431 + </li>
432 + </ul>
433 + </li>
434 + <li>
435 +
436 +
437 +
438 + <a href="javascript:void(0);" class="trigger-last-menu">Resources</a>
439 + <button class="mobile-menu-clickthrough" aria-label="open Resources submenu" data-controls="collapsible-1010" role="button" aria-expanded="false" aria-controls="collapsible-1010"></button>
440 +
441 + <ul id="collapsible-1010">
442 + <li>
443 + <a class="" href="/residential-mortgages/resources/satisfying-your-mortgage-conditions">Satisfying Your Mortgage Conditions</a>
444 + </li>
445 + <li>
446 + <a class="" href="/residential-mortgages/resources/payment-assistance">Payment Assistance</a>
447 + </li>
448 + <li>
449 + <a class="" href="/residential-mortgages/resources/mortgage-documents">Mortgage Documents</a>
450 + </li>
451 + <li>
452 + <a class="" href="/residential-mortgages/resources/mortgage-payment-calculator">Mortgage Payment Calculator</a>
453 + </li>
454 + <li>
455 + <a class="" href="/residential-mortgages/resources/mortgage-videos">Mortgage Videos</a>
456 + </li>
457 + <li>
458 + <a class="" href="/residential-mortgages/resources/common-mortgage-terminology">Mortgage Glossary</a>
459 + </li>
460 + <li>
461 + <a class="" href="/residential-mortgages/resources/mymcap">MyMCAP Homeowner Portal</a>
462 + </li>
463 + </ul>
464 + </li>
465 + <li>
466 +
467 +
468 +
469 + <a href="javascript:void(0);" class="trigger-last-menu">For Brokers</a>
470 + <button class="mobile-menu-clickthrough" aria-label="open For Brokers submenu" data-controls="collapsible-11" role="button" aria-expanded="false" aria-controls="collapsible-11"></button>
471 +
472 + <ul id="collapsible-11">
473 + <li>
474 + <a class="" href="/residential-mortgages/for-brokers/why-work-with-mcap">Why Work with MCAP</a>
475 + </li>
476 + <li>
477 + <a class="" href="/residential-mortgages/for-brokers/earn-rewards-and-compensation">Broker Rewards &amp; Compensation</a>
478 + </li>
479 + <li>
480 + <a class="" href="/residential-mortgages/for-brokers/national-sales-team">National Sales Team</a>
481 + </li>
482 + </ul>
483 + </li>
484 + <li>
485 +
486 +
487 +
488 + <a href="/residential-mortgages/blog">Blog<span></span></a>
489 +
490 + <ul id="collapsible-7283">
491 + </ul>
492 + </li>
493 + </ul>
494 + </li>
495 + <li>
496 + <a href="/commercial-mortgages" class="top-level-menu">COMMERCIAL MORTGAGES</a>
497 + <button class="mobile-menu-expander" aria-label="open Commercial Mortgages submenu" data-controls="collapsible-2" role="button" aria-expanded="false" aria-controls="collapsible-2"></button>
498 + <ul id="collapsible-2" class="collapsible" aria-hidden="true">
499 + <li>
500 +
501 +
502 +
503 + <a href="/commercial-mortgages/products">Products<span></span></a>
504 +
505 + <ul id="collapsible-1013">
506 + </ul>
507 + </li>
508 + <li>
509 +
510 +
511 +
512 + <a href="/commercial-mortgages/commercial-mortgages-team">Commercial Mortgages Team<span></span></a>
513 +
514 + <ul id="collapsible-2002">
515 + </ul>
516 + </li>
517 + <li>
518 +
519 +
520 +
521 + <a href="/commercial-mortgages/recent-financings">Recent Financings<span></span></a>
522 +
523 + <ul id="collapsible-7175">
524 + </ul>
525 + </li>
526 + <li>
527 +
528 +
529 +
530 + <a href="/commercial-mortgages/commercial-process">Commercial Mortgage Process<span></span></a>
531 +
532 + <ul id="collapsible-7167">
533 + </ul>
534 + </li>
535 + <li>
536 +
537 +
538 +
539 + <a href="/commercial-mortgages/newsletter">Newsletter<span></span></a>
540 +
541 + <ul id="collapsible-7327">
542 + </ul>
543 + </li>
544 + <li>
545 +
546 +
547 +
548 + <a href="/commercial-mortgages/blog">Blog<span></span></a>
549 +
550 + <ul id="collapsible-7284">
551 + </ul>
552 + </li>
553 + </ul>
554 + </li>
555 + <li>
556 + <a href="/development-finance" class="top-level-menu">DEVELOPMENT FINANCE</a>
557 + <button class="mobile-menu-expander" aria-label="open Development Finance submenu" data-controls="collapsible-3" role="button" aria-expanded="false" aria-controls="collapsible-3"></button>
558 + <ul id="collapsible-3" class="collapsible" aria-hidden="true">
559 + <li>
560 +
561 +
562 +
563 + <a href="/development-finance/financing-options">Financing Categories<span></span></a>
564 +
565 + <ul id="collapsible-1008">
566 + </ul>
567 + </li>
568 + <li>
569 +
570 +
571 +
572 + <a href="/development-finance/recent-financings">Recent Financings<span></span></a>
573 +
574 + <ul id="collapsible-7135">
575 + </ul>
576 + </li>
577 + <li>
578 +
579 +
580 +
581 + <a href="/development-finance/development-finance-team">Development Finance Team<span></span></a>
582 +
583 + <ul id="collapsible-7096">
584 + </ul>
585 + </li>
586 + <li>
587 +
588 +
589 +
590 + <a href="/development-finance/blog">Blog<span></span></a>
591 +
592 + <ul id="collapsible-7285">
593 + </ul>
594 + </li>
595 + <li>
596 +
597 +
598 +
599 + <a href="/development-finance/land-lot-value-report">Land Lot Value Report<span></span></a>
600 +
601 + <ul id="collapsible-7306">
602 + </ul>
603 + </li>
604 + </ul>
605 + </li>
606 +
607 + <li>
608 + <a href="/corporate/about-mcap" class="top-level-menu">ABOUT MCAP</a>
609 +
610 + <button class="mobile-menu-expander" aria-label="open About MCAP submenu" data-controls="collapsible-4" role="button" aria-expanded="false" aria-controls="collapsible-4"></button>
611 + <ul id="collapsible-4" class="collapsible" aria-hidden="true">
612 + <li>
613 + <a class="" class="" href="/corporate/about-mcap/charitable-initiatives">Charitable Initiatives</a>
614 + </li>
615 + <li>
616 + <a class="" class="" href="/corporate/about-mcap/executive-team">Executive Team</a>
617 + </li>
618 + <li>
619 + <a class="" class="" href="/corporate/about-mcap/blue-culture">Blue Culture</a>
620 + </li>
621 + </ul>
622 +
623 + </li>
624 +
625 + <li>
626 + <a href="/corporate/careers" class="top-level-menu">CAREERS</a>
627 + <button class="mobile-menu-expander" aria-label="open Careers submenu" data-controls="collapsible-7189" role="button" aria-expanded="false" aria-controls="collapsible-7189"></button>
628 + <ul id="collapsible-7189" class="collapsible" aria-hidden="true">
629 + <li>
630 + <a class="" href="/corporate/careers/your-career-journey">Your Career Journey</a>
631 + </li>
632 + <li>
633 + <a class="" href="/corporate/careers/students">Students &amp; New Grads</a>
634 + </li>
635 + <li>
636 + <a class="" href="/corporate/careers/opportunities">Opportunities</a>
637 + </li>
638 + <li>
639 + <a class="" href="/corporate/careers/employee-spotlight">Employee Spotlight</a>
640 + </li>
641 + </ul>
642 +
643 + </li>
644 +
645 + <li>
646 + <a href="/contact-us" class="top-level-menu">CONTACT US</a>
647 + <button class="mobile-menu-expander" aria-label="open Contact Us submenu" data-controls="collapsible-7256" role="button" aria-expanded="false" aria-controls="collapsible-7256"></button>
648 + <ul id="collapsible-7256" class="collapsible" aria-hidden="true">
649 + <li>
650 + <a class="" href="/contact-us/residential-mortgages">Contact The Residential Team</a>
651 + </li>
652 + <li>
653 + <a class="" href="/contact-us/commercial-mortgages">Contact The Commercial Team</a>
654 + </li>
655 + <li>
656 + <a class="" href="/contact-us/development-finance">Development Finance Contact </a>
657 + </li>
658 + <li>
659 + <a class="" href="/contact-us/corporate-office">Corporate Inquiries</a>
660 + </li>
661 + </ul>
662 +
663 + </li>
664 +
665 + <li class="mobile-lang-toggle">
666 + <a class="small font-weight-300" href="/fr/residentiel/conseils/taux-hypothecaires-canada">FR</a>
667 + <br /><br /><a class="small font-weight-300" href="/residential-mortgages/resources/find-a-mortgage-broker">FIND A BROKER</a>
668 +
669 + </li>
670 + <li>
671 + <a href="#!" class="top-level-menu collapse-trigger menu-trigger" data-controls="login-collapsible">Login</a>
672 + <button class="mobile-menu-expander" aria-label="open Login submenu" data-controls="login-collapsible" role="button" aria-expanded="false" aria-controls="login-collapsible"></button>
673 + <ul class="collapsible" id="login-collapsible" aria-hidden="true">
674 + <li class="signin-link">
675 + <a class="signin-link" target="_blank" href="https://www.mcap.com/mymcap/login?lang=en">MyMCAP - HomeOWNER Portal</a>
676 + </li>
677 + <li class="signin-link">
678 + <a class="signin-link" target="_blank" href="https://professor.mcap.com/login">Professor - Broker Portal</a>
679 + </li>
680 + <li class="signin-link">
681 + <a class="signin-link" target="_blank" href="https://investorlink.mcap.com/account/login">Investor Link</a>
682 + </li>
683 + <li class="signin-link">
684 + <a class="signin-link" target="_blank" href="https://lenderlink.mcap.com/account/login">Lender Link</a>
685 + </li>
686 + <li class="signin-link">
687 + <a class="signin-link" target="_blank" href="https://mcap.csod.com/ats/careersite/login.aspx">Careers portal</a>
688 + </li>
689 + </ul>
690 + </li>
691 +
692 + </ul>
693 + </div>
694 + </nav>
695 +
696 + </div>
697 +</header>
698 +
699 +<script type="text/javascript">
700 +
701 +
702 +
703 + setTimeout(function () {
704 + $('#SearchForm').submit(function () {
705 +
706 + if ($.trim($("#search").val()) === "") {
707 + return false;
708 + }
709 + });
710 +
711 + $('#search').keypress(function (e) {
712 +
713 + var key = e.which;
714 +
715 + if (key == 13) // the enter key code
716 + {
717 + if (window.location.href.indexOf('/fr') >= 0) {
718 + changeSearchLanguage('fr');
719 + event.preventDefault();
720 + } else {
721 + console.log("en");
722 + changeSearchLanguage('en');
723 + event.preventDefault();
724 + }
725 + return false;
726 + }
727 +
728 + });
729 +
730 +
731 + $('#englishSearch').click(function (event) {
732 + changeSearchLanguage('en');
733 + event.preventDefault();
734 + });
735 +
736 + $('#frenchSearch').click(function (event) {
737 + changeSearchLanguage('fr');
738 + event.preventDefault();
739 + });
740 +
741 + }, 500);
742 +
743 + function changeSearchLanguage(language) {
744 +
745 + console.log("changeSearchLanguage");
746 + var form = $('#__AjaxAntiForgeryForm');
747 + var token = $('input[name="__RequestVerificationToken"]', form).val();
748 +
749 + var searchQuery = '';
750 + if ($.trim($("#search").val()) != '') {
751 + searchQuery = "&isModern=true&search=" + $.trim($("#search").val());
752 + }
753 +
754 +
755 + var location;
756 + if (!(window.location.href.indexOf('/fr/') >= 0) && language === 'fr') {
757 + location = window.location.protocol +
758 + '//' +
759 + window.location.hostname +
760 + ':' +
761 + window.location.port +
762 + "/fr/Search?languageCode=" +
763 + language +
764 + searchQuery;
765 + } else if (window.location.href.indexOf('/fr/') >= 0 && language === 'en') {
766 + location = window.location.protocol +
767 + '//' +
768 + window.location.hostname +
769 + ':' +
770 + window.location.port +
771 + "/" +
772 + window.location.pathname +
773 + "?languageCode=" +
774 + language +
775 + searchQuery;
776 + location = location.replace('/fr/', '');
777 + } else if (language === 'fr') {
778 + location = window.location.protocol +
779 + '//' +
780 + window.location.hostname +
781 + ':' +
782 + window.location.port +
783 + "/fr/Search?languageCode=" +
784 + language +
785 + searchQuery;
786 + } else {
787 + location = window.location.protocol +
788 + '//' +
789 + window.location.hostname +
790 + ':' +
791 + window.location.port +
792 + '/Search?languageCode=' +
793 + language +
794 + searchQuery;
795 + }
796 +
797 + console.log("location", location);
798 + window.location.href = location;
799 + }
800 +
801 +
802 +</script>
803 +
804 +
805 + <main id="main">
806 +
807 +
808 +
809 +
810 +
811 +
812 +
813 +
814 +
815 +
816 +<div class="jumbotron jumbotron-fluid bg-primary-blue" id="rimagebanner_1">
817 + <div class="container">
818 + <div class="row">
819 + <div class="col-md-4 jumbotron-content-wpr">
820 + <h1 class="text-white">Mortgage Rates</h1>
821 + <p class="text-white">
822 + MCAP offers competitive rates — plus other mortgage features — to help you finance your next home.
823 + </p>
824 +
825 +
826 +
827 +
828 + </div>
829 +
830 +
831 + </div>
832 + </div>
833 +
834 +
835 + <div class="jumbotron-image-container-desktop mcap-polygon-left-clip">
836 + <img src="/Content/MCAP/UploadedImages/advice-rates-hero1_6235ae4.jpg" class="obj-pos-h-center" alt="" />
837 + </div>
838 + <div class="jumbotron-image-container-mobile mcap-polygon-left-clip-mobile">
839 + <img src="/Content/MCAP/UploadedImages/advice-rates-hero1_6235ae4.jpg" class="obj-pos-h-center" alt="" />
840 + </div>
841 +</div>
842 +
843 +<script type="text/javascript">
844 + setTimeout(function () {
845 + $("#btnHero_1").click(function () {
846 + location.href = '';
847 + });
848 + }, 500);
849 +</script>
850 +
851 +
852 +
853 +<div class="container-fluid" id="limagecnt_2">
854 + <div class="container">
855 + <div class="row mb-5 article-list-row big-img">
856 + <div class="col-sm-6 pr-0">
857 + <div class="article-img">
858 + <img src="/Content/MCAP/UploadedImages/advice-rates-content2_0f334a4.jpg" alt="" />
859 + </div>
860 + </div>
861 + <div class="col-sm-6 pl-sm-4">
862 + <div class="article-body">
863 + <!--Title-->
864 + <h2 class="text-primary-blue h3">There’s more to consider than rates</h2>
865 +
866 + <!--Description-->
867 + <p class="text-tertiary-grey">
868 + When buying a home, mortgage rates are an important part of the conversation — but they’re not the whole story. When choosing a mortgage, it’s also important to consider:
869 + </p>
870 +
871 + <!--Bullet List-->
872 + <ul class="disc-list text-tertiary-grey font-weight-300">
873 + <li>The flexibility of the payment schedule</li>
874 + <li>Available options to pay down the mortgage faster</li>
875 + <li>Whether you can take your mortgage with you when you move</li>
876 + </ul>
877 +
878 + <!--Link-->
879 + <p class="mt-1">
880 + <a href="/residential-mortgages/products/our-mortgages" class="green-arrow-link d-inline-block font-weight-700 text-underline">View MCAP mortgages</a>
881 + </p>
882 +
883 +
884 + </div>
885 + </div>
886 + </div>
887 + </div>
888 +</div>
889 +
890 +
891 +<div class="container-fluid" id="rimagecnt_3">
892 + <div class="container">
893 + <div class="row my-5 article-list-row big-img d-flex flex-column-reverse flex-sm-row">
894 + <div class="col-sm-6 pr-0">
895 + <div class="article-body">
896 + <!--Title-->
897 + <h2 class="text-primary-blue h3">Finding the right mortgage</h2>
898 +
899 + <!--Description-->
900 + <p class="text-tertiary-grey">
901 + Do you prefer the stability of a fixed rate or the flexibility of a variable rate? Are you planning to be in your home for a long time or only for a specific period of time? Your priorities, goals, and lifestyle all factor into your mortgage decision. A broker can help guide you to the mortgage that’s right for you.
902 + </p>
903 +
904 + <!--Bullet List-->
905 +
906 + <!--Link-->
907 + <p class="mt-1">
908 + <a href="/residential-mortgages/resources/find-a-mortgage-broker" class="green-arrow-link d-inline-block font-weight-700 text-underline">Find a mortgage broker</a>
909 + </p>
910 +
911 +
912 + </div>
913 + </div>
914 + <div class="col-sm-6 pl-sm-4">
915 + <div class="article-img">
916 + <img src="/Content/MCAP/UploadedImages/advice-rates-content2-2_bcd2cf4.jpg" alt="" />
917 + </div>
918 + </div>
919 + </div>
920 + </div>
921 +</div>
922 +
923 +
924 +
925 +<div class="container-fluid charts1 bg-accent-superlight-grey" id="comparison_4">
926 + <div class="container">
927 + <div class="row">
928 + <div class="col-sm-12 d-flex flex-column px-0">
929 + <h2 class="text-left text-sm-center font-weight-700 text-primary-blue">Fixed vs. Adjustable Rate Mortgages</h2>
930 + <p class="text-left text-sm-center text-tertiary-grey mb-30">
931 + Before deciding whether a fixed or adjustable rate mortgage is right for you, take a look at the features of each mortgage type below.
932 + </p>
933 +
934 + <div class="compare-container eq-h" data-col-sel=".compare-col">
935 + <div class="col-left float-left compare-col">
936 + <h3 class="text-primary-blue mb-20">Fixed</h3>
937 + <p class="text-tertiary-grey plus-p">
938 + <span class="text-accent-green font-weight-700">+ </span>The interest rate is locked in for the full term of the mortgage
939 + </p>
940 + <p class="text-tertiary-grey plus-p">
941 + <span class="text-accent-green font-weight-700">+ </span>Principal and interest payments are guaranteed not to change throughout your term
942 + </p>
943 + <p class="text-tertiary-grey plus-p">
944 + <span class="text-accent-green font-weight-700">+ </span>You have the option to pay down your mortgage faster with certain lump-sum and pre-payment privileges
945 + </p>
946 + </div>
947 + <div class="col-right float-left compare-col">
948 + <h3 class="text-primary-blue mb-20">Adjustable</h3>
949 + <p class="text-tertiary-grey plus-p">
950 + <span class="text-accent-green font-weight-700">+ </span>If interest rates fluctuate up or down your mortgage rate will do the same
951 + </p>
952 + <p class="text-tertiary-grey plus-p">
953 + <span class="text-accent-green font-weight-700">+ </span>Your regular payment will also go up or down in relation to the rise and fall of interest rates
954 + </p>
955 + <p class="text-tertiary-grey plus-p">
956 + <span class="text-accent-green font-weight-700">+ </span>Provides the option to convert to a fixed rate mortgage anytime — so you can take advantage of falling rates
957 + </p>
958 + <p class="text-tertiary-grey plus-p">
959 + <span class="text-accent-green font-weight-700">+ </span>You have the option to pay down your mortgage faster with certain lump-sum and pre-payment privileges
960 + </p>
961 + </div>
962 + </div>
963 +
964 + </div>
965 + </div>
966 + <div class="row">
967 + <div class="col-sm-12 text-center">
968 + <!-- <p> -->
969 + <button class="btn btn-primary d-inline-block" id="cmpBtn_4">CALCULATE</button>
970 + <!-- </p> -->
971 + <p class="text-center text-tertiary-grey mt-2">
972 + Discover how much your mortgage payments could be and compare different mortgage options to find what works best for you.
973 + </p>
974 + </div>
975 + </div>
976 + </div>
977 +</div>
978 +
979 +
980 +<script type="text/javascript">
981 + $(function() {
982 + $("#cmpBtn_4").click(function () {
983 + location.href = '/residential-mortgages/resources/mortgage-payment-calculator';
984 + });
985 + });
986 +</script>
987 +
988 +
989 +<div class="container-fluid big-blue-bar simple d-flex justify-content-center flex-column inverse-bg-sm mb-5 prime-rate-module" id="ctap_5">
990 + <div class="container text-left px-0 px-sm-3">
991 + <div class="row">
992 + <div class="col-lg-6 col-md-5 top-text-container">
993 + <h3 class="text-white mb-1 font-36 font-weight-700">Current prime rate</h3>
994 + <p class="text-white mb-0 font-weight-300">The prime rate is the annual interest rate that major banks and lenders within Canada use to set variable-rate mortgages, such as the MCAP adjustable rate mortgage. The prime rate is influenced by the rate set by the Bank of Canada.<br><a href="/residential-mortgages/advice/mortgage-rates-canada/prime-rate-history">View historical rates</a></p>
995 + </div>
996 + <div class="offset-0 col-6 offset-md-1 col-md-3 col-lg-2 d-flex align-items-start justify-content-center flex-column">
997 + <p class="text-white mb-0 font-weight-300 align-self-start mb-3">MCAP Prime Rate</p>
998 + <p class="h2 round-number-box text-white bg-primary-blue font-weight-700 text-center">
999 + 4.45%
1000 + </p>
1001 + </div>
1002 + <div class="col-6 col-md-3 col-lg-3 d-flex align-items-center justify-content-start">
1003 + <p class="text-white big mt-4 font-weight-700 pl-3 pt-3">
1004 + Effective October 30, 2025
1005 + </p>
1006 + </div>
1007 + </div>
1008 +
1009 + </div>
1010 +</div>
1011 +
1012 +
1013 + <div class="container-fluid bg-accent-superlight-grey cta-hero cta-clipped" id="fwbanner_6">
1014 + <div class="cta-hero-image-container-desktop mcap-polygon-right-clip-banner">
1015 + <img src="/Content/MCAP/UploadedImages/Enrich-Your-Mortgage-cta6_1053154.jpg" alt="" class="obj-pos-h-center" />
1016 + </div>
1017 +
1018 + <div class="container mt-2 mt-sm-0">
1019 + <div class="row">
1020 + <div class="offset-0 offset-sm-6 col-sm-6 cta-clipped-text">
1021 + <h2 class="text-primary-blue mb-30">Enrich Your Mortgage Rate Knowledge</h2>
1022 + <p class="small text-tertiary-grey mb-30 font-weight-300">
1023 + The mortgage process can be complex but we’re here to help. Find the answers to all your mortgage, rate and payment questions in our ultimate guide to mortgage rates in Canada.
1024 + </p>
1025 + <a href="https://www.mcap.com/residential-mortgages/advice/mortgage-rates-canada/the-ultimate-guide-to-mortgage-rates-in-canada" class="green-arrow-link text-underline">Explore the Guide</a>
1026 + </div>
1027 +
1028 + </div>
1029 + </div>
1030 + </div>
1031 +
1032 +
1033 +
1034 +<div class="container-fluid big-blue-bar" id="cta_7">
1035 + <div class="container text-center">
1036 + <h2 class="text-white h3">Talk to a broker for our current rates</h2>
1037 + <p class="text-white h4">MCAP mortgage brokers can walk you through our current mortgage rates and help you choose a mortgage that meets your needs.</p>
1038 + <button class="btn btn-tertiary" id="contactBtn_7" data-url="/residential-mortgages/resources/find-a-mortgage-broker">FIND A BROKER</button>
1039 +
1040 + </div>
1041 +</div>
1042 +
1043 + <script type="text/javascript">
1044 + setTimeout(function () {
1045 + $("#contactBtn_7").click(function () {
1046 + location.href = '/residential-mortgages/resources/find-a-mortgage-broker';
1047 + });
1048 + }, 500);
1049 + </script>
1050 +
1051 +
1052 +
1053 +
1054 +
1055 + </main>
1056 +
1057 +
1058 +
1059 + <!-- Footer -->
1060 + <footer>
1061 + <div class="footer container-fluid">
1062 + <div class="container">
1063 + <div class="row">
1064 + <div class="col-sm-3 footer-logo-container">
1065 + <img class="footer-logo" src="/Content/MCAP/Modern/assets/images/logos/mcap-inverse.svg" alt="MCAP logo" />
1066 + </div>
1067 + <div class="col-md-2">
1068 + <ul class="footer-links">
1069 + <li>
1070 + <span class="font-weight-300">COMPANY</span>
1071 + </li>
1072 +
1073 + <li>
1074 + <a href="/corporate/about-mcap">ABOUT MCAP</a>
1075 + </li>
1076 +
1077 + <li>
1078 + <a href="/corporate/careers">CAREERS</a>
1079 + </li>
1080 + </ul>
1081 + </div>
1082 + <div class="col-md-3">
1083 + <ul class="footer-links">
1084 + <li>
1085 + <span class="font-weight-300">INFO</span>
1086 + </li>
1087 +
1088 + <li>
1089 + <a href="/corporate/institutional-investor">INSTITUTIONAL INVESTOR</a>
1090 + </li>
1091 +
1092 + <li>
1093 + <a href="/corporate/outsourcing-mortgages">OUTSOURCING MORTGAGES</a>
1094 + </li>
1095 + </ul>
1096 + </div>
1097 + <div class="col-md-2">
1098 + <ul class="footer-links social-links">
1099 + <li>
1100 + <a href="https://www.linkedin.com/company/mcap/" class="linkedin social-link" target="_blank">LINKEDIN</a>
1101 + </li>
1102 +
1103 + <li>
1104 + <a href="https://www.facebook.com/MCAPResidential/" class="facebook social-link" target="_blank">FACEBOOK</a>
1105 + </li>
1106 +
1107 + </ul>
1108 + </div>
1109 + <div class="top-btn-container">
1110 + <a href="#navbar-main" style="background-color: #FFFFFF; border-radius: 5rem;" class="scroll-top float-end" aria-label="back to top">
1111 + TOP
1112 + </a>
1113 + </div>
1114 + </div>
1115 + <div class="row d-flex d-sm-none mb-0">
1116 + <div class="col-sm-12 mb-0">
1117 + <ul class="footer-links-bottom float-end footer-links-bottom-right">
1118 + <li>
1119 + <a href="/corporate/legal">LEGAL</a> <span>&nbsp;|&nbsp;</span>
1120 + </li>
1121 + <li>
1122 + <a href="/corporate/privacy">SECURITY, PRIVACY &amp; AML</a> <span>&nbsp;|&nbsp;</span>
1123 + </li>
1124 + <li>
1125 + <a href="/corporate/accessibility">ACCESSIBILITY</a> <span>&nbsp;|&nbsp;</span>
1126 + </li>
1127 + <li>
1128 + <a href="/corporate/licenses">LICENSES</a>
1129 + </li>
1130 + </ul>
1131 + </div>
1132 + </div>
1133 + <div class="row border-top">
1134 + <div class="col-sm-3">
1135 + <p>
1136 + &copy; Copyright
1137 + </p>
1138 + </div>
1139 + <div class="col-sm-9 d-none d-sm-block">
1140 + <ul class="footer-links-bottom float-end footer-links-bottom-right">
1141 + <li>
1142 + <a href="/corporate/legal">LEGAL</a> <span>&nbsp;|&nbsp;</span>
1143 + </li>
1144 + <li>
1145 + <a href="/corporate/privacy">SECURITY, PRIVACY &amp; AML</a> <span>&nbsp;|&nbsp;</span>
1146 + </li>
1147 + <li>
1148 + <a href="/corporate/accessibility">ACCESSIBILITY</a> <span>&nbsp;|&nbsp;</span>
1149 + </li>
1150 + <li>
1151 + <a href="/corporate/licenses">LICENSES</a>
1152 + </li>
1153 + </ul>
1154 + </div>
1155 + </div>
1156 + </div>
1157 + </div>
1158 + </footer>
1159 + <svg width="0" height="0" class="mcap-svg">
1160 + <defs>
1161 + <clipPath id="clip-shape" clipPathUnits="objectBoundingBox" transform="scale(0.001396648045, 0.001560062402)">
1162 + <path d="M514 0L0 6.10352e-05V642H530L690.302 364.678C706.104 337.34 705.45 303.496 688.603 276.79L514 0Z" />
1163 + </clipPath>
1164 + </defs>
1165 + </svg>
1166 +
1167 + <svg width="0" height="0" class="mcap-svg">
1168 + <defs>
1169 + <clipPath id="clip-shape-left" clipPathUnits="objectBoundingBox" transform="scale(0.000520833333, 0.001445086705)">
1170 + <path d="M1028 -59L1920 -59V695H973L809.811 415.803C792.613 386.378 792.495 349.995 809.502 320.459L1028 -59Z" />
1171 + </clipPath>
1172 + </defs>
1173 + </svg>
1174 +
1175 + <svg width="0" height="0" class="mcap-svg">
1176 + <defs>
1177 + <clipPath id="clip-shape-vert" clipPathUnits="objectBoundingBox" transform="scale(0.00265957446, 0.00272479564)">
1178 + <path d="M376 272.282L376 0L0 0L0 287.847L137.043 349.108C162.44 360.461 191.536 360.112 216.652 348.153L376 272.282Z" />
1179 + </clipPath>
1180 + </defs>
1181 + </svg>
1182 +
1183 +
1184 + <!--global-->
1185 + <script>
1186 + let numFormatter_en = new Intl.NumberFormat('en-CA', { style: 'currency', currency: 'CAD' });
1187 + let numFormatter_fr = new Intl.NumberFormat('fr-CA', { style: 'currency', currency: 'CAD' });
1188 + let decimalFormatter_en = new Intl.NumberFormat('en-CA', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
1189 + let decimalFormatter_fr = new Intl.NumberFormat('fr-CA', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
1190 + let appLang = 'True' === 'True' ? 'en' : 'fr';
1191 + </script>
1192 + <!-- Bootstrap core JS-->
1193 + <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
1194 + <script src="/Scripts/bootstrap.bundle.min.js"></script>
1195 + <!-- Core theme JS-->
1196 + <script src="/Content/MCAP/Modern/js/scripts.js?v=3"></script>
1197 + <!-- Core plugins-->
1198 + <script src="/Content/MCAP/Modern/js/custom-select.min.js"></script>
1199 + <script src="/Content/MCAP/Modern/js/tiny-slider.js"></script>
1200 +
1201 + <script src="/Content/MCAP/Modern/js/MenubarLinks.js"></script>
1202 + <script src="/Content/MCAP/Modern/js/MenubarItemLinks.js"></script>
1203 + <script src="/Content/MCAP/Modern/js/PopupMenuLinks.js"></script>
1204 + <script src="/Content/MCAP/Modern/js/PopupMenuItemLinks.js"></script>
1205 + <script src="/Content/MCAP/Modern/js/disclosureMenu.js"></script>
1206 + <script src="/Content/MCAP/Modern/js/listbox.js"></script>
1207 + <script src="/Content/MCAP/Modern/js/listbox-collapsible.js"></script>
1208 + <script src="/Content/MCAP/Modern/js/utils.js"></script>
1209 +
1210 +
1211 +<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
1212 +
1213 + <div id="consent-popup">
1214 + <h2 class="titleText">We value your privacy</h2>
1215 + <div id="consent-popup-content-container">
1216 + <p id="consent-popup-content">
1217 + By clicking “ACCEPT ALL”, you consent to our use of cookies and other
1218 + technologies that collect information about website visitor activity to
1219 + enhance your browsing experience, analyze our website usage and traffic,
1220 + and serve personalized ads. View our
1221 + <a id="privacy-link" href="/corporate/privacy" target="_blank" rel="noopener"
1222 + >Privacy page</a
1223 + >
1224 + to learn more.
1225 + </p>
1226 + </div>
1227 +
1228 + <div class="button-row center">
1229 + <button id="accept-consent" class="btn btn-tertiary text-uppercase btn-margin-right" type="submit">
1230 + Accept All</button
1231 + ><button id="reject-consent" class="btn btn-tertiary text-uppercase" type="submit">
1232 + Reject All
1233 + </button>
1234 + </div>
1235 +</div>
1236 +
1237 + <script>
1238 + var menubar = new Menubar(document.getElementById('mainNav'));
1239 + menubar.init();
1240 +
1241 + $('#accept-consent').click(async function () {
1242 + $(this).parent().parent().hide();
1243 + try {
1244 + let response = await fetch('../accept-consent');
1245 + if (!response) {
1246 + throw new Error('Network response was not ok')
1247 + }
1248 + }
1249 + catch (error) {
1250 + console.log("There was a problem with fetch operation", error)
1251 + }
1252 + location.reload();
1253 + });
1254 +
1255 + $('#reject-consent').click(async function () {
1256 + $(this).parent().parent().hide();
1257 + try {
1258 + let response = await fetch('../reject-consent');
1259 + if (!response) {
1260 + throw new Error('Network response was not ok')
1261 + }
1262 + }
1263 + catch (error) {
1264 + console.log("There was a problem with fetch operation", error)
1265 + }
1266 + location.reload();
1267 + });
1268 + </script>
1269 +
1270 +
1271 +
1272 + <style>
1273 + #consent-popup {
1274 + position: sticky;
1275 + width: 100%;
1276 + background: #2A36A9;
1277 + bottom: 0;
1278 + left: 0;
1279 + padding: 20px;
1280 + z-index: 2;
1281 + .titleText
1282 +
1283 + {
1284 + font-size: 18px;
1285 + text-align: center;
1286 + color: #fff;
1287 + margin-bottom: 0.5rem;
1288 + }
1289 +
1290 + .contentText {
1291 + text-align: center;
1292 + color: white;
1293 + max-width: 1200px;
1294 + margin: 0 auto;
1295 + p, a
1296 +
1297 + {
1298 + color: white;
1299 + margin-bottom: 15px;
1300 + &:last-child
1301 +
1302 + {
1303 + margin-bottom: 0px;
1304 + }
1305 +
1306 + }
1307 + }
1308 +
1309 + .button-row {
1310 + margin-top: 1.2rem;
1311 + display: flex;
1312 + justify-content: center;
1313 + .button-consent
1314 +
1315 + {
1316 + margin-right: 30px;
1317 + &:last-child
1318 +
1319 + {
1320 + margin-right: 0px;
1321 + }
1322 +
1323 + }
1324 +
1325 + .button--secondary {
1326 + background:;
1327 + border: 1px solid;
1328 + }
1329 +
1330 + }
1331 + }
1332 +
1333 + #consent-popup-content {
1334 + color: white;
1335 + font-size: 16px;
1336 + }
1337 +
1338 + #consent-popup-content-container {
1339 + text-align: center;
1340 + max-width: 1200px;
1341 + margin: 0 auto;
1342 + }
1343 +
1344 + #privacy-link {
1345 + text-decoration: underline;
1346 + color: #fff;
1347 + }
1348 +
1349 + .btn-margin-right {
1350 + margin-right: 30px;
1351 + }
1352 +
1353 + #accept-consent, #reject-consent {
1354 + background-color: #EFF2F5;
1355 + padding: 0.7rem 1.5rem;
1356 + border-radius: 3px;
1357 + letter-spacing: 0.02em;
1358 + color: #1D2675;
1359 + overflow: hidden;
1360 + position: relative;
1361 + display: inline-block;
1362 + text-align: center;
1363 + vertical-align: middle;
1364 + user-select: none;
1365 + border: 1px solid transparent;
1366 + line-height: 1.5;
1367 + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1368 + }
1369 +
1370 + .footer-links-bottom-right {
1371 + float: right;
1372 + text-align: right;
1373 + }
1374 + </style>
1375 +<script type="text/javascript" src="/_Incapsula_Resource?SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3&ns=10&cb=1205200974" async></script></body>
1376 +</html>
added tests/fixtures/mortgage/national-bank.html +11449 −0
@@ -0,0 +1,12197 @@
1 +hares\",\"url\":\"https://www.nbc.ca/about-us/investors/capital-debt/shares.html\",\"current\":false},{\"label\":\"Legislative covered bonds\",\"url\":\"https://www.nbc.ca/about-us/investors/capital-debt/legislative-covered-bonds.html\",\"current\":false}]}]},{\"label\":\"News and communications\\t\\t\\t\",\"url\":\"https://www.nbc.ca/about-us/news-media.html\",\"current\":false,\"sections\":[{\"label\":\"PRESS RELEASES\",\"url\":\"\",\"current\":false,\"links\":[{\"label\":\"Latest news\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release.html\",\"current\":false},{\"label\":\"Archives 2025\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2025.html\",\"current\":false},{\"label\":\"Archives 2024\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2024.html\",\"current\":false},{\"label\":\"Archives 2023\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2023.html\",\"current\":false},{\"label\":\"Archives 2022\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2022.html\",\"current\":false},{\"label\":\"Archives 2021\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2021.html\",\"current\":false}]},{\"label\":\"FINANCIAL NEWS\",\"url\":\"\",\"current\":false,\"links\":[{\"label\":\"Financial news\",\"url\":\"https://www.nbc.ca/about-us/news-media/financial-news.html\",\"current\":false},{\"label\":\"Economical impact\",\"url\":\"https://www.nbc.ca/personal/advice/economic-impact.html\",\"current\":false},{\"label\":\"Financial analysis\",\"url\":\"https://www.nbc.ca/about-us/news-media/financial-news/financial-analysis.html\",\"current\":false}]}]},{\"label\":\"Careers\\t\\t\",\"url\":\"https://www.nbc.ca/tools-apps/career.html\",\"current\":false,\"sections\":[{\"label\":\" \",\"url\":\"\",\"current\":false,\"links\":[{\"label\":\"Life at National Bank\",\"url\":\"https://www.nbc.ca/tools-apps/career/life-national-bank.html\",\"current\":false},{\"label\":\"All Jobs\",\"url\":\"https://www.nbc.ca/tools-apps/career/all-jobs.html\",\"current\":false},{\"label\":\"Students and Internships\",\"url\":\"https://www.nbc.ca/tools-apps/career/students-internships.html\",\"current\":false}]}]}]}]}","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.react.NavigationMenu.isSecure()":"false","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.react.NavigationMenu.getSecureUrl()":"https://www.nbc.ca/personal/mortgages/rates.html/secure","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.LanguageSwitcher.getLanguageTwoCharName()":"Fr","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.LanguageSwitcher.getCurrentEncodedPagePath()":"5f42a34d6054412cfde38ac6c89caeafe0f5ea3453a3cf05c6beb01e865d6b0cbe4a70c0c4c1deeab76bb6d03abc697af77526d5b3f11211c2b59dca812f00a10eb376b9b5acac44aa49b6afbda9668a","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.LanguageSwitcher.getLanguageFirstLetterCapitalized()":"Français"}},"resourceType":"web-sites-react/components/navigation-menu","path":"/content/bnc/en/jcr:content/navigation-menu","wcmmode":"disabled"}</script><script src="/etc.clientlibs/web-sites-toolkit/clientlibs/web-sites-toolkit/toolkit-clientlib/clientlibs/vendor/lodash.min.a98e817fa80e9f0446305f835cdaa621.js"></script>
2 +<script src="/etc.clientlibs/web-sites/clientlibs/vendor/react.min.45e0671f00ea10ecf34e891cd69b1f90.js"></script>
3 +<script src="/etc.clientlibs/web-sites-react/components/web-sites-react/clientlib.min.fe11aea912e2dd12fabdd3005a3b27d5.js"></script>
4 +<script src="/etc.clientlibs/web-sites/clientlibs/core/eventListenerHandlers.min.6da5ec95ff88986fe5a678195fb73f2e.js"></script>
5 +<script src="/etc.clientlibs/web-sites/clientlibs/core/basepage.min.3097d244e3acdaa1cc46cbe27a844341.js"></script>
6 +<script src="/etc.clientlibs/web-sites/clientlibs/core/sticky.min.f7421d1f70d92b9a74fb9655256bba54.js"></script>
7 +<script src="/etc.clientlibs/web-sites-react/components/navigation-menu/clientlib.min.b4b22ad67a81f751655f944101a7ede1.js"></script>
8 +
9 + </div>
10 +
11 +
12 +
13 +
14 +
15 + <main>
16 +
17 +
18 +
19 +
20 +<!-- on affiche le breadcrumb au besoin -->
21 +
22 +
23 +
24 +
25 +<!-- on affiche pas le titre au besoin -->
26 +
27 +
28 +<div class="container-fluid">
29 + <div class="parsys"><div class="plainhtmlcode section">
30 +<div data-emptytext="HTML Component" class="cq-placeholder"></div>
31 +<style>:target:before {
32 + content: "";
33 + display: block;
34 + height: 57px;
35 + margin-top: -40px;
36 +}</style>
37 +</div>
38 +<div class="capsuleProductsProvider section">
39 +
40 +
41 +<script src="/etc.clientlibs/web-sites/components/product/capsuleProductsProvider/clientlibs/site.min.5c88cf4ad66fd778797b7943e97fc6ab.js"></script>
42 +
43 +
44 +
45 +
46 +
47 +
48 +
49 +
50 + <script>
51 + // All arrays are centralized inside this object
52 + // It contains capsule aliases arrays
53 + // or the only array coming from the Products Provider Component
54 + Websites.Product.Core.setProductMap(JSON.parse("{\x22c1\x22:\x22[{\\\x22taux7ansF\\\x22:\\\x226.400\\\x22,\\\x22tauxPromo4ansF\\\x22:\\\x224,79\\\x22,\\\x22tauxPromo3ansFQ\\\x22:\\\x224,64\\\x22,\\\x22productName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22tac3ans\\\x22:\\\x224,69\\\x22,\\\x22productName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22tauxPromo3ansF\\\x22:\\\x224.64\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22PH\u002DTF\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22tauxDateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22productTypeCd\\\x22:\\\x22MORTGLOAN\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productId\\\x22:\\\x22PH\u002DPRETHYP\\\x22,\\\x22taux1anF\\\x22:\\\x225.490\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tac4ans\\\x22:\\\x224,83\\\x22,\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Mortgage fixed rate\\\x22,\\\x22taux6moisF\\\x22:\\\x226.090\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22taux3moisF\\\x22:\\\x227.840\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22tauxPromo4ansFQ\\\x22:\\\x224,79\\\x22,\\\x22tauxPromo5ansF\\\x22:\\\x224,84\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22tac4ansQ\\\x22:\\\x224,83\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22taux6moisO\\\x22:\\\x229.750\\\x22,\\\x22tac3ansQ\\\x22:\\\x224,69\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22taux2ansIA\\\x22:\\\x22\\\x22,\\\x22taux5ansIA\\\x22:\\\x22\\\x22,\\\x22taux12moisIA\\\x22:\\\x22\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Prêt hypothécaire taux fixe\\\x22,\\\x22tac5ans\\\x22:\\\x224,88\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22taux2ansF\\\x22:\\\x225.240\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22tac5ansQ\\\x22:\\\x224,88\\\x22,\\\x22productConditionId\\\x22:\\\x22PH\u002DTF\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansIA\\\x22:\\\x22\\\x22,\\\x22taux3ansF\\\x22:\\\x226.050\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/hypotheque\/PH\u002DPRETHYP\/OFFRE\u002DGEN\/PH\u002DTF\\\x22,\\\x22productName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansF\\\x22:\\\x225.990\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Mortgage fixed rate\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x22Mortgage fixed rate\\\x22,\\\x22taux1anO\\\x22:\\\x229.650\\\x22,\\\x22tauxPromo5ansFQ\\\x22:\\\x224,84\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux1moisF\\\x22:\\\x224.450\\\x22,\\\x22taux3ansIA\\\x22:\\\x22\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22taux5ansF\\\x22:\\\x226.090\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22taux10ansF\\\x22:\\\x226.800\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22taux6ansF\\\x22:\\\x226.400\\\x22},{\\\x22productName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22PH\u002DTV\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22tauxDateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22productTypeCd\\\x22:\\\x22MORTGLOAN\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productId\\\x22:\\\x22PH\u002DPRETHYP\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Mortgage variable rate\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22tauxPromo5ansF\\\x22:\\\x224,10\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22ecart\\\x22:\\\x220\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22taux2ansIA\\\x22:\\\x22\\\x22,\\\x22taux5ansIA\\\x22:\\\x22\\\x22,\\\x22taux12moisIA\\\x22:\\\x22\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Prêt hypothécaire taux variable\\\x22,\\\x22tac5ans\\\x22:\\\x224,14\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22tac5ansQ\\\x22:\\\x224,14\\\x22,\\\x22productConditionId\\\x22:\\\x22PH\u002DTV\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansIA\\\x22:\\\x22\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/hypotheque\/PH\u002DPRETHYP\/OFFRE\u002DGEN\/PH\u002DTV\\\x22,\\\x22productName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Mortgage variable rate\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x22Mortgage variable rate\\\x22,\\\x22tauxPromo5ansFQ\\\x22:\\\x224,10\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux5ansO\\\x22:\\\x224.450\\\x22,\\\x22taux3ansIA\\\x22:\\\x22\\\x22,\\\x22tauxBase\\\x22:\\\x220,35\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22},{\\\x22productName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22PH\u002DTV\u002DPL\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22tauxDateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22productTypeCd\\\x22:\\\x22MORTGLOAN\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productId\\\x22:\\\x22PH\u002DPRETHYP\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Variable capped\u002Drate mortgage\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22ecart\\\x22:\\\x220.250\\\x22,\\\x22tauxPlafond\\\x22:\\\x225.450\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22taux2ansIA\\\x22:\\\x22\\\x22,\\\x22taux5ansIA\\\x22:\\\x22\\\x22,\\\x22taux12moisIA\\\x22:\\\x22\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Prêt hypothécaire taux variable plafonné\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22PH\u002DTV\u002DPL\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansIA\\\x22:\\\x22\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/hypotheque\/PH\u002DPRETHYP\/OFFRE\u002DGEN\/PH\u002DTV\u002DPL\\\x22,\\\x22productName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Variable capped\u002Drate mortgage\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x22Variable capped\u002Drate mortgage\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux5ansO\\\x22:\\\x224.700\\\x22,\\\x22taux3ansIA\\\x22:\\\x22\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22}]\x22,\x22c2\x22:\x22[{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x221000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22tauxAutre\\\x22:\\\x228.200\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Student Line of Credit \\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22ecart\\\x22:\\\x221.000 \\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Fonds de roulement étudiant\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22true\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/OFFRE\u002DGEN\/MCP\u002DETUDNT\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Student Line of Credit \\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x225.450 \\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22ecartAutre\\\x22:\\\x222.750 \\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22packageTypeCd\\\x22:\\\x22DEFAULT\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22RRSP Line of credit \\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22ecart\\\x22:\\\x221.000\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Marge REER\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22true\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/OFFRE\u002DGEN\/MCP\u002DREER\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22RRSP Line of credit \\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x225.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22packageTypeCd\\\x22:\\\x22DEFAULT\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000131\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Home improvement loc\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22ecart\\\x22:\\\x223.000\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Marge de crédit rénovation\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22true\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/OFFRE\u002DGEN\/MCP\u002DRENO\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Home improvement loc\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x227.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22packageTypeCd\\\x22:\\\x22DEFAULT\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22VIRTUOSE\\\x22,\\\x22ecart\\\x22:\\\x227.000\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22Virtuoso\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/VIRTUOSE\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22VIRTUOSE\\\x22,\\\x22packageName\\\x22:\\\x22Virtuoso\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x2211.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22VIRTUOSE\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Virtuose\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PACKAGE\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22interetCredT5\\\x22:\\\x220.010\\\x22,\\\x22interetCredT3\\\x22:\\\x220.010\\\x22,\\\x22interetCredT4\\\x22:\\\x220.010\\\x22,\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22interetCredT1\\\x22:\\\x220.000\\\x22,\\\x22interetCredT2\\\x22:\\\x220.010\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22sciencesSante\\\x22:\\\x224,95\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22infirmier\\\x22:\\\x224,95\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22MCP\u002DTEU\\\x22,\\\x22ecart\\\x22:\\\x221.000\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x227500164\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22All\u002Din\u002DOne Account\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22ingenieur\\\x22:\\\x224,70\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22sante\\\x22:\\\x224,45\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/MCP\u002DTEU\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22MCP\u002DTEU\\\x22,\\\x22packageName\\\x22:\\\x22All\u002Din\u002DOne Account\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x225.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22MCP\u002DTEU\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Tout\u002DEn\u002DUn\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PROGRAM\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22,\\\x22liberal\\\x22:\\\x224 ,70\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22tauxAutre\\\x22:\\\x225.450\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22sciencesSante\\\x22:\\\x225,20\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22infirmier\\\x22:\\\x225,20\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22MCP\u002DMA\u002DPER\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x227500156\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22Personal Line of Credit\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22ingenieur\\\x22:\\\x224,70\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22sante\\\x22:\\\x224,45\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/MCP\u002DMA\u002DPER\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22MCP\u002DMA\u002DPER\\\x22,\\\x22packageName\\\x22:\\\x22Personal Line of Credit\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22MCP\u002DMA\u002DPER\\\x22,\\\x22ecartAutre\\\x22:\\\x221.000\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Marge manœuvre personnelle\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PROGRAM\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22,\\\x22liberal\\\x22:\\\x224,70\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22MCP\u002DHYP\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x227500128\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22Home Equity Line of Credit\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/MCP\u002DHYP\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22MCP\u002DHYP\\\x22,\\\x22packageName\\\x22:\\\x22Home Equity Line of Credit\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22MCP\u002DHYP\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Marge de crédit hypothécaire\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PROGRAM\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22}]\x22}"), true);
55 + </script>
56 +
57 +</div>
58 +<div class="textandimage parbase section">
59 +
60 +
61 +<script src="/etc.clientlibs/web-sites/clientlibs/core/textandimage.min.9c820de2cd8bf947380bedee97d56688.js"></script>
62 +
63 +<link rel="stylesheet" href="/etc.clientlibs/web-sites/clientlibs/core/lightbox.min.52a11ac88f03e7666b3215ec7235efb2.css" type="text/css">
64 +<script src="/etc.clientlibs/web-sites/clientlibs/core/lightbox.min.247e04eae056fe5567a1503aa2fe6b77.js"></script>
65 +
66 +<link rel="stylesheet" href="/etc.clientlibs/web-sites/clientlibs/core/modal.min.9457654facd5992c898d0b9d071341f8.css" type="text/css">
67 +<script src="/etc.clientlibs/web-sites/clientlibs/core/modal.min.ec1acb2c245793c9aca006b573a1c26e.js"></script>
68 +
69 +
70 +
71 +
72 +
73 +
74 +
75 +
76 +
77 +
78 +
79 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_textandimage" class="text-image-container bncr-banner bncr-banner-head"
80 + data-text-image-container-right-left="false">
81 +
82 +
83 +
84 +
85 +
86 +
87 +
88 +
89 +
90 + <div class="row text-image-row"
91 + data-websites-component="/components/textandimage/rowcontainer"
92 +
93 + data-text-image-rowcontainer-bg-type-lg="image"
94 +
95 +
96 +
97 +
98 +
99 +
100 + data-text-image-rowcontainer-style-lg="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-2000x375.jpg')"
101 +
102 +
103 +
104 +
105 +
106 + data-text-image-rowcontainer-height-lg="375"
107 + data-text-image-rowcontainer-width-lg="2000"
108 + data-text-image-rowcontainer-class-lg="backgroundColor1"
109 +
110 + data-text-image-rowcontainer-bg-type-md="image"
111 +
112 +
113 +
114 +
115 +
116 +
117 +
118 +
119 +
120 +
121 +
122 +
123 +
124 + data-text-image-rowcontainer-style-md="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-1199x375.jpg')"
125 +
126 +
127 +
128 +
129 +
130 +
131 +
132 +
133 +
134 + data-text-image-rowcontainer-height-md="375"
135 + data-text-image-rowcontainer-width-md="1199"
136 + data-text-image-rowcontainer-class-md="backgroundColor1"
137 +
138 + data-text-image-rowcontainer-bg-type-sm="image"
139 +
140 +
141 +
142 +
143 +
144 +
145 +
146 +
147 +
148 +
149 +
150 +
151 + data-text-image-rowcontainer-style-sm="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-991x323.jpg')"
152 +
153 +
154 +
155 +
156 +
157 +
158 +
159 +
160 +
161 +
162 + data-text-image-rowcontainer-height-sm="323"
163 + data-text-image-rowcontainer-width-sm="991"
164 + data-text-image-rowcontainer-class-sm="backgroundColor1"
165 +
166 + data-text-image-rowcontainer-bg-type-xs="image"
167 +
168 +
169 +
170 +
171 +
172 +
173 +
174 +
175 +
176 +
177 +
178 + data-text-image-rowcontainer-style-xs="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-767x716_.jpg')"
179 +
180 +
181 +
182 +
183 +
184 +
185 +
186 +
187 +
188 +
189 +
190 + data-text-image-rowcontainer-height-xs="716"
191 + data-text-image-rowcontainer-width-xs="767"
192 + data-text-image-rowcontainer-class-xs="backgroundColor1">
193 +
194 + <div class="col-xs-12 text-image-text-container " ><h1 class="h1variant3">Mortgage rates<br>
195 +</h1>
196 +<p class="chapeau3">See current rates<br>
197 +</p>
198 +<p class="chapeau3"><a href="https://app.bnc.ca/forms/mortgage/preauth?lang=en" class="btnRTE3 btn-arrow btn" target="_blank">Protect your rate</a></p>
199 +<p class="chapeau3"><a href="https://retail.appointment.bnc.ca/service?category=mo&amp;lang=en&amp;utm_medium=BNCWEBCA&amp;utm_source=14" class="link-underlined__darker" target="_blank" hrefnoextension="false">Make an appointment</a></p>
200 +</div>
201 + </div>
202 +
203 +
204 +
205 +
206 +
207 +
208 +
209 +
210 +
211 +
212 +
213 + <script>
214 +
215 + (function(){
216 +
217 + var dataLayerViewEventName = '' || '';
218 + var dataLayerViewLayerProperties = [];
219 + var $el;
220 +
221 +
222 +
223 + if(dataLayerViewEventName.trim().length) {
224 +
225 + var obj = {
226 + dataLayerViewEventName: dataLayerViewEventName,
227 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_textandimage" ,
228 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
229 + };
230 +
231 + // IE11 trick (because IE11 don't know document.currentScript):
232 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
233 + if(document.currentScript){
234 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
235 + } else {
236 + var scripts = document.getElementsByTagName( 'script' );
237 + var currentScript = scripts[scripts.length - 1];
238 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
239 + }
240 +
241 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
242 + Websites.DataLayer.cleanViewEventJSON(obj)));
243 + $el.setAttribute("data-dataLayerViewEvent", 'true');
244 +
245 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
246 +
247 + }
248 +
249 + })();
250 +
251 + </script>
252 +
253 +</div>
254 +
255 + <script>
256 +
257 + /**
258 + * clickEventDownloadHandler()
259 + * Is used to handle download image action selected as an opening mode
260 + *
261 + */
262 +
263 + var firstDownload = true;
264 +
265 + function clickEventDownloadHandler() {
266 +
267 + var link = this;
268 + var filename = link.dataset.linkpath;
269 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
270 + var fn = filename.substring(filename.lastIndexOf('/')+1);
271 +
272 + if (newFile) {
273 +
274 + if (firstDownload) {
275 + firstDownload = false;
276 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
277 + } else {
278 + this.href = link.href;
279 + }
280 +
281 + this.download = fn;
282 +
283 + } else {
284 + this.download = fn + ".html";
285 + }
286 + }
287 +
288 + </script></div>
289 +<div class="panelContainer section">
290 +
291 +
292 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
293 +
294 +
295 +
296 + <div>
297 +
298 +<script src="/etc.clientlibs/web-sites/clientlibs/vendor/jquery/jquery-sticky-1-0-4.min.b245ebc9b251955a08c1cf747a222d10.js"></script>
299 +<script src="/etc.clientlibs/web-sites/clientlibs/core/stickyBehavior.min.81a4b9df09c15476124998587316faed.js"></script>
300 +<script src="/etc.clientlibs/web-sites-toolkit/core/wcm/components/genericPanel/v1/genericPanel/clientlibs/site.min.8bd3357c8782030bd34e3822ff5765c2.js"></script>
301 +
302 +
303 +
304 +
305 +
306 +
307 +
308 +
309 +
310 +
311 +
312 +
313 +
314 +
315 +
316 +
317 +
318 +
319 +
320 +
321 +
322 +
323 +<div class="panelContainer panelContainerStyle2 "
324 +
325 +
326 + data-websites-component="/components/panelContainer.v1"
327 + data-panel-container-lg-mg=""
328 + data-panel-container-lg-pd=""
329 + data-panel-container-lg-ht=""
330 + data-panel-container-md-mg=""
331 + data-panel-container-md-pd=""
332 + data-panel-container-md-ht=""
333 + data-panel-container-sm-mg=""
334 + data-panel-container-sm-pd=""
335 + data-panel-container-sm-ht=""
336 + data-panel-container-xs-mg=""
337 + data-panel-container-xs-pd=""
338 + data-panel-container-xs-ht=""
339 + data-panel-container-limit="">
340 + <div class="parsys"><div class="panelContainer section">
341 +
342 +
343 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
344 +
345 +
346 +
347 + <div>
348 +
349 +
350 +
351 +
352 +
353 +
354 +
355 +
356 +
357 +
358 +
359 +
360 +
361 +
362 +
363 +
364 +
365 +
366 +
367 +
368 +
369 +
370 +
371 +<div class="panelContainer "
372 +
373 +
374 + data-websites-component="/components/panelContainer.v1"
375 + data-panel-container-lg-mg="5% 0 5% 0"
376 + data-panel-container-lg-pd=""
377 + data-panel-container-lg-ht=""
378 + data-panel-container-md-mg="5% 0 5% 0"
379 + data-panel-container-md-pd=""
380 + data-panel-container-md-ht=""
381 + data-panel-container-sm-mg="5% 0 5% 0"
382 + data-panel-container-sm-pd=""
383 + data-panel-container-sm-ht=""
384 + data-panel-container-xs-mg="5% 0 5% 0"
385 + data-panel-container-xs-pd=""
386 + data-panel-container-xs-ht=""
387 + data-panel-container-limit="">
388 + <div class="parsys"><div class="panelContainer section">
389 +
390 +
391 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
392 +
393 +
394 +
395 + <div>
396 +
397 +
398 +
399 +
400 +
401 +
402 +
403 +
404 +
405 +
406 +
407 +
408 +
409 +
410 +
411 +
412 +
413 +
414 +
415 +
416 +
417 +
418 +
419 +<div class="panelContainer background-none "
420 +
421 +
422 + data-websites-component="/components/panelContainer.v1"
423 + data-panel-container-lg-mg="1% 20% 0 0"
424 + data-panel-container-lg-pd=""
425 + data-panel-container-lg-ht=""
426 + data-panel-container-md-mg="1% 20% 0 0"
427 + data-panel-container-md-pd=""
428 + data-panel-container-md-ht=""
429 + data-panel-container-sm-mg="1% 0 0 0"
430 + data-panel-container-sm-pd=""
431 + data-panel-container-sm-ht=""
432 + data-panel-container-xs-mg="1% 0 0 0"
433 + data-panel-container-xs-pd=""
434 + data-panel-container-xs-ht=""
435 + data-panel-container-limit="">
436 + <div class="parsys"><div class="textandimage parbase section">
437 +
438 +
439 +
440 +
441 +
442 +
443 +
444 +
445 +
446 +
447 +
448 +
449 +
450 +
451 +
452 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_1477154735_parsys_textandimage" class="text-image-container at-0155-switch-h2"
453 + data-text-image-container-right-left="false">
454 +
455 +
456 +
457 +
458 +
459 +
460 +
461 +
462 +
463 + <div class="row text-image-row"
464 + data-websites-component="/components/textandimage/rowcontainer"
465 +
466 + data-text-image-rowcontainer-bg-type-lg="none"
467 +
468 +
469 +
470 +
471 +
472 + data-text-image-rowcontainer-height-lg="0"
473 + data-text-image-rowcontainer-width-lg="0"
474 + data-text-image-rowcontainer-class-lg="backgroundColor1"
475 +
476 + data-text-image-rowcontainer-bg-type-md="none"
477 +
478 +
479 +
480 +
481 +
482 + data-text-image-rowcontainer-height-md="0"
483 + data-text-image-rowcontainer-width-md="0"
484 + data-text-image-rowcontainer-class-md="backgroundColor1"
485 +
486 + data-text-image-rowcontainer-bg-type-sm="none"
487 +
488 +
489 +
490 +
491 +
492 + data-text-image-rowcontainer-height-sm="0"
493 + data-text-image-rowcontainer-width-sm="0"
494 + data-text-image-rowcontainer-class-sm="backgroundColor1"
495 +
496 + data-text-image-rowcontainer-bg-type-xs="none"
497 +
498 +
499 +
500 +
501 +
502 + data-text-image-rowcontainer-height-xs="0"
503 + data-text-image-rowcontainer-width-xs="0"
504 + data-text-image-rowcontainer-class-xs="backgroundColor1">
505 +
506 + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="promo"></a>Special offers on certain terms</h2>
507 +</div>
508 + </div>
509 +
510 +
511 +
512 +
513 +
514 +
515 +
516 +
517 +
518 +
519 +
520 + <script>
521 +
522 + (function(){
523 +
524 + var dataLayerViewEventName = '' || '';
525 + var dataLayerViewLayerProperties = [];
526 + var $el;
527 +
528 +
529 +
530 + if(dataLayerViewEventName.trim().length) {
531 +
532 + var obj = {
533 + dataLayerViewEventName: dataLayerViewEventName,
534 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_1477154735_parsys_textandimage" ,
535 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
536 + };
537 +
538 + // IE11 trick (because IE11 don't know document.currentScript):
539 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
540 + if(document.currentScript){
541 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
542 + } else {
543 + var scripts = document.getElementsByTagName( 'script' );
544 + var currentScript = scripts[scripts.length - 1];
545 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
546 + }
547 +
548 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
549 + Websites.DataLayer.cleanViewEventJSON(obj)));
550 + $el.setAttribute("data-dataLayerViewEvent", 'true');
551 +
552 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
553 +
554 + }
555 +
556 + })();
557 +
558 + </script>
559 +
560 +</div>
561 +
562 + <script>
563 +
564 + /**
565 + * clickEventDownloadHandler()
566 + * Is used to handle download image action selected as an opening mode
567 + *
568 + */
569 +
570 + var firstDownload = true;
571 +
572 + function clickEventDownloadHandler() {
573 +
574 + var link = this;
575 + var filename = link.dataset.linkpath;
576 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
577 + var fn = filename.substring(filename.lastIndexOf('/')+1);
578 +
579 + if (newFile) {
580 +
581 + if (firstDownload) {
582 + firstDownload = false;
583 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
584 + } else {
585 + this.href = link.href;
586 + }
587 +
588 + this.download = fn;
589 +
590 + } else {
591 + this.download = fn + ".html";
592 + }
593 + }
594 +
595 + </script></div>
596 +
597 +</div>
598 +
599 +</div>
600 +
601 +
602 +
603 +<!--/* Initialize Js */-->
604 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_1477154735">
605 + if(""){
606 + new Websites.Sticky({
607 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_1477154735",
608 + breakpoint: {
609 + lg: {
610 + to: ""
611 + },
612 + md: {
613 + to: ""
614 + },
615 + sm: {
616 + to: "",
617 + },
618 + xs: {
619 + to: ""
620 + }
621 + }
622 + });
623 + }
624 +</script>
625 +
626 +</div>
627 +</div>
628 +<div class="panelContainer section">
629 +
630 +
631 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
632 +
633 +
634 +
635 + <div>
636 +
637 +
638 +
639 +
640 +
641 +
642 +
643 +
644 +
645 +
646 +
647 +
648 +
649 +
650 +
651 +
652 +
653 +
654 +
655 +
656 +
657 +
658 +
659 +<div class="panelContainer "
660 +
661 +
662 + data-websites-component="/components/panelContainer.v1"
663 + data-panel-container-lg-mg=""
664 + data-panel-container-lg-pd=""
665 + data-panel-container-lg-ht=""
666 + data-panel-container-md-mg=""
667 + data-panel-container-md-pd=""
668 + data-panel-container-md-ht=""
669 + data-panel-container-sm-mg=""
670 + data-panel-container-sm-pd=""
671 + data-panel-container-sm-ht=""
672 + data-panel-container-xs-mg=""
673 + data-panel-container-xs-pd=""
674 + data-panel-container-xs-ht=""
675 + data-panel-container-limit="">
676 + <div class="parsys"><div class="columns parbase section">
677 +
678 +
679 +
680 +<script src="/etc.clientlibs/web-sites/components/columns/clientlibs/site.min.105741b41766cc59fef14e6b39edcf68.js"></script>
681 +
682 +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div>
683 +
684 +
685 +
686 +
687 +
688 +
689 +
690 +
691 +
692 +
693 +
694 +
695 +
696 + <div style=""
697 + class="columns-row row row-eq-height"
698 +
699 + data-style-lg="" data-height-lg=""
700 + data-width-lg=""
701 + data-background-color-lg=""
702 + data-background-color-xs="">
703 + <div style=""
704 + class="col-xs-12 col-sm-12 columns-title "
705 + data-height="" data-width=""
706 + data-style-xs="" data-height-xs=""
707 + data-width-xs="">
708 +
709 + </div>
710 +
711 +
712 +
713 +
714 + <div class="col-xs-12 col-sm-4 column col-first ">
715 + <div class="parsys1 parsys"><div class="panelContainer section">
716 +
717 +
718 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
719 +
720 +
721 +
722 + <div>
723 +
724 +
725 +
726 +
727 +
728 +
729 +
730 +
731 +
732 +
733 +
734 +
735 +
736 +
737 +
738 +
739 +
740 +
741 +
742 +
743 +
744 +
745 +
746 +<div class="panelContainer panel-border panel-border-radius "
747 +
748 +
749 + data-websites-component="/components/panelContainer.v1"
750 + data-panel-container-lg-mg=""
751 + data-panel-container-lg-pd="20px"
752 + data-panel-container-lg-ht=""
753 + data-panel-container-md-mg=""
754 + data-panel-container-md-pd="20px"
755 + data-panel-container-md-ht=""
756 + data-panel-container-sm-mg=""
757 + data-panel-container-sm-pd="20px"
758 + data-panel-container-sm-ht=""
759 + data-panel-container-xs-mg="20px 0 0 0"
760 + data-panel-container-xs-pd="20px"
761 + data-panel-container-xs-ht=""
762 + data-panel-container-limit="">
763 + <div class="parsys"><div class="panelContainer section">
764 +
765 +
766 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
767 +
768 +
769 +
770 + <div>
771 +
772 +
773 +
774 +
775 +
776 +
777 +
778 +
779 +
780 +
781 +
782 +
783 +
784 +
785 +
786 +
787 +
788 +
789 +
790 +
791 +
792 +
793 +
794 +<div class="panelContainer background-tertiary-pinkPastel "
795 +
796 +
797 + data-websites-component="/components/panelContainer.v1"
798 + data-panel-container-lg-mg="0 30%"
799 + data-panel-container-lg-pd="10px 0 0 0"
800 + data-panel-container-lg-ht=""
801 + data-panel-container-md-mg="0 20%"
802 + data-panel-container-md-pd="10px 0 0 0"
803 + data-panel-container-md-ht=""
804 + data-panel-container-sm-mg=""
805 + data-panel-container-sm-pd="10px 0 0 0"
806 + data-panel-container-sm-ht=""
807 + data-panel-container-xs-mg="0 30%"
808 + data-panel-container-xs-pd="10px 0 0 0"
809 + data-panel-container-xs-ht=""
810 + data-panel-container-limit="">
811 + <div class="parsys"><div class="textandimage parbase section">
812 +
813 +
814 +
815 +
816 +
817 +
818 +
819 +
820 +
821 +
822 +
823 +
824 +
825 +
826 +
827 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1939379463_parsys_textandimage" class="text-image-container "
828 + data-text-image-container-right-left="false">
829 +
830 +
831 +
832 +
833 +
834 +
835 +
836 +
837 +
838 + <div class="row text-image-row"
839 + data-websites-component="/components/textandimage/rowcontainer"
840 +
841 + data-text-image-rowcontainer-bg-type-lg="none"
842 +
843 +
844 +
845 +
846 +
847 + data-text-image-rowcontainer-height-lg="0"
848 + data-text-image-rowcontainer-width-lg="0"
849 + data-text-image-rowcontainer-class-lg="backgroundColor72BFC1--80"
850 +
851 + data-text-image-rowcontainer-bg-type-md="none"
852 +
853 +
854 +
855 +
856 +
857 + data-text-image-rowcontainer-height-md="0"
858 + data-text-image-rowcontainer-width-md="0"
859 + data-text-image-rowcontainer-class-md="backgroundColor1"
860 +
861 + data-text-image-rowcontainer-bg-type-sm="none"
862 +
863 +
864 +
865 +
866 +
867 + data-text-image-rowcontainer-height-sm="0"
868 + data-text-image-rowcontainer-width-sm="0"
869 + data-text-image-rowcontainer-class-sm="backgroundColor1"
870 +
871 + data-text-image-rowcontainer-bg-type-xs="none"
872 +
873 +
874 +
875 +
876 +
877 + data-text-image-rowcontainer-height-xs="0"
878 + data-text-image-rowcontainer-width-xs="0"
879 + data-text-image-rowcontainer-class-xs="backgroundColor1">
880 +
881 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>PROMOTION</b></p>
882 +</div>
883 + </div>
884 +
885 +
886 +
887 +
888 +
889 +
890 +
891 +
892 +
893 +
894 +
895 + <script>
896 +
897 + (function(){
898 +
899 + var dataLayerViewEventName = '' || '';
900 + var dataLayerViewLayerProperties = [];
901 + var $el;
902 +
903 +
904 +
905 + if(dataLayerViewEventName.trim().length) {
906 +
907 + var obj = {
908 + dataLayerViewEventName: dataLayerViewEventName,
909 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1939379463_parsys_textandimage" ,
910 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
911 + };
912 +
913 + // IE11 trick (because IE11 don't know document.currentScript):
914 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
915 + if(document.currentScript){
916 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
917 + } else {
918 + var scripts = document.getElementsByTagName( 'script' );
919 + var currentScript = scripts[scripts.length - 1];
920 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
921 + }
922 +
923 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
924 + Websites.DataLayer.cleanViewEventJSON(obj)));
925 + $el.setAttribute("data-dataLayerViewEvent", 'true');
926 +
927 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
928 +
929 + }
930 +
931 + })();
932 +
933 + </script>
934 +
935 +</div>
936 +
937 + <script>
938 +
939 + /**
940 + * clickEventDownloadHandler()
941 + * Is used to handle download image action selected as an opening mode
942 + *
943 + */
944 +
945 + var firstDownload = true;
946 +
947 + function clickEventDownloadHandler() {
948 +
949 + var link = this;
950 + var filename = link.dataset.linkpath;
951 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
952 + var fn = filename.substring(filename.lastIndexOf('/')+1);
953 +
954 + if (newFile) {
955 +
956 + if (firstDownload) {
957 + firstDownload = false;
958 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
959 + } else {
960 + this.href = link.href;
961 + }
962 +
963 + this.download = fn;
964 +
965 + } else {
966 + this.download = fn + ".html";
967 + }
968 + }
969 +
970 + </script></div>
971 +
972 +</div>
973 +
974 +</div>
975 +
976 +
977 +
978 +<!--/* Initialize Js */-->
979 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1939379463">
980 + if(""){
981 + new Websites.Sticky({
982 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1939379463",
983 + breakpoint: {
984 + lg: {
985 + to: "none"
986 + },
987 + md: {
988 + to: "none"
989 + },
990 + sm: {
991 + to: "none",
992 + },
993 + xs: {
994 + to: "none"
995 + }
996 + }
997 + });
998 + }
999 +</script>
1000 +
1001 +</div>
1002 +</div>
1003 +<div class="panelContainer section">
1004 +
1005 +
1006 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
1007 +
1008 +
1009 +
1010 + <div>
1011 +
1012 +
1013 +
1014 +
1015 +
1016 +
1017 +
1018 +
1019 +
1020 +
1021 +
1022 +
1023 +
1024 +
1025 +
1026 +
1027 +
1028 +
1029 +
1030 +
1031 +
1032 +
1033 +
1034 +<div class="panelContainer "
1035 +
1036 +
1037 + data-websites-component="/components/panelContainer.v1"
1038 + data-panel-container-lg-mg="20px"
1039 + data-panel-container-lg-pd=""
1040 + data-panel-container-lg-ht=""
1041 + data-panel-container-md-mg="20px 0 0 0"
1042 + data-panel-container-md-pd=""
1043 + data-panel-container-md-ht=""
1044 + data-panel-container-sm-mg="20px 0 0 0"
1045 + data-panel-container-sm-pd=""
1046 + data-panel-container-sm-ht=""
1047 + data-panel-container-xs-mg="20px 0 0 0"
1048 + data-panel-container-xs-pd=""
1049 + data-panel-container-xs-ht=""
1050 + data-panel-container-limit="">
1051 + <div class="parsys"><div class="textandimage parbase section">
1052 +
1053 +
1054 +
1055 +
1056 +
1057 +
1058 +
1059 +
1060 +
1061 +
1062 +
1063 +
1064 +
1065 +
1066 +
1067 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_parsys_textandimage" class="text-image-container "
1068 + data-text-image-container-right-left="false">
1069 +
1070 +
1071 +
1072 +
1073 +
1074 +
1075 +
1076 +
1077 +
1078 + <div class="row text-image-row"
1079 + data-websites-component="/components/textandimage/rowcontainer"
1080 +
1081 + data-text-image-rowcontainer-bg-type-lg=""
1082 +
1083 +
1084 +
1085 +
1086 +
1087 + data-text-image-rowcontainer-height-lg="0"
1088 + data-text-image-rowcontainer-width-lg="0"
1089 + data-text-image-rowcontainer-class-lg=""
1090 +
1091 + data-text-image-rowcontainer-bg-type-md=""
1092 +
1093 +
1094 +
1095 +
1096 +
1097 + data-text-image-rowcontainer-height-md="0"
1098 + data-text-image-rowcontainer-width-md="0"
1099 + data-text-image-rowcontainer-class-md=""
1100 +
1101 + data-text-image-rowcontainer-bg-type-sm=""
1102 +
1103 +
1104 +
1105 +
1106 +
1107 + data-text-image-rowcontainer-height-sm="0"
1108 + data-text-image-rowcontainer-width-sm="0"
1109 + data-text-image-rowcontainer-class-sm=""
1110 +
1111 + data-text-image-rowcontainer-bg-type-xs=""
1112 +
1113 +
1114 +
1115 +
1116 +
1117 + data-text-image-rowcontainer-height-xs="0"
1118 + data-text-image-rowcontainer-width-xs="0"
1119 + data-text-image-rowcontainer-class-xs="">
1120 +
1121 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>5 year</b>&nbsp;fixed high ratio rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p>
1122 +<p class="chapeau3" style="text-align: center;">4.69%</p>
1123 +</div>
1124 + </div>
1125 +
1126 +
1127 +
1128 +
1129 +
1130 +
1131 +
1132 +
1133 +
1134 +
1135 +
1136 + <script>
1137 +
1138 + (function(){
1139 +
1140 + var dataLayerViewEventName = '' || '';
1141 + var dataLayerViewLayerProperties = [];
1142 + var $el;
1143 +
1144 +
1145 +
1146 + if(dataLayerViewEventName.trim().length) {
1147 +
1148 + var obj = {
1149 + dataLayerViewEventName: dataLayerViewEventName,
1150 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_parsys_textandimage" ,
1151 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
1152 + };
1153 +
1154 + // IE11 trick (because IE11 don't know document.currentScript):
1155 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
1156 + if(document.currentScript){
1157 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1158 + } else {
1159 + var scripts = document.getElementsByTagName( 'script' );
1160 + var currentScript = scripts[scripts.length - 1];
1161 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1162 + }
1163 +
1164 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
1165 + Websites.DataLayer.cleanViewEventJSON(obj)));
1166 + $el.setAttribute("data-dataLayerViewEvent", 'true');
1167 +
1168 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
1169 +
1170 + }
1171 +
1172 + })();
1173 +
1174 + </script>
1175 +
1176 +</div>
1177 +
1178 + <script>
1179 +
1180 + /**
1181 + * clickEventDownloadHandler()
1182 + * Is used to handle download image action selected as an opening mode
1183 + *
1184 + */
1185 +
1186 + var firstDownload = true;
1187 +
1188 + function clickEventDownloadHandler() {
1189 +
1190 + var link = this;
1191 + var filename = link.dataset.linkpath;
1192 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
1193 + var fn = filename.substring(filename.lastIndexOf('/')+1);
1194 +
1195 + if (newFile) {
1196 +
1197 + if (firstDownload) {
1198 + firstDownload = false;
1199 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
1200 + } else {
1201 + this.href = link.href;
1202 + }
1203 +
1204 + this.download = fn;
1205 +
1206 + } else {
1207 + this.download = fn + ".html";
1208 + }
1209 + }
1210 +
1211 + </script></div>
1212 +
1213 +</div>
1214 +
1215 +</div>
1216 +
1217 +
1218 +
1219 +<!--/* Initialize Js */-->
1220 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer">
1221 + if(""){
1222 + new Websites.Sticky({
1223 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer",
1224 + breakpoint: {
1225 + lg: {
1226 + to: "none"
1227 + },
1228 + md: {
1229 + to: "none"
1230 + },
1231 + sm: {
1232 + to: "none",
1233 + },
1234 + xs: {
1235 + to: "none"
1236 + }
1237 + }
1238 + });
1239 + }
1240 +</script>
1241 +
1242 +</div>
1243 +</div>
1244 +<div class="separator section">
1245 +
1246 +
1247 +<link rel="stylesheet" href="/etc.clientlibs/web-sites-toolkit/components/content/separator/clientlibs/site.min.ed03f48a059181c11364a01ab436d822.css" type="text/css">
1248 +
1249 +
1250 +
1251 +
1252 +<div id="separator-20d8a56044" class="cmp-separator">
1253 + <hr class="cmp-separator__horizontal-rule"/>
1254 +</div></div>
1255 +<div class="panelContainer section">
1256 +
1257 +
1258 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
1259 +
1260 +
1261 +
1262 + <div>
1263 +
1264 +
1265 +
1266 +
1267 +
1268 +
1269 +
1270 +
1271 +
1272 +
1273 +
1274 +
1275 +
1276 +
1277 +
1278 +
1279 +
1280 +
1281 +
1282 +
1283 +
1284 +
1285 +
1286 +<div class="panelContainer "
1287 +
1288 +
1289 + data-websites-component="/components/panelContainer.v1"
1290 + data-panel-container-lg-mg="20px"
1291 + data-panel-container-lg-pd=""
1292 + data-panel-container-lg-ht=""
1293 + data-panel-container-md-mg="20px 0 0 0"
1294 + data-panel-container-md-pd=""
1295 + data-panel-container-md-ht=""
1296 + data-panel-container-sm-mg="20px 0 0 0"
1297 + data-panel-container-sm-pd=""
1298 + data-panel-container-sm-ht=""
1299 + data-panel-container-xs-mg="20px 0 0 0"
1300 + data-panel-container-xs-pd=""
1301 + data-panel-container-xs-ht=""
1302 + data-panel-container-limit="">
1303 + <div class="parsys"><div class="textandimage parbase section">
1304 +
1305 +
1306 +
1307 +
1308 +
1309 +
1310 +
1311 +
1312 +
1313 +
1314 +
1315 +
1316 +
1317 +
1318 +
1319 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1021323156_parsys_textandimage" class="text-image-container "
1320 + data-text-image-container-right-left="false">
1321 +
1322 +
1323 +
1324 +
1325 +
1326 +
1327 +
1328 +
1329 +
1330 + <div class="row text-image-row"
1331 + data-websites-component="/components/textandimage/rowcontainer"
1332 +
1333 + data-text-image-rowcontainer-bg-type-lg=""
1334 +
1335 +
1336 +
1337 +
1338 +
1339 + data-text-image-rowcontainer-height-lg="0"
1340 + data-text-image-rowcontainer-width-lg="0"
1341 + data-text-image-rowcontainer-class-lg=""
1342 +
1343 + data-text-image-rowcontainer-bg-type-md=""
1344 +
1345 +
1346 +
1347 +
1348 +
1349 + data-text-image-rowcontainer-height-md="0"
1350 + data-text-image-rowcontainer-width-md="0"
1351 + data-text-image-rowcontainer-class-md=""
1352 +
1353 + data-text-image-rowcontainer-bg-type-sm=""
1354 +
1355 +
1356 +
1357 +
1358 +
1359 + data-text-image-rowcontainer-height-sm="0"
1360 + data-text-image-rowcontainer-width-sm="0"
1361 + data-text-image-rowcontainer-class-sm=""
1362 +
1363 + data-text-image-rowcontainer-bg-type-xs=""
1364 +
1365 +
1366 +
1367 +
1368 +
1369 + data-text-image-rowcontainer-height-xs="0"
1370 + data-text-image-rowcontainer-width-xs="0"
1371 + data-text-image-rowcontainer-class-xs="">
1372 +
1373 + <div class="col-xs-12 text-image-text-container " ><p class="chapeau3" style="text-align: center;">4.73%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p>
1374 +<p style="text-align: center;">APR<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">2</a></sup></p>
1375 +</div>
1376 + </div>
1377 +
1378 +
1379 +
1380 +
1381 +
1382 +
1383 +
1384 +
1385 +
1386 +
1387 +
1388 + <script>
1389 +
1390 + (function(){
1391 +
1392 + var dataLayerViewEventName = '' || '';
1393 + var dataLayerViewLayerProperties = [];
1394 + var $el;
1395 +
1396 +
1397 +
1398 + if(dataLayerViewEventName.trim().length) {
1399 +
1400 + var obj = {
1401 + dataLayerViewEventName: dataLayerViewEventName,
1402 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1021323156_parsys_textandimage" ,
1403 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
1404 + };
1405 +
1406 + // IE11 trick (because IE11 don't know document.currentScript):
1407 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
1408 + if(document.currentScript){
1409 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1410 + } else {
1411 + var scripts = document.getElementsByTagName( 'script' );
1412 + var currentScript = scripts[scripts.length - 1];
1413 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1414 + }
1415 +
1416 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
1417 + Websites.DataLayer.cleanViewEventJSON(obj)));
1418 + $el.setAttribute("data-dataLayerViewEvent", 'true');
1419 +
1420 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
1421 +
1422 + }
1423 +
1424 + })();
1425 +
1426 + </script>
1427 +
1428 +</div>
1429 +
1430 + <script>
1431 +
1432 + /**
1433 + * clickEventDownloadHandler()
1434 + * Is used to handle download image action selected as an opening mode
1435 + *
1436 + */
1437 +
1438 + var firstDownload = true;
1439 +
1440 + function clickEventDownloadHandler() {
1441 +
1442 + var link = this;
1443 + var filename = link.dataset.linkpath;
1444 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
1445 + var fn = filename.substring(filename.lastIndexOf('/')+1);
1446 +
1447 + if (newFile) {
1448 +
1449 + if (firstDownload) {
1450 + firstDownload = false;
1451 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
1452 + } else {
1453 + this.href = link.href;
1454 + }
1455 +
1456 + this.download = fn;
1457 +
1458 + } else {
1459 + this.download = fn + ".html";
1460 + }
1461 + }
1462 +
1463 + </script></div>
1464 +
1465 +</div>
1466 +
1467 +</div>
1468 +
1469 +
1470 +
1471 +<!--/* Initialize Js */-->
1472 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1021323156">
1473 + if(""){
1474 + new Websites.Sticky({
1475 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1021323156",
1476 + breakpoint: {
1477 + lg: {
1478 + to: "none"
1479 + },
1480 + md: {
1481 + to: "none"
1482 + },
1483 + sm: {
1484 + to: "none",
1485 + },
1486 + xs: {
1487 + to: "none"
1488 + }
1489 + }
1490 + });
1491 + }
1492 +</script>
1493 +
1494 +</div>
1495 +</div>
1496 +
1497 +</div>
1498 +
1499 +</div>
1500 +
1501 +
1502 +
1503 +<!--/* Initialize Js */-->
1504 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy">
1505 + if(""){
1506 + new Websites.Sticky({
1507 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy",
1508 + breakpoint: {
1509 + lg: {
1510 + to: "none"
1511 + },
1512 + md: {
1513 + to: "none"
1514 + },
1515 + sm: {
1516 + to: "none",
1517 + },
1518 + xs: {
1519 + to: "none"
1520 + }
1521 + }
1522 + });
1523 + }
1524 +</script>
1525 +
1526 +</div>
1527 +</div>
1528 +
1529 +</div>
1530 +
1531 + </div>
1532 +
1533 + <div class="col-xs-12 col-sm-4 column ">
1534 + <div class="parsys2 parsys"><div class="panelContainer section">
1535 +
1536 +
1537 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
1538 +
1539 +
1540 +
1541 + <div>
1542 +
1543 +
1544 +
1545 +
1546 +
1547 +
1548 +
1549 +
1550 +
1551 +
1552 +
1553 +
1554 +
1555 +
1556 +
1557 +
1558 +
1559 +
1560 +
1561 +
1562 +
1563 +
1564 +
1565 +<div class="panelContainer panel-border panel-border-radius "
1566 +
1567 +
1568 + data-websites-component="/components/panelContainer.v1"
1569 + data-panel-container-lg-mg="0 10px"
1570 + data-panel-container-lg-pd="20px"
1571 + data-panel-container-lg-ht=""
1572 + data-panel-container-md-mg="0 10px"
1573 + data-panel-container-md-pd="20px"
1574 + data-panel-container-md-ht=""
1575 + data-panel-container-sm-mg="0 10px"
1576 + data-panel-container-sm-pd="20px"
1577 + data-panel-container-sm-ht=""
1578 + data-panel-container-xs-mg="20px 0 0 0"
1579 + data-panel-container-xs-pd="20px"
1580 + data-panel-container-xs-ht=""
1581 + data-panel-container-limit="">
1582 + <div class="parsys"><div class="panelContainer section">
1583 +
1584 +
1585 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
1586 +
1587 +
1588 +
1589 + <div>
1590 +
1591 +
1592 +
1593 +
1594 +
1595 +
1596 +
1597 +
1598 +
1599 +
1600 +
1601 +
1602 +
1603 +
1604 +
1605 +
1606 +
1607 +
1608 +
1609 +
1610 +
1611 +
1612 +
1613 +<div class="panelContainer background-tertiary-pinkPastel "
1614 +
1615 +
1616 + data-websites-component="/components/panelContainer.v1"
1617 + data-panel-container-lg-mg="0 30%"
1618 + data-panel-container-lg-pd="10px 0 0 0"
1619 + data-panel-container-lg-ht=""
1620 + data-panel-container-md-mg="0 20%"
1621 + data-panel-container-md-pd="10px 0 0 0"
1622 + data-panel-container-md-ht=""
1623 + data-panel-container-sm-mg=""
1624 + data-panel-container-sm-pd="10px 0 0 0"
1625 + data-panel-container-sm-ht=""
1626 + data-panel-container-xs-mg="0 30%"
1627 + data-panel-container-xs-pd="10px 0 0 0"
1628 + data-panel-container-xs-ht=""
1629 + data-panel-container-limit="">
1630 + <div class="parsys"><div class="textandimage parbase section">
1631 +
1632 +
1633 +
1634 +
1635 +
1636 +
1637 +
1638 +
1639 +
1640 +
1641 +
1642 +
1643 +
1644 +
1645 +
1646 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" class="text-image-container "
1647 + data-text-image-container-right-left="false">
1648 +
1649 +
1650 +
1651 +
1652 +
1653 +
1654 +
1655 +
1656 +
1657 + <div class="row text-image-row"
1658 + data-websites-component="/components/textandimage/rowcontainer"
1659 +
1660 + data-text-image-rowcontainer-bg-type-lg="none"
1661 +
1662 +
1663 +
1664 +
1665 +
1666 + data-text-image-rowcontainer-height-lg="0"
1667 + data-text-image-rowcontainer-width-lg="0"
1668 + data-text-image-rowcontainer-class-lg="backgroundColor72BFC1--80"
1669 +
1670 + data-text-image-rowcontainer-bg-type-md="none"
1671 +
1672 +
1673 +
1674 +
1675 +
1676 + data-text-image-rowcontainer-height-md="0"
1677 + data-text-image-rowcontainer-width-md="0"
1678 + data-text-image-rowcontainer-class-md="backgroundColor1"
1679 +
1680 + data-text-image-rowcontainer-bg-type-sm="none"
1681 +
1682 +
1683 +
1684 +
1685 +
1686 + data-text-image-rowcontainer-height-sm="0"
1687 + data-text-image-rowcontainer-width-sm="0"
1688 + data-text-image-rowcontainer-class-sm="backgroundColor1"
1689 +
1690 + data-text-image-rowcontainer-bg-type-xs="none"
1691 +
1692 +
1693 +
1694 +
1695 +
1696 + data-text-image-rowcontainer-height-xs="0"
1697 + data-text-image-rowcontainer-width-xs="0"
1698 + data-text-image-rowcontainer-class-xs="backgroundColor1">
1699 +
1700 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>PROMOTION</b></p>
1701 +</div>
1702 + </div>
1703 +
1704 +
1705 +
1706 +
1707 +
1708 +
1709 +
1710 +
1711 +
1712 +
1713 +
1714 + <script>
1715 +
1716 + (function(){
1717 +
1718 + var dataLayerViewEventName = '' || '';
1719 + var dataLayerViewLayerProperties = [];
1720 + var $el;
1721 +
1722 +
1723 +
1724 + if(dataLayerViewEventName.trim().length) {
1725 +
1726 + var obj = {
1727 + dataLayerViewEventName: dataLayerViewEventName,
1728 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" ,
1729 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
1730 + };
1731 +
1732 + // IE11 trick (because IE11 don't know document.currentScript):
1733 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
1734 + if(document.currentScript){
1735 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1736 + } else {
1737 + var scripts = document.getElementsByTagName( 'script' );
1738 + var currentScript = scripts[scripts.length - 1];
1739 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1740 + }
1741 +
1742 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
1743 + Websites.DataLayer.cleanViewEventJSON(obj)));
1744 + $el.setAttribute("data-dataLayerViewEvent", 'true');
1745 +
1746 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
1747 +
1748 + }
1749 +
1750 + })();
1751 +
1752 + </script>
1753 +
1754 +</div>
1755 +
1756 + <script>
1757 +
1758 + /**
1759 + * clickEventDownloadHandler()
1760 + * Is used to handle download image action selected as an opening mode
1761 + *
1762 + */
1763 +
1764 + var firstDownload = true;
1765 +
1766 + function clickEventDownloadHandler() {
1767 +
1768 + var link = this;
1769 + var filename = link.dataset.linkpath;
1770 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
1771 + var fn = filename.substring(filename.lastIndexOf('/')+1);
1772 +
1773 + if (newFile) {
1774 +
1775 + if (firstDownload) {
1776 + firstDownload = false;
1777 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
1778 + } else {
1779 + this.href = link.href;
1780 + }
1781 +
1782 + this.download = fn;
1783 +
1784 + } else {
1785 + this.download = fn + ".html";
1786 + }
1787 + }
1788 +
1789 + </script></div>
1790 +
1791 +</div>
1792 +
1793 +</div>
1794 +
1795 +
1796 +
1797 +<!--/* Initialize Js */-->
1798 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1939379463">
1799 + if(""){
1800 + new Websites.Sticky({
1801 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1939379463",
1802 + breakpoint: {
1803 + lg: {
1804 + to: "none"
1805 + },
1806 + md: {
1807 + to: "none"
1808 + },
1809 + sm: {
1810 + to: "none",
1811 + },
1812 + xs: {
1813 + to: "none"
1814 + }
1815 + }
1816 + });
1817 + }
1818 +</script>
1819 +
1820 +</div>
1821 +</div>
1822 +<div class="panelContainer section">
1823 +
1824 +
1825 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
1826 +
1827 +
1828 +
1829 + <div>
1830 +
1831 +
1832 +
1833 +
1834 +
1835 +
1836 +
1837 +
1838 +
1839 +
1840 +
1841 +
1842 +
1843 +
1844 +
1845 +
1846 +
1847 +
1848 +
1849 +
1850 +
1851 +
1852 +
1853 +<div class="panelContainer "
1854 +
1855 +
1856 + data-websites-component="/components/panelContainer.v1"
1857 + data-panel-container-lg-mg="20px"
1858 + data-panel-container-lg-pd=""
1859 + data-panel-container-lg-ht=""
1860 + data-panel-container-md-mg="20px 0 0 0"
1861 + data-panel-container-md-pd=""
1862 + data-panel-container-md-ht=""
1863 + data-panel-container-sm-mg="20px 0 0 0"
1864 + data-panel-container-sm-pd=""
1865 + data-panel-container-sm-ht=""
1866 + data-panel-container-xs-mg="20px 0 0 0"
1867 + data-panel-container-xs-pd=""
1868 + data-panel-container-xs-ht=""
1869 + data-panel-container-limit="">
1870 + <div class="parsys"><div class="textandimage parbase section">
1871 +
1872 +
1873 +
1874 +
1875 +
1876 +
1877 +
1878 +
1879 +
1880 +
1881 +
1882 +
1883 +
1884 +
1885 +
1886 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" class="text-image-container "
1887 + data-text-image-container-right-left="false">
1888 +
1889 +
1890 +
1891 +
1892 +
1893 +
1894 +
1895 +
1896 +
1897 + <div class="row text-image-row"
1898 + data-websites-component="/components/textandimage/rowcontainer"
1899 +
1900 + data-text-image-rowcontainer-bg-type-lg=""
1901 +
1902 +
1903 +
1904 +
1905 +
1906 + data-text-image-rowcontainer-height-lg="0"
1907 + data-text-image-rowcontainer-width-lg="0"
1908 + data-text-image-rowcontainer-class-lg=""
1909 +
1910 + data-text-image-rowcontainer-bg-type-md=""
1911 +
1912 +
1913 +
1914 +
1915 +
1916 + data-text-image-rowcontainer-height-md="0"
1917 + data-text-image-rowcontainer-width-md="0"
1918 + data-text-image-rowcontainer-class-md=""
1919 +
1920 + data-text-image-rowcontainer-bg-type-sm=""
1921 +
1922 +
1923 +
1924 +
1925 +
1926 + data-text-image-rowcontainer-height-sm="0"
1927 + data-text-image-rowcontainer-width-sm="0"
1928 + data-text-image-rowcontainer-class-sm=""
1929 +
1930 + data-text-image-rowcontainer-bg-type-xs=""
1931 +
1932 +
1933 +
1934 +
1935 +
1936 + data-text-image-rowcontainer-height-xs="0"
1937 + data-text-image-rowcontainer-width-xs="0"
1938 + data-text-image-rowcontainer-class-xs="">
1939 +
1940 + <div class="col-xs-12 text-image-text-container
1941 + initializing" ><p style="text-align: center;"><b>5 year</b>&nbsp;fixed rate<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">1</a></sup></p>
1942 +<p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo5ansF|percent:&quot;true&quot;'>${p1.tauxPromo5ansF|percent:&quot;true&quot;}</span><br>
1943 +</p></div>
1944 + </div>
1945 +
1946 +
1947 +
1948 +
1949 +
1950 +
1951 +
1952 +
1953 +
1954 +
1955 +
1956 +
1957 + <script>
1958 + (function(){
1959 + var $el;
1960 + var listeners = [];
1961 + var dataLayerViewEventName = '';
1962 + var dataLayerViewLayerProperties = [];
1963 +
1964 + dataLayerViewEventName = '';
1965 +
1966 +
1967 +
1968 +
1969 +
1970 + // IE11 trick (because IE11 don't know document.currentScript):
1971 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
1972 + if(document.currentScript){
1973 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1974 + } else {
1975 + var scripts = document.getElementsByTagName( 'script' );
1976 + var currentScript = scripts[scripts.length - 1];
1977 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
1978 + }
1979 +
1980 + Websites.Product.Core.initContentQueue.push(function () {
1981 + Websites.Product.TextContent.initTextContent({
1982 + $el: $el,
1983 + capsuleAlias: "",
1984 + listeners: listeners,
1985 + products: Websites.Product.Core.determineProductsArray(""),
1986 + dataLayerViewEvent: {
1987 + dataLayerViewEventName: dataLayerViewEventName,
1988 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" ,
1989 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
1990 + }
1991 + });
1992 + });
1993 + })();
1994 +
1995 + </script>
1996 +
1997 +
1998 +
1999 +
2000 +
2001 +</div>
2002 +
2003 + <script>
2004 +
2005 + /**
2006 + * clickEventDownloadHandler()
2007 + * Is used to handle download image action selected as an opening mode
2008 + *
2009 + */
2010 +
2011 + var firstDownload = true;
2012 +
2013 + function clickEventDownloadHandler() {
2014 +
2015 + var link = this;
2016 + var filename = link.dataset.linkpath;
2017 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
2018 + var fn = filename.substring(filename.lastIndexOf('/')+1);
2019 +
2020 + if (newFile) {
2021 +
2022 + if (firstDownload) {
2023 + firstDownload = false;
2024 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
2025 + } else {
2026 + this.href = link.href;
2027 + }
2028 +
2029 + this.download = fn;
2030 +
2031 + } else {
2032 + this.download = fn + ".html";
2033 + }
2034 + }
2035 +
2036 + </script></div>
2037 +
2038 +</div>
2039 +
2040 +</div>
2041 +
2042 +
2043 +
2044 +<!--/* Initialize Js */-->
2045 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer">
2046 + if(""){
2047 + new Websites.Sticky({
2048 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer",
2049 + breakpoint: {
2050 + lg: {
2051 + to: "none"
2052 + },
2053 + md: {
2054 + to: "none"
2055 + },
2056 + sm: {
2057 + to: "none",
2058 + },
2059 + xs: {
2060 + to: "none"
2061 + }
2062 + }
2063 + });
2064 + }
2065 +</script>
2066 +
2067 +</div>
2068 +</div>
2069 +<div class="separator section">
2070 +
2071 +
2072 +
2073 +
2074 +
2075 +
2076 +<div id="separator-eba8872247" class="cmp-separator">
2077 + <hr class="cmp-separator__horizontal-rule"/>
2078 +</div></div>
2079 +<div class="panelContainer section">
2080 +
2081 +
2082 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
2083 +
2084 +
2085 +
2086 + <div>
2087 +
2088 +
2089 +
2090 +
2091 +
2092 +
2093 +
2094 +
2095 +
2096 +
2097 +
2098 +
2099 +
2100 +
2101 +
2102 +
2103 +
2104 +
2105 +
2106 +
2107 +
2108 +
2109 +
2110 +<div class="panelContainer "
2111 +
2112 +
2113 + data-websites-component="/components/panelContainer.v1"
2114 + data-panel-container-lg-mg="20px"
2115 + data-panel-container-lg-pd=""
2116 + data-panel-container-lg-ht=""
2117 + data-panel-container-md-mg="20px 0 0 0"
2118 + data-panel-container-md-pd=""
2119 + data-panel-container-md-ht=""
2120 + data-panel-container-sm-mg="20px 0 0 0"
2121 + data-panel-container-sm-pd=""
2122 + data-panel-container-sm-ht=""
2123 + data-panel-container-xs-mg="20px 0 0 0"
2124 + data-panel-container-xs-pd=""
2125 + data-panel-container-xs-ht=""
2126 + data-panel-container-limit="">
2127 + <div class="parsys"><div class="textandimage parbase section">
2128 +
2129 +
2130 +
2131 +
2132 +
2133 +
2134 +
2135 +
2136 +
2137 +
2138 +
2139 +
2140 +
2141 +
2142 +
2143 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_textandimage" class="text-image-container "
2144 + data-text-image-container-right-left="false">
2145 +
2146 +
2147 +
2148 +
2149 +
2150 +
2151 +
2152 +
2153 +
2154 + <div class="row text-image-row"
2155 + data-websites-component="/components/textandimage/rowcontainer"
2156 +
2157 + data-text-image-rowcontainer-bg-type-lg=""
2158 +
2159 +
2160 +
2161 +
2162 +
2163 + data-text-image-rowcontainer-height-lg="0"
2164 + data-text-image-rowcontainer-width-lg="0"
2165 + data-text-image-rowcontainer-class-lg=""
2166 +
2167 + data-text-image-rowcontainer-bg-type-md=""
2168 +
2169 +
2170 +
2171 +
2172 +
2173 + data-text-image-rowcontainer-height-md="0"
2174 + data-text-image-rowcontainer-width-md="0"
2175 + data-text-image-rowcontainer-class-md=""
2176 +
2177 + data-text-image-rowcontainer-bg-type-sm=""
2178 +
2179 +
2180 +
2181 +
2182 +
2183 + data-text-image-rowcontainer-height-sm="0"
2184 + data-text-image-rowcontainer-width-sm="0"
2185 + data-text-image-rowcontainer-class-sm=""
2186 +
2187 + data-text-image-rowcontainer-bg-type-xs=""
2188 +
2189 +
2190 +
2191 +
2192 +
2193 + data-text-image-rowcontainer-height-xs="0"
2194 + data-text-image-rowcontainer-width-xs="0"
2195 + data-text-image-rowcontainer-class-xs="">
2196 +
2197 + <div class="col-xs-12 text-image-text-container
2198 + initializing" ><p class="chapeau3" style="text-align: center;"><span static-token='tac5ans|percent:&quot;true&quot;'>${p1.tac5ans|percent:&quot;true&quot;}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p>
2199 +<p style="text-align: center;">APR<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">2</a></sup></p></div>
2200 + </div>
2201 +
2202 +
2203 +
2204 +
2205 +
2206 +
2207 +
2208 +
2209 +
2210 +
2211 +
2212 +
2213 + <script>
2214 + (function(){
2215 + var $el;
2216 + var listeners = [];
2217 + var dataLayerViewEventName = '';
2218 + var dataLayerViewLayerProperties = [];
2219 +
2220 + dataLayerViewEventName = '';
2221 +
2222 +
2223 +
2224 +
2225 +
2226 + // IE11 trick (because IE11 don't know document.currentScript):
2227 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
2228 + if(document.currentScript){
2229 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
2230 + } else {
2231 + var scripts = document.getElementsByTagName( 'script' );
2232 + var currentScript = scripts[scripts.length - 1];
2233 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
2234 + }
2235 +
2236 + Websites.Product.Core.initContentQueue.push(function () {
2237 + Websites.Product.TextContent.initTextContent({
2238 + $el: $el,
2239 + capsuleAlias: "",
2240 + listeners: listeners,
2241 + products: Websites.Product.Core.determineProductsArray(""),
2242 + dataLayerViewEvent: {
2243 + dataLayerViewEventName: dataLayerViewEventName,
2244 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_textandimage" ,
2245 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
2246 + }
2247 + });
2248 + });
2249 + })();
2250 +
2251 + </script>
2252 +
2253 +
2254 +
2255 +
2256 +
2257 +</div>
2258 +
2259 + <script>
2260 +
2261 + /**
2262 + * clickEventDownloadHandler()
2263 + * Is used to handle download image action selected as an opening mode
2264 + *
2265 + */
2266 +
2267 + var firstDownload = true;
2268 +
2269 + function clickEventDownloadHandler() {
2270 +
2271 + var link = this;
2272 + var filename = link.dataset.linkpath;
2273 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
2274 + var fn = filename.substring(filename.lastIndexOf('/')+1);
2275 +
2276 + if (newFile) {
2277 +
2278 + if (firstDownload) {
2279 + firstDownload = false;
2280 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
2281 + } else {
2282 + this.href = link.href;
2283 + }
2284 +
2285 + this.download = fn;
2286 +
2287 + } else {
2288 + this.download = fn + ".html";
2289 + }
2290 + }
2291 +
2292 + </script></div>
2293 +
2294 +</div>
2295 +
2296 +</div>
2297 +
2298 +
2299 +
2300 +<!--/* Initialize Js */-->
2301 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1021323156">
2302 + if(""){
2303 + new Websites.Sticky({
2304 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1021323156",
2305 + breakpoint: {
2306 + lg: {
2307 + to: "none"
2308 + },
2309 + md: {
2310 + to: "none"
2311 + },
2312 + sm: {
2313 + to: "none",
2314 + },
2315 + xs: {
2316 + to: "none"
2317 + }
2318 + }
2319 + });
2320 + }
2321 +</script>
2322 +
2323 +</div>
2324 +</div>
2325 +
2326 +</div>
2327 +
2328 +</div>
2329 +
2330 +
2331 +
2332 +<!--/* Initialize Js */-->
2333 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_">
2334 + if(""){
2335 + new Websites.Sticky({
2336 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_",
2337 + breakpoint: {
2338 + lg: {
2339 + to: "none"
2340 + },
2341 + md: {
2342 + to: "none"
2343 + },
2344 + sm: {
2345 + to: "none",
2346 + },
2347 + xs: {
2348 + to: "none"
2349 + }
2350 + }
2351 + });
2352 + }
2353 +</script>
2354 +
2355 +</div>
2356 +</div>
2357 +
2358 +</div>
2359 +
2360 + </div>
2361 +
2362 + <div class="col-xs-12 col-sm-4 column col-last ">
2363 + <div class="parsys3 parsys"><div class="panelContainer section">
2364 +
2365 +
2366 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
2367 +
2368 +
2369 +
2370 + <div>
2371 +
2372 +
2373 +
2374 +
2375 +
2376 +
2377 +
2378 +
2379 +
2380 +
2381 +
2382 +
2383 +
2384 +
2385 +
2386 +
2387 +
2388 +
2389 +
2390 +
2391 +
2392 +
2393 +
2394 +<div class="panelContainer panel-border panel-border-radius "
2395 +
2396 +
2397 + data-websites-component="/components/panelContainer.v1"
2398 + data-panel-container-lg-mg=""
2399 + data-panel-container-lg-pd="20px"
2400 + data-panel-container-lg-ht=""
2401 + data-panel-container-md-mg=""
2402 + data-panel-container-md-pd="20px"
2403 + data-panel-container-md-ht=""
2404 + data-panel-container-sm-mg=""
2405 + data-panel-container-sm-pd="20px"
2406 + data-panel-container-sm-ht=""
2407 + data-panel-container-xs-mg="20px 0 0 0"
2408 + data-panel-container-xs-pd="20px"
2409 + data-panel-container-xs-ht=""
2410 + data-panel-container-limit="">
2411 + <div class="parsys"><div class="panelContainer section">
2412 +
2413 +
2414 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
2415 +
2416 +
2417 +
2418 + <div>
2419 +
2420 +
2421 +
2422 +
2423 +
2424 +
2425 +
2426 +
2427 +
2428 +
2429 +
2430 +
2431 +
2432 +
2433 +
2434 +
2435 +
2436 +
2437 +
2438 +
2439 +
2440 +
2441 +
2442 +<div class="panelContainer background-tertiary-pinkPastel "
2443 +
2444 +
2445 + data-websites-component="/components/panelContainer.v1"
2446 + data-panel-container-lg-mg="0 30%"
2447 + data-panel-container-lg-pd="10px 0 0 0"
2448 + data-panel-container-lg-ht=""
2449 + data-panel-container-md-mg="0 20%"
2450 + data-panel-container-md-pd="10px 0 0 0"
2451 + data-panel-container-md-ht=""
2452 + data-panel-container-sm-mg=""
2453 + data-panel-container-sm-pd="10px 0 0 0"
2454 + data-panel-container-sm-ht=""
2455 + data-panel-container-xs-mg="0 30%"
2456 + data-panel-container-xs-pd="10px 0 0 0"
2457 + data-panel-container-xs-ht=""
2458 + data-panel-container-limit="">
2459 + <div class="parsys"><div class="textandimage parbase section">
2460 +
2461 +
2462 +
2463 +
2464 +
2465 +
2466 +
2467 +
2468 +
2469 +
2470 +
2471 +
2472 +
2473 +
2474 +
2475 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" class="text-image-container "
2476 + data-text-image-container-right-left="false">
2477 +
2478 +
2479 +
2480 +
2481 +
2482 +
2483 +
2484 +
2485 +
2486 + <div class="row text-image-row"
2487 + data-websites-component="/components/textandimage/rowcontainer"
2488 +
2489 + data-text-image-rowcontainer-bg-type-lg="none"
2490 +
2491 +
2492 +
2493 +
2494 +
2495 + data-text-image-rowcontainer-height-lg="0"
2496 + data-text-image-rowcontainer-width-lg="0"
2497 + data-text-image-rowcontainer-class-lg="backgroundColor72BFC1--80"
2498 +
2499 + data-text-image-rowcontainer-bg-type-md="none"
2500 +
2501 +
2502 +
2503 +
2504 +
2505 + data-text-image-rowcontainer-height-md="0"
2506 + data-text-image-rowcontainer-width-md="0"
2507 + data-text-image-rowcontainer-class-md="backgroundColor1"
2508 +
2509 + data-text-image-rowcontainer-bg-type-sm="none"
2510 +
2511 +
2512 +
2513 +
2514 +
2515 + data-text-image-rowcontainer-height-sm="0"
2516 + data-text-image-rowcontainer-width-sm="0"
2517 + data-text-image-rowcontainer-class-sm="backgroundColor1"
2518 +
2519 + data-text-image-rowcontainer-bg-type-xs="none"
2520 +
2521 +
2522 +
2523 +
2524 +
2525 + data-text-image-rowcontainer-height-xs="0"
2526 + data-text-image-rowcontainer-width-xs="0"
2527 + data-text-image-rowcontainer-class-xs="backgroundColor1">
2528 +
2529 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>PROMOTION</b></p>
2530 +</div>
2531 + </div>
2532 +
2533 +
2534 +
2535 +
2536 +
2537 +
2538 +
2539 +
2540 +
2541 +
2542 +
2543 + <script>
2544 +
2545 + (function(){
2546 +
2547 + var dataLayerViewEventName = '' || '';
2548 + var dataLayerViewLayerProperties = [];
2549 + var $el;
2550 +
2551 +
2552 +
2553 + if(dataLayerViewEventName.trim().length) {
2554 +
2555 + var obj = {
2556 + dataLayerViewEventName: dataLayerViewEventName,
2557 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" ,
2558 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
2559 + };
2560 +
2561 + // IE11 trick (because IE11 don't know document.currentScript):
2562 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
2563 + if(document.currentScript){
2564 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
2565 + } else {
2566 + var scripts = document.getElementsByTagName( 'script' );
2567 + var currentScript = scripts[scripts.length - 1];
2568 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
2569 + }
2570 +
2571 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
2572 + Websites.DataLayer.cleanViewEventJSON(obj)));
2573 + $el.setAttribute("data-dataLayerViewEvent", 'true');
2574 +
2575 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
2576 +
2577 + }
2578 +
2579 + })();
2580 +
2581 + </script>
2582 +
2583 +</div>
2584 +
2585 + <script>
2586 +
2587 + /**
2588 + * clickEventDownloadHandler()
2589 + * Is used to handle download image action selected as an opening mode
2590 + *
2591 + */
2592 +
2593 + var firstDownload = true;
2594 +
2595 + function clickEventDownloadHandler() {
2596 +
2597 + var link = this;
2598 + var filename = link.dataset.linkpath;
2599 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
2600 + var fn = filename.substring(filename.lastIndexOf('/')+1);
2601 +
2602 + if (newFile) {
2603 +
2604 + if (firstDownload) {
2605 + firstDownload = false;
2606 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
2607 + } else {
2608 + this.href = link.href;
2609 + }
2610 +
2611 + this.download = fn;
2612 +
2613 + } else {
2614 + this.download = fn + ".html";
2615 + }
2616 + }
2617 +
2618 + </script></div>
2619 +
2620 +</div>
2621 +
2622 +</div>
2623 +
2624 +
2625 +
2626 +<!--/* Initialize Js */-->
2627 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1939379463">
2628 + if(""){
2629 + new Websites.Sticky({
2630 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1939379463",
2631 + breakpoint: {
2632 + lg: {
2633 + to: "none"
2634 + },
2635 + md: {
2636 + to: "none"
2637 + },
2638 + sm: {
2639 + to: "none",
2640 + },
2641 + xs: {
2642 + to: "none"
2643 + }
2644 + }
2645 + });
2646 + }
2647 +</script>
2648 +
2649 +</div>
2650 +</div>
2651 +<div class="panelContainer section">
2652 +
2653 +
2654 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
2655 +
2656 +
2657 +
2658 + <div>
2659 +
2660 +
2661 +
2662 +
2663 +
2664 +
2665 +
2666 +
2667 +
2668 +
2669 +
2670 +
2671 +
2672 +
2673 +
2674 +
2675 +
2676 +
2677 +
2678 +
2679 +
2680 +
2681 +
2682 +<div class="panelContainer "
2683 +
2684 +
2685 + data-websites-component="/components/panelContainer.v1"
2686 + data-panel-container-lg-mg="20px"
2687 + data-panel-container-lg-pd=""
2688 + data-panel-container-lg-ht=""
2689 + data-panel-container-md-mg="20px 0 0 0"
2690 + data-panel-container-md-pd=""
2691 + data-panel-container-md-ht=""
2692 + data-panel-container-sm-mg="20px 0 0 0"
2693 + data-panel-container-sm-pd=""
2694 + data-panel-container-sm-ht=""
2695 + data-panel-container-xs-mg="20px 0 0 0"
2696 + data-panel-container-xs-pd=""
2697 + data-panel-container-xs-ht=""
2698 + data-panel-container-limit="">
2699 + <div class="parsys"><div class="textandimage parbase section">
2700 +
2701 +
2702 +
2703 +
2704 +
2705 +
2706 +
2707 +
2708 +
2709 +
2710 +
2711 +
2712 +
2713 +
2714 +
2715 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" class="text-image-container "
2716 + data-text-image-container-right-left="false">
2717 +
2718 +
2719 +
2720 +
2721 +
2722 +
2723 +
2724 +
2725 +
2726 + <div class="row text-image-row"
2727 + data-websites-component="/components/textandimage/rowcontainer"
2728 +
2729 + data-text-image-rowcontainer-bg-type-lg=""
2730 +
2731 +
2732 +
2733 +
2734 +
2735 + data-text-image-rowcontainer-height-lg="0"
2736 + data-text-image-rowcontainer-width-lg="0"
2737 + data-text-image-rowcontainer-class-lg=""
2738 +
2739 + data-text-image-rowcontainer-bg-type-md=""
2740 +
2741 +
2742 +
2743 +
2744 +
2745 + data-text-image-rowcontainer-height-md="0"
2746 + data-text-image-rowcontainer-width-md="0"
2747 + data-text-image-rowcontainer-class-md=""
2748 +
2749 + data-text-image-rowcontainer-bg-type-sm=""
2750 +
2751 +
2752 +
2753 +
2754 +
2755 + data-text-image-rowcontainer-height-sm="0"
2756 + data-text-image-rowcontainer-width-sm="0"
2757 + data-text-image-rowcontainer-class-sm=""
2758 +
2759 + data-text-image-rowcontainer-bg-type-xs=""
2760 +
2761 +
2762 +
2763 +
2764 +
2765 + data-text-image-rowcontainer-height-xs="0"
2766 + data-text-image-rowcontainer-width-xs="0"
2767 + data-text-image-rowcontainer-class-xs="">
2768 +
2769 + <div class="col-xs-12 text-image-text-container
2770 + initializing" ><p style="text-align: center;"><b>5 year</b>&nbsp;variable rate<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">7</a></sup></p>
2771 +<p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo5ansF|percent:&quot;true&quot;'>${p2.tauxPromo5ansF|percent:&quot;true&quot;}</span><br>
2772 +</p></div>
2773 + </div>
2774 +
2775 +
2776 +
2777 +
2778 +
2779 +
2780 +
2781 +
2782 +
2783 +
2784 +
2785 +
2786 + <script>
2787 + (function(){
2788 + var $el;
2789 + var listeners = [];
2790 + var dataLayerViewEventName = '';
2791 + var dataLayerViewLayerProperties = [];
2792 +
2793 + dataLayerViewEventName = '';
2794 +
2795 +
2796 +
2797 +
2798 +
2799 + // IE11 trick (because IE11 don't know document.currentScript):
2800 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
2801 + if(document.currentScript){
2802 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
2803 + } else {
2804 + var scripts = document.getElementsByTagName( 'script' );
2805 + var currentScript = scripts[scripts.length - 1];
2806 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
2807 + }
2808 +
2809 + Websites.Product.Core.initContentQueue.push(function () {
2810 + Websites.Product.TextContent.initTextContent({
2811 + $el: $el,
2812 + capsuleAlias: "",
2813 + listeners: listeners,
2814 + products: Websites.Product.Core.determineProductsArray(""),
2815 + dataLayerViewEvent: {
2816 + dataLayerViewEventName: dataLayerViewEventName,
2817 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" ,
2818 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
2819 + }
2820 + });
2821 + });
2822 + })();
2823 +
2824 + </script>
2825 +
2826 +
2827 +
2828 +
2829 +
2830 +</div>
2831 +
2832 + <script>
2833 +
2834 + /**
2835 + * clickEventDownloadHandler()
2836 + * Is used to handle download image action selected as an opening mode
2837 + *
2838 + */
2839 +
2840 + var firstDownload = true;
2841 +
2842 + function clickEventDownloadHandler() {
2843 +
2844 + var link = this;
2845 + var filename = link.dataset.linkpath;
2846 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
2847 + var fn = filename.substring(filename.lastIndexOf('/')+1);
2848 +
2849 + if (newFile) {
2850 +
2851 + if (firstDownload) {
2852 + firstDownload = false;
2853 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
2854 + } else {
2855 + this.href = link.href;
2856 + }
2857 +
2858 + this.download = fn;
2859 +
2860 + } else {
2861 + this.download = fn + ".html";
2862 + }
2863 + }
2864 +
2865 + </script></div>
2866 +
2867 +</div>
2868 +
2869 +</div>
2870 +
2871 +
2872 +
2873 +<!--/* Initialize Js */-->
2874 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer">
2875 + if(""){
2876 + new Websites.Sticky({
2877 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer",
2878 + breakpoint: {
2879 + lg: {
2880 + to: "none"
2881 + },
2882 + md: {
2883 + to: "none"
2884 + },
2885 + sm: {
2886 + to: "none",
2887 + },
2888 + xs: {
2889 + to: "none"
2890 + }
2891 + }
2892 + });
2893 + }
2894 +</script>
2895 +
2896 +</div>
2897 +</div>
2898 +<div class="separator section">
2899 +
2900 +
2901 +
2902 +
2903 +
2904 +
2905 +<div id="separator-54b0dfd9db" class="cmp-separator">
2906 + <hr class="cmp-separator__horizontal-rule"/>
2907 +</div></div>
2908 +<div class="panelContainer section">
2909 +
2910 +
2911 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
2912 +
2913 +
2914 +
2915 + <div>
2916 +
2917 +
2918 +
2919 +
2920 +
2921 +
2922 +
2923 +
2924 +
2925 +
2926 +
2927 +
2928 +
2929 +
2930 +
2931 +
2932 +
2933 +
2934 +
2935 +
2936 +
2937 +
2938 +
2939 +<div class="panelContainer "
2940 +
2941 +
2942 + data-websites-component="/components/panelContainer.v1"
2943 + data-panel-container-lg-mg="20px"
2944 + data-panel-container-lg-pd=""
2945 + data-panel-container-lg-ht=""
2946 + data-panel-container-md-mg="20px 0 0 0"
2947 + data-panel-container-md-pd=""
2948 + data-panel-container-md-ht=""
2949 + data-panel-container-sm-mg="20px 0 0 0"
2950 + data-panel-container-sm-pd=""
2951 + data-panel-container-sm-ht=""
2952 + data-panel-container-xs-mg="20px 0 0 0"
2953 + data-panel-container-xs-pd=""
2954 + data-panel-container-xs-ht=""
2955 + data-panel-container-limit="">
2956 + <div class="parsys"><div class="columns parbase section">
2957 +
2958 +
2959 +
2960 +
2961 +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div>
2962 +
2963 +
2964 +
2965 +
2966 +
2967 +
2968 +
2969 +
2970 +
2971 +
2972 +
2973 +
2974 +
2975 + <div style=""
2976 + class="columns-row row row-eq-height"
2977 +
2978 + data-style-lg="" data-height-lg=""
2979 + data-width-lg=""
2980 + data-background-color-lg=""
2981 + data-background-color-xs="">
2982 + <div style=""
2983 + class="col-xs-12 col-sm-12 columns-title "
2984 + data-height="" data-width=""
2985 + data-style-xs="" data-height-xs=""
2986 + data-width-xs="">
2987 +
2988 + </div>
2989 +
2990 +
2991 +
2992 +
2993 + <div class="col-xs-12 col-sm-6 column col-first separatorFilet">
2994 + <div class="parsys1 parsys"><div class="panelContainer section">
2995 +
2996 +
2997 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
2998 +
2999 +
3000 +
3001 + <div>
3002 +
3003 +
3004 +
3005 +
3006 +
3007 +
3008 +
3009 +
3010 +
3011 +
3012 +
3013 +
3014 +
3015 +
3016 +
3017 +
3018 +
3019 +
3020 +
3021 +
3022 +
3023 +
3024 +
3025 +<div class="panelContainer "
3026 +
3027 +
3028 + data-websites-component="/components/panelContainer.v1"
3029 + data-panel-container-lg-mg=""
3030 + data-panel-container-lg-pd=""
3031 + data-panel-container-lg-ht=""
3032 + data-panel-container-md-mg=""
3033 + data-panel-container-md-pd=""
3034 + data-panel-container-md-ht=""
3035 + data-panel-container-sm-mg=""
3036 + data-panel-container-sm-pd=""
3037 + data-panel-container-sm-ht=""
3038 + data-panel-container-xs-mg=""
3039 + data-panel-container-xs-pd=""
3040 + data-panel-container-xs-ht=""
3041 + data-panel-container-limit="">
3042 + <div class="parsys"><div class="textandimage parbase section">
3043 +
3044 +
3045 +
3046 +
3047 +
3048 +
3049 +
3050 +
3051 +
3052 +
3053 +
3054 +
3055 +
3056 +
3057 +
3058 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys1_panelcontainer_parsys_textandimage_copy" class="text-image-container "
3059 + data-text-image-container-right-left="false">
3060 +
3061 +
3062 +
3063 +
3064 +
3065 +
3066 +
3067 +
3068 +
3069 + <div class="row text-image-row"
3070 + data-websites-component="/components/textandimage/rowcontainer"
3071 +
3072 + data-text-image-rowcontainer-bg-type-lg=""
3073 +
3074 +
3075 +
3076 +
3077 +
3078 + data-text-image-rowcontainer-height-lg="0"
3079 + data-text-image-rowcontainer-width-lg="0"
3080 + data-text-image-rowcontainer-class-lg=""
3081 +
3082 + data-text-image-rowcontainer-bg-type-md=""
3083 +
3084 +
3085 +
3086 +
3087 +
3088 + data-text-image-rowcontainer-height-md="0"
3089 + data-text-image-rowcontainer-width-md="0"
3090 + data-text-image-rowcontainer-class-md=""
3091 +
3092 + data-text-image-rowcontainer-bg-type-sm=""
3093 +
3094 +
3095 +
3096 +
3097 +
3098 + data-text-image-rowcontainer-height-sm="0"
3099 + data-text-image-rowcontainer-width-sm="0"
3100 + data-text-image-rowcontainer-class-sm=""
3101 +
3102 + data-text-image-rowcontainer-bg-type-xs=""
3103 +
3104 +
3105 +
3106 +
3107 +
3108 + data-text-image-rowcontainer-height-xs="0"
3109 + data-text-image-rowcontainer-width-xs="0"
3110 + data-text-image-rowcontainer-class-xs="">
3111 +
3112 + <div class="col-xs-12 text-image-text-container
3113 + initializing" ><p style="text-align: center;">Prime rate –</p>
3114 +<p class="chapeau3" style="text-align: center;"><span static-token='tauxBase|percent:&quot;true&quot;'>${p2.tauxBase|percent:&quot;true&quot;}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">***</a></p></div>
3115 + </div>
3116 +
3117 +
3118 +
3119 +
3120 +
3121 +
3122 +
3123 +
3124 +
3125 +
3126 +
3127 +
3128 + <script>
3129 + (function(){
3130 + var $el;
3131 + var listeners = [];
3132 + var dataLayerViewEventName = '';
3133 + var dataLayerViewLayerProperties = [];
3134 +
3135 + dataLayerViewEventName = '';
3136 +
3137 +
3138 +
3139 +
3140 +
3141 + // IE11 trick (because IE11 don't know document.currentScript):
3142 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
3143 + if(document.currentScript){
3144 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3145 + } else {
3146 + var scripts = document.getElementsByTagName( 'script' );
3147 + var currentScript = scripts[scripts.length - 1];
3148 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3149 + }
3150 +
3151 + Websites.Product.Core.initContentQueue.push(function () {
3152 + Websites.Product.TextContent.initTextContent({
3153 + $el: $el,
3154 + capsuleAlias: "",
3155 + listeners: listeners,
3156 + products: Websites.Product.Core.determineProductsArray(""),
3157 + dataLayerViewEvent: {
3158 + dataLayerViewEventName: dataLayerViewEventName,
3159 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys1_panelcontainer_parsys_textandimage_copy" ,
3160 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
3161 + }
3162 + });
3163 + });
3164 + })();
3165 +
3166 + </script>
3167 +
3168 +
3169 +
3170 +
3171 +
3172 +</div>
3173 +
3174 + <script>
3175 +
3176 + /**
3177 + * clickEventDownloadHandler()
3178 + * Is used to handle download image action selected as an opening mode
3179 + *
3180 + */
3181 +
3182 + var firstDownload = true;
3183 +
3184 + function clickEventDownloadHandler() {
3185 +
3186 + var link = this;
3187 + var filename = link.dataset.linkpath;
3188 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
3189 + var fn = filename.substring(filename.lastIndexOf('/')+1);
3190 +
3191 + if (newFile) {
3192 +
3193 + if (firstDownload) {
3194 + firstDownload = false;
3195 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
3196 + } else {
3197 + this.href = link.href;
3198 + }
3199 +
3200 + this.download = fn;
3201 +
3202 + } else {
3203 + this.download = fn + ".html";
3204 + }
3205 + }
3206 +
3207 + </script></div>
3208 +
3209 +</div>
3210 +
3211 +</div>
3212 +
3213 +
3214 +
3215 +<!--/* Initialize Js */-->
3216 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys1/panelcontainer">
3217 + if(""){
3218 + new Websites.Sticky({
3219 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys1/panelcontainer",
3220 + breakpoint: {
3221 + lg: {
3222 + to: ""
3223 + },
3224 + md: {
3225 + to: ""
3226 + },
3227 + sm: {
3228 + to: "",
3229 + },
3230 + xs: {
3231 + to: ""
3232 + }
3233 + }
3234 + });
3235 + }
3236 +</script>
3237 +
3238 +</div>
3239 +</div>
3240 +
3241 +</div>
3242 +
3243 + </div>
3244 +
3245 + <div class="col-xs-12 col-sm-6 column col-last ">
3246 + <div class="parsys2 parsys"><div class="panelContainer section">
3247 +
3248 +
3249 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
3250 +
3251 +
3252 +
3253 + <div>
3254 +
3255 +
3256 +
3257 +
3258 +
3259 +
3260 +
3261 +
3262 +
3263 +
3264 +
3265 +
3266 +
3267 +
3268 +
3269 +
3270 +
3271 +
3272 +
3273 +
3274 +
3275 +
3276 +
3277 +<div class="panelContainer "
3278 +
3279 +
3280 + data-websites-component="/components/panelContainer.v1"
3281 + data-panel-container-lg-mg=""
3282 + data-panel-container-lg-pd=""
3283 + data-panel-container-lg-ht=""
3284 + data-panel-container-md-mg=""
3285 + data-panel-container-md-pd=""
3286 + data-panel-container-md-ht=""
3287 + data-panel-container-sm-mg=""
3288 + data-panel-container-sm-pd=""
3289 + data-panel-container-sm-ht=""
3290 + data-panel-container-xs-mg=""
3291 + data-panel-container-xs-pd=""
3292 + data-panel-container-xs-ht=""
3293 + data-panel-container-limit="">
3294 + <div class="parsys"><div class="textandimage parbase section">
3295 +
3296 +
3297 +
3298 +
3299 +
3300 +
3301 +
3302 +
3303 +
3304 +
3305 +
3306 +
3307 +
3308 +
3309 +
3310 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys2_panelcontainer_parsys_textandimage" class="text-image-container "
3311 + data-text-image-container-right-left="false">
3312 +
3313 +
3314 +
3315 +
3316 +
3317 +
3318 +
3319 +
3320 +
3321 + <div class="row text-image-row"
3322 + data-websites-component="/components/textandimage/rowcontainer"
3323 +
3324 + data-text-image-rowcontainer-bg-type-lg=""
3325 +
3326 +
3327 +
3328 +
3329 +
3330 + data-text-image-rowcontainer-height-lg="0"
3331 + data-text-image-rowcontainer-width-lg="0"
3332 + data-text-image-rowcontainer-class-lg=""
3333 +
3334 + data-text-image-rowcontainer-bg-type-md=""
3335 +
3336 +
3337 +
3338 +
3339 +
3340 + data-text-image-rowcontainer-height-md="0"
3341 + data-text-image-rowcontainer-width-md="0"
3342 + data-text-image-rowcontainer-class-md=""
3343 +
3344 + data-text-image-rowcontainer-bg-type-sm=""
3345 +
3346 +
3347 +
3348 +
3349 +
3350 + data-text-image-rowcontainer-height-sm="0"
3351 + data-text-image-rowcontainer-width-sm="0"
3352 + data-text-image-rowcontainer-class-sm=""
3353 +
3354 + data-text-image-rowcontainer-bg-type-xs=""
3355 +
3356 +
3357 +
3358 +
3359 +
3360 + data-text-image-rowcontainer-height-xs="0"
3361 + data-text-image-rowcontainer-width-xs="0"
3362 + data-text-image-rowcontainer-class-xs="">
3363 +
3364 + <div class="col-xs-12 text-image-text-container
3365 + initializing" ><p class="chapeau3" style="text-align: center;"><span static-token='tac5ans|percent:&quot;true&quot;'>${p2.tac5ans|percent:&quot;true&quot;}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p>
3366 +<p style="text-align: center;">APR<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">2</a></sup></p></div>
3367 + </div>
3368 +
3369 +
3370 +
3371 +
3372 +
3373 +
3374 +
3375 +
3376 +
3377 +
3378 +
3379 +
3380 + <script>
3381 + (function(){
3382 + var $el;
3383 + var listeners = [];
3384 + var dataLayerViewEventName = '';
3385 + var dataLayerViewLayerProperties = [];
3386 +
3387 + dataLayerViewEventName = '';
3388 +
3389 +
3390 +
3391 +
3392 +
3393 + // IE11 trick (because IE11 don't know document.currentScript):
3394 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
3395 + if(document.currentScript){
3396 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3397 + } else {
3398 + var scripts = document.getElementsByTagName( 'script' );
3399 + var currentScript = scripts[scripts.length - 1];
3400 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3401 + }
3402 +
3403 + Websites.Product.Core.initContentQueue.push(function () {
3404 + Websites.Product.TextContent.initTextContent({
3405 + $el: $el,
3406 + capsuleAlias: "",
3407 + listeners: listeners,
3408 + products: Websites.Product.Core.determineProductsArray(""),
3409 + dataLayerViewEvent: {
3410 + dataLayerViewEventName: dataLayerViewEventName,
3411 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys2_panelcontainer_parsys_textandimage" ,
3412 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
3413 + }
3414 + });
3415 + });
3416 + })();
3417 +
3418 + </script>
3419 +
3420 +
3421 +
3422 +
3423 +
3424 +</div>
3425 +
3426 + <script>
3427 +
3428 + /**
3429 + * clickEventDownloadHandler()
3430 + * Is used to handle download image action selected as an opening mode
3431 + *
3432 + */
3433 +
3434 + var firstDownload = true;
3435 +
3436 + function clickEventDownloadHandler() {
3437 +
3438 + var link = this;
3439 + var filename = link.dataset.linkpath;
3440 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
3441 + var fn = filename.substring(filename.lastIndexOf('/')+1);
3442 +
3443 + if (newFile) {
3444 +
3445 + if (firstDownload) {
3446 + firstDownload = false;
3447 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
3448 + } else {
3449 + this.href = link.href;
3450 + }
3451 +
3452 + this.download = fn;
3453 +
3454 + } else {
3455 + this.download = fn + ".html";
3456 + }
3457 + }
3458 +
3459 + </script></div>
3460 +
3461 +</div>
3462 +
3463 +</div>
3464 +
3465 +
3466 +
3467 +<!--/* Initialize Js */-->
3468 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys2/panelcontainer">
3469 + if(""){
3470 + new Websites.Sticky({
3471 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys2/panelcontainer",
3472 + breakpoint: {
3473 + lg: {
3474 + to: ""
3475 + },
3476 + md: {
3477 + to: ""
3478 + },
3479 + sm: {
3480 + to: "",
3481 + },
3482 + xs: {
3483 + to: ""
3484 + }
3485 + }
3486 + });
3487 + }
3488 +</script>
3489 +
3490 +</div>
3491 +</div>
3492 +
3493 +</div>
3494 +
3495 + </div>
3496 +
3497 + </div>
3498 +
3499 +
3500 +
3501 +</div>
3502 +
3503 +</div>
3504 +
3505 +</div>
3506 +
3507 +
3508 +
3509 +<!--/* Initialize Js */-->
3510 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156">
3511 + if(""){
3512 + new Websites.Sticky({
3513 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156",
3514 + breakpoint: {
3515 + lg: {
3516 + to: "none"
3517 + },
3518 + md: {
3519 + to: "none"
3520 + },
3521 + sm: {
3522 + to: "none",
3523 + },
3524 + xs: {
3525 + to: "none"
3526 + }
3527 + }
3528 + });
3529 + }
3530 +</script>
3531 +
3532 +</div>
3533 +</div>
3534 +
3535 +</div>
3536 +
3537 +</div>
3538 +
3539 +
3540 +
3541 +<!--/* Initialize Js */-->
3542 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_">
3543 + if(""){
3544 + new Websites.Sticky({
3545 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_",
3546 + breakpoint: {
3547 + lg: {
3548 + to: "none"
3549 + },
3550 + md: {
3551 + to: "none"
3552 + },
3553 + sm: {
3554 + to: "none",
3555 + },
3556 + xs: {
3557 + to: "none"
3558 + }
3559 + }
3560 + });
3561 + }
3562 +</script>
3563 +
3564 +</div>
3565 +</div>
3566 +
3567 +</div>
3568 +
3569 + </div>
3570 +
3571 + </div>
3572 +
3573 +
3574 +
3575 +</div>
3576 +
3577 +</div>
3578 +
3579 +</div>
3580 +
3581 +
3582 +
3583 +<!--/* Initialize Js */-->
3584 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy">
3585 + if(""){
3586 + new Websites.Sticky({
3587 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy",
3588 + breakpoint: {
3589 + lg: {
3590 + to: ""
3591 + },
3592 + md: {
3593 + to: ""
3594 + },
3595 + sm: {
3596 + to: "",
3597 + },
3598 + xs: {
3599 + to: ""
3600 + }
3601 + }
3602 + });
3603 + }
3604 +</script>
3605 +
3606 +</div>
3607 +</div>
3608 +<div class="textandimage parbase section">
3609 +
3610 +
3611 +
3612 +
3613 +
3614 +
3615 +
3616 +
3617 +
3618 +
3619 +
3620 +
3621 +
3622 +
3623 +
3624 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_copy_co" class="text-image-container "
3625 + data-text-image-container-right-left="false">
3626 +
3627 +
3628 +
3629 +
3630 +
3631 +
3632 +
3633 +
3634 +
3635 + <div class="row text-image-row"
3636 + data-websites-component="/components/textandimage/rowcontainer"
3637 +
3638 + data-text-image-rowcontainer-bg-type-lg=""
3639 +
3640 +
3641 +
3642 +
3643 +
3644 + data-text-image-rowcontainer-height-lg="0"
3645 + data-text-image-rowcontainer-width-lg="0"
3646 + data-text-image-rowcontainer-class-lg=""
3647 +
3648 + data-text-image-rowcontainer-bg-type-md=""
3649 +
3650 +
3651 +
3652 +
3653 +
3654 + data-text-image-rowcontainer-height-md="0"
3655 + data-text-image-rowcontainer-width-md="0"
3656 + data-text-image-rowcontainer-class-md=""
3657 +
3658 + data-text-image-rowcontainer-bg-type-sm=""
3659 +
3660 +
3661 +
3662 +
3663 +
3664 + data-text-image-rowcontainer-height-sm="0"
3665 + data-text-image-rowcontainer-width-sm="0"
3666 + data-text-image-rowcontainer-class-sm=""
3667 +
3668 + data-text-image-rowcontainer-bg-type-xs=""
3669 +
3670 +
3671 +
3672 +
3673 +
3674 + data-text-image-rowcontainer-height-xs="0"
3675 + data-text-image-rowcontainer-width-xs="0"
3676 + data-text-image-rowcontainer-class-xs="">
3677 +
3678 + <div class="col-xs-12 text-image-text-container " ><h3 class="h3variant3">Other promotional rates<br>
3679 +</h3>
3680 +</div>
3681 + </div>
3682 +
3683 +
3684 +
3685 +
3686 +
3687 +
3688 +
3689 +
3690 +
3691 +
3692 +
3693 + <script>
3694 +
3695 + (function(){
3696 +
3697 + var dataLayerViewEventName = '' || '';
3698 + var dataLayerViewLayerProperties = [];
3699 + var $el;
3700 +
3701 +
3702 +
3703 + if(dataLayerViewEventName.trim().length) {
3704 +
3705 + var obj = {
3706 + dataLayerViewEventName: dataLayerViewEventName,
3707 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_copy_co" ,
3708 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
3709 + };
3710 +
3711 + // IE11 trick (because IE11 don't know document.currentScript):
3712 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
3713 + if(document.currentScript){
3714 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3715 + } else {
3716 + var scripts = document.getElementsByTagName( 'script' );
3717 + var currentScript = scripts[scripts.length - 1];
3718 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3719 + }
3720 +
3721 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
3722 + Websites.DataLayer.cleanViewEventJSON(obj)));
3723 + $el.setAttribute("data-dataLayerViewEvent", 'true');
3724 +
3725 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
3726 +
3727 + }
3728 +
3729 + })();
3730 +
3731 + </script>
3732 +
3733 +</div>
3734 +
3735 + <script>
3736 +
3737 + /**
3738 + * clickEventDownloadHandler()
3739 + * Is used to handle download image action selected as an opening mode
3740 + *
3741 + */
3742 +
3743 + var firstDownload = true;
3744 +
3745 + function clickEventDownloadHandler() {
3746 +
3747 + var link = this;
3748 + var filename = link.dataset.linkpath;
3749 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
3750 + var fn = filename.substring(filename.lastIndexOf('/')+1);
3751 +
3752 + if (newFile) {
3753 +
3754 + if (firstDownload) {
3755 + firstDownload = false;
3756 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
3757 + } else {
3758 + this.href = link.href;
3759 + }
3760 +
3761 + this.download = fn;
3762 +
3763 + } else {
3764 + this.download = fn + ".html";
3765 + }
3766 + }
3767 +
3768 + </script></div>
3769 +<div class="table parbase section">
3770 +
3771 +
3772 +
3773 +<script src="/etc.clientlibs/web-sites/components/table/clientlibs/site.min.3e37d1187a23edb74eb7c7bd2e36c4e6.js"></script>
3774 +
3775 +
3776 +
3777 +
3778 +<div class="table-container">
3779 + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1">
3780 + <tbody>
3781 + <tr class="no-border">
3782 + <th style="text-align: center; width: 50.0%;" class="separator">Term<br></th>
3783 + <th style="text-align: center; width: 25.0%;" class="separator">Interest rate</th>
3784 + <th style="text-align: center; width: 25.0%;" class="separator">APR<sup><a hrefnoextension="false" href="#notes-item-4f8cde8ad8" target="_self">2</a></sup></th>
3785 + </tr>
3786 + <tr>
3787 + <td><p style="margin-left: 40.0px;"><b>1 year&nbsp;</b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup><br></p></td>
3788 + <td><p class="chapeau3" style="text-align: center;">5.49%<br></p></td>
3789 + <td><p class="chapeau3" style="text-align: center;">5.61%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td>
3790 + </tr>
3791 + <tr>
3792 + <td><p style="margin-left: 40.0px;"><b>2 year&nbsp;</b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td>
3793 + <td><p class="chapeau3" style="text-align: center;">4.84%<br></p></td>
3794 + <td><p class="chapeau3" style="text-align: center;">4.91%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td>
3795 + </tr>
3796 + <tr>
3797 + <td><p style="margin-left: 40.0px;"><b>3 year&nbsp;</b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td>
3798 + <td><p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo3ansF|percent:"true"'>${p1.tauxPromo3ansF|percent:"true"}</span><br></p></td>
3799 + <td><p class="chapeau3" style="text-align: center;"><span static-token='tac3ans|percent:"true"'>${p1.tac3ans|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td>
3800 + </tr>
3801 + <tr>
3802 + <td><p style="margin-left: 40.0px;"><b>4 year&nbsp;</b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td>
3803 + <td><p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo4ansF|percent:"true"'>${p1.tauxPromo4ansF|percent:"true"}</span><br></p></td>
3804 + <td><p class="chapeau3" style="text-align: center;"><span static-token='tac4ans|percent:"true"'>${p1.tac4ans|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td>
3805 + </tr>
3806 + <tr>
3807 + <td><p style="margin-left: 40.0px;"><b>7 year&nbsp;</b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td>
3808 + <td><p class="chapeau3" style="text-align: center;">5.26%<br></p></td>
3809 + <td><p class="chapeau3" style="text-align: center;">5.29%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td>
3810 + </tr>
3811 + </tbody>
3812 +</table>
3813 +
3814 + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span>
3815 + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span>
3816 + <div class="table-carousel-dots"></div>
3817 +</div>
3818 +
3819 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/table_copy_copy_copy">
3820 + new Websites.TableStatic({
3821 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/table_copy_copy_copy",
3822 + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')),
3823 + capsuleAlias: "c1",
3824 + staticHeader: !!(""), // use !! to convert to boolean
3825 + carousel: !!(""),
3826 + transposition: !!(""),
3827 + customId: ""
3828 + });
3829 +</script>
3830 +</div>
3831 +<div class="textandimage parbase section">
3832 +
3833 +
3834 +
3835 +
3836 +
3837 +
3838 +
3839 +
3840 +
3841 +
3842 +
3843 +
3844 +
3845 +
3846 +
3847 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_310874312" class="text-image-container "
3848 + data-text-image-container-right-left="false">
3849 +
3850 +
3851 +
3852 +
3853 +
3854 +
3855 +
3856 +
3857 +
3858 + <div class="row text-image-row"
3859 + data-websites-component="/components/textandimage/rowcontainer"
3860 +
3861 + data-text-image-rowcontainer-bg-type-lg="none"
3862 +
3863 +
3864 +
3865 +
3866 +
3867 + data-text-image-rowcontainer-height-lg="0"
3868 + data-text-image-rowcontainer-width-lg="0"
3869 + data-text-image-rowcontainer-class-lg="backgroundColor1"
3870 +
3871 + data-text-image-rowcontainer-bg-type-md="none"
3872 +
3873 +
3874 +
3875 +
3876 +
3877 + data-text-image-rowcontainer-height-md="0"
3878 + data-text-image-rowcontainer-width-md="0"
3879 + data-text-image-rowcontainer-class-md="backgroundColor1"
3880 +
3881 + data-text-image-rowcontainer-bg-type-sm="none"
3882 +
3883 +
3884 +
3885 +
3886 +
3887 + data-text-image-rowcontainer-height-sm="0"
3888 + data-text-image-rowcontainer-width-sm="0"
3889 + data-text-image-rowcontainer-class-sm="backgroundColor1"
3890 +
3891 + data-text-image-rowcontainer-bg-type-xs="none"
3892 +
3893 +
3894 +
3895 +
3896 +
3897 + data-text-image-rowcontainer-height-xs="0"
3898 + data-text-image-rowcontainer-width-xs="0"
3899 + data-text-image-rowcontainer-class-xs="backgroundColor1">
3900 +
3901 + <div class="col-xs-12 text-image-text-container
3902 + initializing" ><p class="pvariant3"><b><br>
3903 + Rate (%) as at&nbsp;<span static-token='tauxDateJour|date:&quot;-&quot;'>${p1.tauxDateJour|date:&quot;-&quot;}</span></b></p></div>
3904 + </div>
3905 +
3906 +
3907 +
3908 +
3909 +
3910 +
3911 +
3912 +
3913 +
3914 +
3915 +
3916 +
3917 + <script>
3918 + (function(){
3919 + var $el;
3920 + var listeners = [];
3921 + var dataLayerViewEventName = '';
3922 + var dataLayerViewLayerProperties = [];
3923 +
3924 + dataLayerViewEventName = '';
3925 +
3926 +
3927 +
3928 +
3929 +
3930 + // IE11 trick (because IE11 don't know document.currentScript):
3931 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
3932 + if(document.currentScript){
3933 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3934 + } else {
3935 + var scripts = document.getElementsByTagName( 'script' );
3936 + var currentScript = scripts[scripts.length - 1];
3937 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
3938 + }
3939 +
3940 + Websites.Product.Core.initContentQueue.push(function () {
3941 + Websites.Product.TextContent.initTextContent({
3942 + $el: $el,
3943 + capsuleAlias: "c1",
3944 + listeners: listeners,
3945 + products: Websites.Product.Core.determineProductsArray("c1"),
3946 + dataLayerViewEvent: {
3947 + dataLayerViewEventName: dataLayerViewEventName,
3948 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_310874312" ,
3949 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
3950 + }
3951 + });
3952 + });
3953 + })();
3954 +
3955 + </script>
3956 +
3957 +
3958 +
3959 +
3960 +
3961 +</div>
3962 +
3963 + <script>
3964 +
3965 + /**
3966 + * clickEventDownloadHandler()
3967 + * Is used to handle download image action selected as an opening mode
3968 + *
3969 + */
3970 +
3971 + var firstDownload = true;
3972 +
3973 + function clickEventDownloadHandler() {
3974 +
3975 + var link = this;
3976 + var filename = link.dataset.linkpath;
3977 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
3978 + var fn = filename.substring(filename.lastIndexOf('/')+1);
3979 +
3980 + if (newFile) {
3981 +
3982 + if (firstDownload) {
3983 + firstDownload = false;
3984 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
3985 + } else {
3986 + this.href = link.href;
3987 + }
3988 +
3989 + this.download = fn;
3990 +
3991 + } else {
3992 + this.download = fn + ".html";
3993 + }
3994 + }
3995 +
3996 + </script></div>
3997 +
3998 +</div>
3999 +
4000 +</div>
4001 +
4002 +
4003 +
4004 +<!--/* Initialize Js */-->
4005 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer">
4006 + if(""){
4007 + new Websites.Sticky({
4008 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer",
4009 + breakpoint: {
4010 + lg: {
4011 + to: ""
4012 + },
4013 + md: {
4014 + to: ""
4015 + },
4016 + sm: {
4017 + to: "none",
4018 + },
4019 + xs: {
4020 + to: "none"
4021 + }
4022 + }
4023 + });
4024 + }
4025 +</script>
4026 +
4027 +</div>
4028 +</div>
4029 +<div class="panelContainer section">
4030 +
4031 +
4032 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
4033 +
4034 +
4035 +
4036 + <div>
4037 +
4038 +
4039 +
4040 +
4041 +
4042 +
4043 +
4044 +
4045 +
4046 +
4047 +
4048 +
4049 +
4050 +
4051 +
4052 +
4053 +
4054 +
4055 +
4056 +
4057 +
4058 +
4059 +
4060 +<div class="panelContainer background-tertiary-lightGrey panel-border-radius "
4061 +
4062 +
4063 + data-websites-component="/components/panelContainer.v1"
4064 + data-panel-container-lg-mg=""
4065 + data-panel-container-lg-pd=""
4066 + data-panel-container-lg-ht=""
4067 + data-panel-container-md-mg=""
4068 + data-panel-container-md-pd=""
4069 + data-panel-container-md-ht=""
4070 + data-panel-container-sm-mg=""
4071 + data-panel-container-sm-pd=""
4072 + data-panel-container-sm-ht=""
4073 + data-panel-container-xs-mg=""
4074 + data-panel-container-xs-pd=""
4075 + data-panel-container-xs-ht=""
4076 + data-panel-container-limit="">
4077 + <div class="parsys"><div class="columns parbase section">
4078 +
4079 +
4080 +
4081 +
4082 +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div>
4083 +
4084 +
4085 +
4086 +
4087 +
4088 +
4089 +
4090 +
4091 +
4092 +
4093 +
4094 +
4095 +
4096 + <div style=""
4097 + class="columns-row row row-eq-height"
4098 +
4099 + data-style-lg="" data-height-lg=""
4100 + data-width-lg=""
4101 + data-background-color-lg=""
4102 + data-background-color-xs="">
4103 + <div style=""
4104 + class="col-xs-12 col-sm-12 columns-title "
4105 + data-height="" data-width=""
4106 + data-style-xs="" data-height-xs=""
4107 + data-width-xs="">
4108 +
4109 + </div>
4110 +
4111 +
4112 +
4113 +
4114 + <div class="col-xs-12 col-sm-4 column col-first ">
4115 + <div class="parsys1 parsys"><div class="panelContainer section">
4116 +
4117 +
4118 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
4119 +
4120 +
4121 +
4122 + <div>
4123 +
4124 +
4125 +
4126 +
4127 +
4128 +
4129 +
4130 +
4131 +
4132 +
4133 +
4134 +
4135 +
4136 +
4137 +
4138 +
4139 +
4140 +
4141 +
4142 +
4143 +
4144 +
4145 +
4146 +<div class="panelContainer background-secondary-white "
4147 +
4148 +
4149 + data-websites-component="/components/panelContainer.v1"
4150 + data-panel-container-lg-mg=""
4151 + data-panel-container-lg-pd="0px 0px 10px 0px"
4152 + data-panel-container-lg-ht=""
4153 + data-panel-container-md-mg=""
4154 + data-panel-container-md-pd="0px 0px 40px 0px"
4155 + data-panel-container-md-ht=""
4156 + data-panel-container-sm-mg=""
4157 + data-panel-container-sm-pd=""
4158 + data-panel-container-sm-ht="320px"
4159 + data-panel-container-xs-mg=""
4160 + data-panel-container-xs-pd=""
4161 + data-panel-container-xs-ht=""
4162 + data-panel-container-limit="">
4163 + <div class="parsys"><div class="textandimage parbase section">
4164 +
4165 +
4166 +
4167 +
4168 +
4169 +
4170 +
4171 +
4172 +
4173 +
4174 +
4175 +
4176 +
4177 +
4178 +
4179 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys1_panelcontainer_parsys_textandimage" class="text-image-container "
4180 + data-text-image-container-right-left="false">
4181 +
4182 +
4183 +
4184 +
4185 +
4186 +
4187 +
4188 +
4189 +
4190 + <div class="row text-image-row"
4191 + data-websites-component="/components/textandimage/rowcontainer"
4192 +
4193 + data-text-image-rowcontainer-bg-type-lg="none"
4194 +
4195 +
4196 +
4197 +
4198 +
4199 + data-text-image-rowcontainer-height-lg="0"
4200 + data-text-image-rowcontainer-width-lg="0"
4201 + data-text-image-rowcontainer-class-lg="backgroundColor1"
4202 +
4203 + data-text-image-rowcontainer-bg-type-md="none"
4204 +
4205 +
4206 +
4207 +
4208 +
4209 + data-text-image-rowcontainer-height-md="0"
4210 + data-text-image-rowcontainer-width-md="0"
4211 + data-text-image-rowcontainer-class-md="backgroundColor1"
4212 +
4213 + data-text-image-rowcontainer-bg-type-sm="none"
4214 +
4215 +
4216 +
4217 +
4218 +
4219 + data-text-image-rowcontainer-height-sm="0"
4220 + data-text-image-rowcontainer-width-sm="0"
4221 + data-text-image-rowcontainer-class-sm="backgroundColor1"
4222 +
4223 + data-text-image-rowcontainer-bg-type-xs="none"
4224 +
4225 +
4226 +
4227 +
4228 +
4229 + data-text-image-rowcontainer-height-xs="0"
4230 + data-text-image-rowcontainer-width-xs="0"
4231 + data-text-image-rowcontainer-class-xs="backgroundColor1">
4232 +
4233 +
4234 +
4235 +
4236 +
4237 +
4238 +
4239 +
4240 +
4241 +
4242 +
4243 +
4244 +
4245 +
4246 + <div class="col-xs-12 text-image-image-container" >
4247 +
4248 +
4249 +
4250 + <div>
4251 +
4252 +
4253 +
4254 +
4255 +
4256 +
4257 + <picture>
4258 +
4259 +
4260 +
4261 +
4262 +
4263 +
4264 +
4265 +
4266 +
4267 +
4268 +
4269 +
4270 +
4271 + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(max-width: 767px)">
4272 +
4273 +
4274 +
4275 +
4276 +
4277 +
4278 +
4279 +
4280 +
4281 +
4282 +
4283 +
4284 +
4285 +
4286 +
4287 +
4288 +
4289 +
4290 +
4291 +
4292 +
4293 +
4294 +
4295 +
4296 + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(max-width: 991px)">
4297 +
4298 +
4299 +
4300 +
4301 +
4302 +
4303 +
4304 +
4305 +
4306 +
4307 +
4308 +
4309 +
4310 +
4311 +
4312 +
4313 +
4314 +
4315 +
4316 +
4317 +
4318 +
4319 +
4320 +
4321 + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(max-width: 1199px)">
4322 +
4323 +
4324 +
4325 +
4326 +
4327 +
4328 +
4329 +
4330 +
4331 +
4332 +
4333 +
4334 +
4335 +
4336 + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(min-width: 1200px)">
4337 +
4338 +
4339 +
4340 +
4341 + <img src='/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png' srcset='/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png' data-websites-component="/components/textandimage/image" alt="" data-picture-alttext-lg="" data-picture-alttext-md="" data-picture-alttext-sm="" data-picture-alttext-xs="" class="center-block image-responsive">
4342 + </picture>
4343 +
4344 +
4345 +
4346 + <script type="text/javascript">
4347 +
4348 + var Websites = Websites || {};
4349 + Websites.FragmentPicture = Websites.FragmentPicture || {
4350 + init: function(viewport) {
4351 + Websites.FragmentPicture.loadAlternativeText(viewport);
4352 + },
4353 +
4354 + loadAlternativeText: function(viewport) {
4355 + $('[data-websites-component="/components/textandimage/image"]').each(function(){
4356 + if(viewport.is("xs") ) {
4357 + $(this).attr("alt", $(this).data("picture-alttext-xs"));
4358 + } else if(viewport.is("sm") ) {
4359 + $(this).attr("alt", $(this).data("picture-alttext-sm"));
4360 + } else if(viewport.is("md") ) {
4361 + $(this).attr("alt", $(this).data("picture-alttext-md"));
4362 + } else if(viewport.is("lg") ) {
4363 + $(this).attr("alt", $(this).data("picture-alttext-lg"));
4364 + }
4365 + });
4366 + }
4367 + };
4368 +
4369 + $(document).ready(function(){
4370 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
4371 + });
4372 +
4373 + Websites.Events.onBreakpointChanged(function(){
4374 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
4375 + });
4376 + </script>
4377 +
4378 +
4379 +
4380 +
4381 +
4382 + </div>
4383 +
4384 +
4385 +
4386 +</div>
4387 +<div
4388 + class="col-xs-12 text-image-text-container "
4389 +
4390 + data-websites-component="/components/textandimage/text"
4391 + data-text-image-text-container-style-xs="{'padding-top': '0px'}"
4392 + data-text-image-text-container-style-sm="{'padding-top': '0px'}"
4393 + data-text-image-text-container-style-md="{'padding-top': '0px'}"
4394 + data-text-image-text-container-style-lg="{'padding-top': '0px'}"></div>
4395 +
4396 +
4397 +
4398 +
4399 +
4400 +
4401 +
4402 +
4403 +
4404 + </div>
4405 +
4406 +
4407 +
4408 +
4409 +
4410 +
4411 +
4412 +
4413 +
4414 +
4415 +
4416 +
4417 + <script>
4418 +
4419 + (function(){
4420 +
4421 + var dataLayerViewEventName = '' || '';
4422 + var dataLayerViewLayerProperties = [];
4423 + var $el;
4424 +
4425 +
4426 +
4427 + if(dataLayerViewEventName.trim().length) {
4428 +
4429 + var obj = {
4430 + dataLayerViewEventName: dataLayerViewEventName,
4431 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys1_panelcontainer_parsys_textandimage" ,
4432 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
4433 + };
4434 +
4435 + // IE11 trick (because IE11 don't know document.currentScript):
4436 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
4437 + if(document.currentScript){
4438 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
4439 + } else {
4440 + var scripts = document.getElementsByTagName( 'script' );
4441 + var currentScript = scripts[scripts.length - 1];
4442 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
4443 + }
4444 +
4445 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
4446 + Websites.DataLayer.cleanViewEventJSON(obj)));
4447 + $el.setAttribute("data-dataLayerViewEvent", 'true');
4448 +
4449 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
4450 +
4451 + }
4452 +
4453 + })();
4454 +
4455 + </script>
4456 +
4457 +</div>
4458 +
4459 + <script>
4460 +
4461 + /**
4462 + * clickEventDownloadHandler()
4463 + * Is used to handle download image action selected as an opening mode
4464 + *
4465 + */
4466 +
4467 + var firstDownload = true;
4468 +
4469 + function clickEventDownloadHandler() {
4470 +
4471 + var link = this;
4472 + var filename = link.dataset.linkpath;
4473 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
4474 + var fn = filename.substring(filename.lastIndexOf('/')+1);
4475 +
4476 + if (newFile) {
4477 +
4478 + if (firstDownload) {
4479 + firstDownload = false;
4480 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
4481 + } else {
4482 + this.href = link.href;
4483 + }
4484 +
4485 + this.download = fn;
4486 +
4487 + } else {
4488 + this.download = fn + ".html";
4489 + }
4490 + }
4491 +
4492 + </script></div>
4493 +
4494 +</div>
4495 +
4496 +</div>
4497 +
4498 +
4499 +
4500 +<!--/* Initialize Js */-->
4501 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys1/panelcontainer">
4502 + if(""){
4503 + new Websites.Sticky({
4504 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys1/panelcontainer",
4505 + breakpoint: {
4506 + lg: {
4507 + to: "none"
4508 + },
4509 + md: {
4510 + to: "none"
4511 + },
4512 + sm: {
4513 + to: "none",
4514 + },
4515 + xs: {
4516 + to: "none"
4517 + }
4518 + }
4519 + });
4520 + }
4521 +</script>
4522 +
4523 +</div>
4524 +</div>
4525 +
4526 +</div>
4527 +
4528 + </div>
4529 +
4530 + <div class="col-xs-12 col-sm-8 column col-last ">
4531 + <div class="parsys2 parsys"><div class="panelContainer section">
4532 +
4533 +
4534 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
4535 +
4536 +
4537 +
4538 + <div>
4539 +
4540 +
4541 +
4542 +
4543 +
4544 +
4545 +
4546 +
4547 +
4548 +
4549 +
4550 +
4551 +
4552 +
4553 +
4554 +
4555 +
4556 +
4557 +
4558 +
4559 +
4560 +
4561 +
4562 +<div class="panelContainer "
4563 +
4564 +
4565 + data-websites-component="/components/panelContainer.v1"
4566 + data-panel-container-lg-mg=""
4567 + data-panel-container-lg-pd="10px 20px"
4568 + data-panel-container-lg-ht=""
4569 + data-panel-container-md-mg=""
4570 + data-panel-container-md-pd="0px 10px"
4571 + data-panel-container-md-ht=""
4572 + data-panel-container-sm-mg=""
4573 + data-panel-container-sm-pd="10px 20px"
4574 + data-panel-container-sm-ht=""
4575 + data-panel-container-xs-mg=""
4576 + data-panel-container-xs-pd="10px 20px"
4577 + data-panel-container-xs-ht=""
4578 + data-panel-container-limit="">
4579 + <div class="parsys"><div class="textandimage parbase section">
4580 +
4581 +
4582 +
4583 +
4584 +
4585 +
4586 +
4587 +
4588 +
4589 +
4590 +
4591 +
4592 +
4593 +
4594 +
4595 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys2_panelcontainer_parsys_textandimage" class="text-image-container "
4596 + data-text-image-container-right-left="false">
4597 +
4598 +
4599 +
4600 +
4601 +
4602 +
4603 +
4604 +
4605 +
4606 + <div class="row text-image-row"
4607 + data-websites-component="/components/textandimage/rowcontainer"
4608 +
4609 + data-text-image-rowcontainer-bg-type-lg=""
4610 +
4611 +
4612 +
4613 +
4614 +
4615 + data-text-image-rowcontainer-height-lg="0"
4616 + data-text-image-rowcontainer-width-lg="0"
4617 + data-text-image-rowcontainer-class-lg=""
4618 +
4619 + data-text-image-rowcontainer-bg-type-md=""
4620 +
4621 +
4622 +
4623 +
4624 +
4625 + data-text-image-rowcontainer-height-md="0"
4626 + data-text-image-rowcontainer-width-md="0"
4627 + data-text-image-rowcontainer-class-md=""
4628 +
4629 + data-text-image-rowcontainer-bg-type-sm=""
4630 +
4631 +
4632 +
4633 +
4634 +
4635 + data-text-image-rowcontainer-height-sm="0"
4636 + data-text-image-rowcontainer-width-sm="0"
4637 + data-text-image-rowcontainer-class-sm=""
4638 +
4639 + data-text-image-rowcontainer-bg-type-xs=""
4640 +
4641 +
4642 +
4643 +
4644 +
4645 + data-text-image-rowcontainer-height-xs="0"
4646 + data-text-image-rowcontainer-width-xs="0"
4647 + data-text-image-rowcontainer-class-xs="">
4648 +
4649 + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant3" style="text-align: left;"><b>Take advantage of our mortgage offers</b></h2>
4650 +<p class="pvariant3" style="text-align: left;">Bundle your mortgage, new investments, and mortgage loan insurance to unlock additional cashback opportunities.*</p>
4651 +<p class="pvariant3" style="text-align: left;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="/personal/mortgages/offers.html" class="btnRTE3 btn-arrow btn" target="_self" hrefnoextension="false">Discover our offers</a></p>
4652 +<p class="legalnotes3" style="text-align: left;">*For a limited time. Conditions and restrictions apply.&nbsp;</p>
4653 +</div>
4654 + </div>
4655 +
4656 +
4657 +
4658 +
4659 +
4660 +
4661 +
4662 +
4663 +
4664 +
4665 +
4666 + <script>
4667 +
4668 + (function(){
4669 +
4670 + var dataLayerViewEventName = '' || '';
4671 + var dataLayerViewLayerProperties = [];
4672 + var $el;
4673 +
4674 +
4675 +
4676 + if(dataLayerViewEventName.trim().length) {
4677 +
4678 + var obj = {
4679 + dataLayerViewEventName: dataLayerViewEventName,
4680 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys2_panelcontainer_parsys_textandimage" ,
4681 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
4682 + };
4683 +
4684 + // IE11 trick (because IE11 don't know document.currentScript):
4685 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
4686 + if(document.currentScript){
4687 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
4688 + } else {
4689 + var scripts = document.getElementsByTagName( 'script' );
4690 + var currentScript = scripts[scripts.length - 1];
4691 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
4692 + }
4693 +
4694 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
4695 + Websites.DataLayer.cleanViewEventJSON(obj)));
4696 + $el.setAttribute("data-dataLayerViewEvent", 'true');
4697 +
4698 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
4699 +
4700 + }
4701 +
4702 + })();
4703 +
4704 + </script>
4705 +
4706 +</div>
4707 +
4708 + <script>
4709 +
4710 + /**
4711 + * clickEventDownloadHandler()
4712 + * Is used to handle download image action selected as an opening mode
4713 + *
4714 + */
4715 +
4716 + var firstDownload = true;
4717 +
4718 + function clickEventDownloadHandler() {
4719 +
4720 + var link = this;
4721 + var filename = link.dataset.linkpath;
4722 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
4723 + var fn = filename.substring(filename.lastIndexOf('/')+1);
4724 +
4725 + if (newFile) {
4726 +
4727 + if (firstDownload) {
4728 + firstDownload = false;
4729 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
4730 + } else {
4731 + this.href = link.href;
4732 + }
4733 +
4734 + this.download = fn;
4735 +
4736 + } else {
4737 + this.download = fn + ".html";
4738 + }
4739 + }
4740 +
4741 + </script></div>
4742 +
4743 +</div>
4744 +
4745 +</div>
4746 +
4747 +
4748 +
4749 +<!--/* Initialize Js */-->
4750 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys2/panelcontainer">
4751 + if(""){
4752 + new Websites.Sticky({
4753 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys2/panelcontainer",
4754 + breakpoint: {
4755 + lg: {
4756 + to: "none"
4757 + },
4758 + md: {
4759 + to: "none"
4760 + },
4761 + sm: {
4762 + to: "none",
4763 + },
4764 + xs: {
4765 + to: "none"
4766 + }
4767 + }
4768 + });
4769 + }
4770 +</script>
4771 +
4772 +</div>
4773 +</div>
4774 +
4775 +</div>
4776 +
4777 + </div>
4778 +
4779 + </div>
4780 +
4781 +
4782 +
4783 +</div>
4784 +
4785 +</div>
4786 +
4787 +</div>
4788 +
4789 +
4790 +
4791 +<!--/* Initialize Js */-->
4792 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_">
4793 + if(""){
4794 + new Websites.Sticky({
4795 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_",
4796 + breakpoint: {
4797 + lg: {
4798 + to: "none"
4799 + },
4800 + md: {
4801 + to: "none"
4802 + },
4803 + sm: {
4804 + to: "none",
4805 + },
4806 + xs: {
4807 + to: "none"
4808 + }
4809 + }
4810 + });
4811 + }
4812 +</script>
4813 +
4814 +</div>
4815 +</div>
4816 +
4817 +</div>
4818 +
4819 +</div>
4820 +
4821 +
4822 +
4823 +<!--/* Initialize Js */-->
4824 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889">
4825 + if(""){
4826 + new Websites.Sticky({
4827 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889",
4828 + breakpoint: {
4829 + lg: {
4830 + to: ""
4831 + },
4832 + md: {
4833 + to: ""
4834 + },
4835 + sm: {
4836 + to: "",
4837 + },
4838 + xs: {
4839 + to: ""
4840 + }
4841 + }
4842 + });
4843 + }
4844 +</script>
4845 +
4846 +</div>
4847 +</div>
4848 +<div class="panelContainer section">
4849 +
4850 +
4851 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
4852 +
4853 +
4854 +
4855 + <div>
4856 +
4857 +
4858 +
4859 +
4860 +
4861 +
4862 +
4863 +
4864 +
4865 +
4866 +
4867 +
4868 +
4869 +
4870 +
4871 +
4872 +
4873 +
4874 +
4875 +
4876 +
4877 +
4878 +
4879 +<div class="panelContainer "
4880 +
4881 +
4882 + data-websites-component="/components/panelContainer.v1"
4883 + data-panel-container-lg-mg=""
4884 + data-panel-container-lg-pd=""
4885 + data-panel-container-lg-ht=""
4886 + data-panel-container-md-mg=""
4887 + data-panel-container-md-pd=""
4888 + data-panel-container-md-ht=""
4889 + data-panel-container-sm-mg=""
4890 + data-panel-container-sm-pd=""
4891 + data-panel-container-sm-ht=""
4892 + data-panel-container-xs-mg=""
4893 + data-panel-container-xs-pd=""
4894 + data-panel-container-xs-ht=""
4895 + data-panel-container-limit="">
4896 + <div class="parsys"><div class="plainhtmlcode section">
4897 +<div data-emptytext="HTML Component" class="cq-placeholder"></div>
4898 +<style>
4899 + @media (min-width: 1200px) {
4900 + .bncr-banner.promo .text-image-text-container {
4901 + margin-top: 35px !important;
4902 +
4903 + }
4904 +
4905 + }
4906 + @media (max-width: 767px) {
4907 +.bncr-banner.promo .chapeau3 {
4908 +
4909 + text-align: center !important;
4910 +}
4911 + .bncr-banner.promo .text-image-row {
4912 + padding: 0 15px;
4913 +
4914 + box-shadow: none!important;
4915 +height: 380px !important;
4916 + background-color: #BBDDE6 !important;
4917 + }
4918 +
4919 + }
4920 +@media (min-width: 768px) {
4921 +.bncr-banner .text-image-text-container {
4922 + margin-top: 25px;
4923 +}
4924 +}
4925 + @media (max-width: 480px) {
4926 + .bncr-banner.promo .text-image-text-container {
4927 + margin-top: 35px !important;
4928 + height: 300px !important;
4929 + }
4930 + }
4931 +</style>
4932 +</div>
4933 +
4934 +</div>
4935 +
4936 +</div>
4937 +
4938 +
4939 +
4940 +<!--/* Initialize Js */-->
4941 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_copy">
4942 + if(""){
4943 + new Websites.Sticky({
4944 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_copy",
4945 + breakpoint: {
4946 + lg: {
4947 + to: ""
4948 + },
4949 + md: {
4950 + to: ""
4951 + },
4952 + sm: {
4953 + to: "",
4954 + },
4955 + xs: {
4956 + to: ""
4957 + }
4958 + }
4959 + });
4960 + }
4961 +</script>
4962 +
4963 +</div>
4964 +</div>
4965 +<div class="panelContainer section">
4966 +
4967 +
4968 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
4969 +
4970 +
4971 +
4972 + <div>
4973 +
4974 +
4975 +
4976 +
4977 +
4978 +
4979 +
4980 +
4981 +
4982 +
4983 +
4984 +
4985 +
4986 +
4987 +
4988 +
4989 +
4990 +
4991 +
4992 +
4993 +
4994 +
4995 +
4996 +<div class="panelContainer "
4997 +
4998 +
4999 + data-websites-component="/components/panelContainer.v1"
5000 + data-panel-container-lg-mg=""
5001 + data-panel-container-lg-pd=""
5002 + data-panel-container-lg-ht=""
5003 + data-panel-container-md-mg=""
5004 + data-panel-container-md-pd=""
5005 + data-panel-container-md-ht=""
5006 + data-panel-container-sm-mg=""
5007 + data-panel-container-sm-pd=""
5008 + data-panel-container-sm-ht=""
5009 + data-panel-container-xs-mg=""
5010 + data-panel-container-xs-pd=""
5011 + data-panel-container-xs-ht=""
5012 + data-panel-container-limit="">
5013 + <div class="parsys"><div class="panelContainer section">
5014 +
5015 +
5016 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
5017 +
5018 +
5019 +
5020 + <div>
5021 +
5022 +
5023 +
5024 +
5025 +
5026 +
5027 +
5028 +
5029 +
5030 +
5031 +
5032 +
5033 +
5034 +
5035 +
5036 +
5037 +
5038 +
5039 +
5040 +
5041 +
5042 +
5043 +
5044 +<div class="panelContainer panelContainerStyle2 "
5045 +
5046 +
5047 + data-websites-component="/components/panelContainer.v1"
5048 + data-panel-container-lg-mg=""
5049 + data-panel-container-lg-pd=""
5050 + data-panel-container-lg-ht=""
5051 + data-panel-container-md-mg=""
5052 + data-panel-container-md-pd=""
5053 + data-panel-container-md-ht=""
5054 + data-panel-container-sm-mg=""
5055 + data-panel-container-sm-pd=""
5056 + data-panel-container-sm-ht=""
5057 + data-panel-container-xs-mg=""
5058 + data-panel-container-xs-pd=""
5059 + data-panel-container-xs-ht=""
5060 + data-panel-container-limit="">
5061 + <div class="parsys"><div class="panelContainer section">
5062 +
5063 +
5064 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
5065 +
5066 +
5067 +
5068 + <div>
5069 +
5070 +
5071 +
5072 +
5073 +
5074 +
5075 +
5076 +
5077 +
5078 +
5079 +
5080 +
5081 +
5082 +
5083 +
5084 +
5085 +
5086 +
5087 +
5088 +
5089 +
5090 +
5091 +
5092 +<div class="panelContainer "
5093 +
5094 +
5095 + data-websites-component="/components/panelContainer.v1"
5096 + data-panel-container-lg-mg="5% 0 0 0"
5097 + data-panel-container-lg-pd=""
5098 + data-panel-container-lg-ht=""
5099 + data-panel-container-md-mg="5% 0 0 0"
5100 + data-panel-container-md-pd=""
5101 + data-panel-container-md-ht=""
5102 + data-panel-container-sm-mg="5% 0 0 0"
5103 + data-panel-container-sm-pd=""
5104 + data-panel-container-sm-ht=""
5105 + data-panel-container-xs-mg="5% 0 0 0"
5106 + data-panel-container-xs-pd=""
5107 + data-panel-container-xs-ht=""
5108 + data-panel-container-limit="">
5109 + <div class="parsys"><div class="textandimage parbase section">
5110 +
5111 +
5112 +
5113 +
5114 +
5115 +
5116 +
5117 +
5118 +
5119 +
5120 +
5121 +
5122 +
5123 +
5124 +
5125 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_textandimage" class="text-image-container "
5126 + data-text-image-container-right-left="false">
5127 +
5128 +
5129 +
5130 +
5131 +
5132 +
5133 +
5134 +
5135 +
5136 + <div class="row text-image-row"
5137 + data-websites-component="/components/textandimage/rowcontainer"
5138 +
5139 + data-text-image-rowcontainer-bg-type-lg=""
5140 +
5141 +
5142 +
5143 +
5144 +
5145 + data-text-image-rowcontainer-height-lg="0"
5146 + data-text-image-rowcontainer-width-lg="0"
5147 + data-text-image-rowcontainer-class-lg=""
5148 +
5149 + data-text-image-rowcontainer-bg-type-md=""
5150 +
5151 +
5152 +
5153 +
5154 +
5155 + data-text-image-rowcontainer-height-md="0"
5156 + data-text-image-rowcontainer-width-md="0"
5157 + data-text-image-rowcontainer-class-md=""
5158 +
5159 + data-text-image-rowcontainer-bg-type-sm=""
5160 +
5161 +
5162 +
5163 +
5164 +
5165 + data-text-image-rowcontainer-height-sm="0"
5166 + data-text-image-rowcontainer-width-sm="0"
5167 + data-text-image-rowcontainer-class-sm=""
5168 +
5169 + data-text-image-rowcontainer-bg-type-xs=""
5170 +
5171 +
5172 +
5173 +
5174 +
5175 + data-text-image-rowcontainer-height-xs="0"
5176 + data-text-image-rowcontainer-width-xs="0"
5177 + data-text-image-rowcontainer-class-xs="">
5178 +
5179 + <div class="col-xs-12 text-image-text-container " ><h2>How to protect yourself against rising mortgage rates</h2>
5180 +<p><br>
5181 +Several factors affect mortgage rates, including amortization period, market conditions and the key rate set by the Bank of Canada. While there are no guarantees that another hike is on the way, the key rate will be revised again&nbsp;8 times a year. <a hrefnoextension="false" href="https://www.bankofcanada.ca/core-functions/monetary-policy/key-interest-rate/?theme_mode=light&amp;_gl=1*1xq7n2x*_ga*MTQ4NTE1NDUzOS4xNzA3MzI0MDIw*_ga_D0WRRH3RZH*MTcwNzMyNDAyMC4xLjAuMTcwNzMyNDAyMy41Ny4wLjA." class="link-underlined__darker" target="_blank">View dates</a></p>
5182 +<p><b>Planning to buy a home within the next few months?&nbsp;</b></p>
5183 +<p>Apply for pre-approval online today. There’s no obligation to take out a loan, but your rate will be protected for 120 days<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>9</sup></a>&nbsp;— so you can shop for a home with peace of mind.&nbsp;</p>
5184 +<p><br>
5185 +<b>Need help?&nbsp;</b></p>
5186 +<p>A mortgage advisor can help you complete your application so you can enjoy additional savings.</p>
5187 +</div>
5188 + </div>
5189 +
5190 +
5191 +
5192 +
5193 +
5194 +
5195 +
5196 +
5197 +
5198 +
5199 +
5200 + <script>
5201 +
5202 + (function(){
5203 +
5204 + var dataLayerViewEventName = '' || '';
5205 + var dataLayerViewLayerProperties = [];
5206 + var $el;
5207 +
5208 +
5209 +
5210 + if(dataLayerViewEventName.trim().length) {
5211 +
5212 + var obj = {
5213 + dataLayerViewEventName: dataLayerViewEventName,
5214 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_textandimage" ,
5215 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
5216 + };
5217 +
5218 + // IE11 trick (because IE11 don't know document.currentScript):
5219 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
5220 + if(document.currentScript){
5221 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5222 + } else {
5223 + var scripts = document.getElementsByTagName( 'script' );
5224 + var currentScript = scripts[scripts.length - 1];
5225 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5226 + }
5227 +
5228 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
5229 + Websites.DataLayer.cleanViewEventJSON(obj)));
5230 + $el.setAttribute("data-dataLayerViewEvent", 'true');
5231 +
5232 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
5233 +
5234 + }
5235 +
5236 + })();
5237 +
5238 + </script>
5239 +
5240 +</div>
5241 +
5242 + <script>
5243 +
5244 + /**
5245 + * clickEventDownloadHandler()
5246 + * Is used to handle download image action selected as an opening mode
5247 + *
5248 + */
5249 +
5250 + var firstDownload = true;
5251 +
5252 + function clickEventDownloadHandler() {
5253 +
5254 + var link = this;
5255 + var filename = link.dataset.linkpath;
5256 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
5257 + var fn = filename.substring(filename.lastIndexOf('/')+1);
5258 +
5259 + if (newFile) {
5260 +
5261 + if (firstDownload) {
5262 + firstDownload = false;
5263 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
5264 + } else {
5265 + this.href = link.href;
5266 + }
5267 +
5268 + this.download = fn;
5269 +
5270 + } else {
5271 + this.download = fn + ".html";
5272 + }
5273 + }
5274 +
5275 + </script></div>
5276 +<div class="columns parbase section">
5277 +
5278 +
5279 +
5280 +
5281 +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div>
5282 +
5283 +
5284 +
5285 +
5286 +
5287 +
5288 +
5289 +
5290 +
5291 +
5292 +
5293 +
5294 +
5295 + <div style=""
5296 + class="columns-row row row-eq-height"
5297 +
5298 + data-style-lg="" data-height-lg=""
5299 + data-width-lg=""
5300 + data-background-color-lg=""
5301 + data-background-color-xs="">
5302 + <div style=""
5303 + class="col-xs-12 col-sm-12 columns-title "
5304 + data-height="" data-width=""
5305 + data-style-xs="" data-height-xs=""
5306 + data-width-xs="">
5307 +
5308 + </div>
5309 +
5310 +
5311 +
5312 +
5313 + <div class="col-xs-12 col-sm-3 column col-first ">
5314 + <div class="parsys1 parsys">
5315 +</div>
5316 +
5317 + </div>
5318 +
5319 + <div class="col-xs-12 col-sm-3 column ">
5320 + <div class="parsys2 parsys"><div class="textandimage parbase section">
5321 +
5322 +
5323 +
5324 +
5325 +
5326 +
5327 +
5328 +
5329 +
5330 +
5331 +
5332 +
5333 +
5334 +
5335 +
5336 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys2_textandimage_1540660" class="text-image-container "
5337 + data-text-image-container-right-left="false">
5338 +
5339 +
5340 +
5341 +
5342 +
5343 +
5344 +
5345 +
5346 +
5347 + <div class="row text-image-row"
5348 + data-websites-component="/components/textandimage/rowcontainer"
5349 +
5350 + data-text-image-rowcontainer-bg-type-lg=""
5351 +
5352 +
5353 +
5354 +
5355 +
5356 + data-text-image-rowcontainer-height-lg="0"
5357 + data-text-image-rowcontainer-width-lg="0"
5358 + data-text-image-rowcontainer-class-lg=""
5359 +
5360 + data-text-image-rowcontainer-bg-type-md=""
5361 +
5362 +
5363 +
5364 +
5365 +
5366 + data-text-image-rowcontainer-height-md="0"
5367 + data-text-image-rowcontainer-width-md="0"
5368 + data-text-image-rowcontainer-class-md=""
5369 +
5370 + data-text-image-rowcontainer-bg-type-sm=""
5371 +
5372 +
5373 +
5374 +
5375 +
5376 + data-text-image-rowcontainer-height-sm="0"
5377 + data-text-image-rowcontainer-width-sm="0"
5378 + data-text-image-rowcontainer-class-sm=""
5379 +
5380 + data-text-image-rowcontainer-bg-type-xs=""
5381 +
5382 +
5383 +
5384 +
5385 +
5386 + data-text-image-rowcontainer-height-xs="0"
5387 + data-text-image-rowcontainer-width-xs="0"
5388 + data-text-image-rowcontainer-class-xs="">
5389 +
5390 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="https://app.bnc.ca/forms/mortgage/preauth?lang=en" class="btnRTE3 btn-arrow btn" target="_blank" hrefnoextension="false">Protect my rate</a></p>
5391 +</div>
5392 + </div>
5393 +
5394 +
5395 +
5396 +
5397 +
5398 +
5399 +
5400 +
5401 +
5402 +
5403 +
5404 + <script>
5405 +
5406 + (function(){
5407 +
5408 + var dataLayerViewEventName = '' || '';
5409 + var dataLayerViewLayerProperties = [];
5410 + var $el;
5411 +
5412 +
5413 +
5414 + if(dataLayerViewEventName.trim().length) {
5415 +
5416 + var obj = {
5417 + dataLayerViewEventName: dataLayerViewEventName,
5418 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys2_textandimage_1540660" ,
5419 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
5420 + };
5421 +
5422 + // IE11 trick (because IE11 don't know document.currentScript):
5423 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
5424 + if(document.currentScript){
5425 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5426 + } else {
5427 + var scripts = document.getElementsByTagName( 'script' );
5428 + var currentScript = scripts[scripts.length - 1];
5429 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5430 + }
5431 +
5432 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
5433 + Websites.DataLayer.cleanViewEventJSON(obj)));
5434 + $el.setAttribute("data-dataLayerViewEvent", 'true');
5435 +
5436 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
5437 +
5438 + }
5439 +
5440 + })();
5441 +
5442 + </script>
5443 +
5444 +</div>
5445 +
5446 + <script>
5447 +
5448 + /**
5449 + * clickEventDownloadHandler()
5450 + * Is used to handle download image action selected as an opening mode
5451 + *
5452 + */
5453 +
5454 + var firstDownload = true;
5455 +
5456 + function clickEventDownloadHandler() {
5457 +
5458 + var link = this;
5459 + var filename = link.dataset.linkpath;
5460 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
5461 + var fn = filename.substring(filename.lastIndexOf('/')+1);
5462 +
5463 + if (newFile) {
5464 +
5465 + if (firstDownload) {
5466 + firstDownload = false;
5467 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
5468 + } else {
5469 + this.href = link.href;
5470 + }
5471 +
5472 + this.download = fn;
5473 +
5474 + } else {
5475 + this.download = fn + ".html";
5476 + }
5477 + }
5478 +
5479 + </script></div>
5480 +
5481 +</div>
5482 +
5483 + </div>
5484 +
5485 + <div class="col-xs-12 col-sm-3 column ">
5486 + <div class="parsys3 parsys"><div class="textandimage parbase section">
5487 +
5488 +
5489 +
5490 +
5491 +
5492 +
5493 +
5494 +
5495 +
5496 +
5497 +
5498 +
5499 +
5500 +
5501 +
5502 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys3_textandimage_1540660" class="text-image-container "
5503 + data-text-image-container-right-left="false">
5504 +
5505 +
5506 +
5507 +
5508 +
5509 +
5510 +
5511 +
5512 +
5513 + <div class="row text-image-row"
5514 + data-websites-component="/components/textandimage/rowcontainer"
5515 +
5516 + data-text-image-rowcontainer-bg-type-lg=""
5517 +
5518 +
5519 +
5520 +
5521 +
5522 + data-text-image-rowcontainer-height-lg="0"
5523 + data-text-image-rowcontainer-width-lg="0"
5524 + data-text-image-rowcontainer-class-lg=""
5525 +
5526 + data-text-image-rowcontainer-bg-type-md=""
5527 +
5528 +
5529 +
5530 +
5531 +
5532 + data-text-image-rowcontainer-height-md="0"
5533 + data-text-image-rowcontainer-width-md="0"
5534 + data-text-image-rowcontainer-class-md=""
5535 +
5536 + data-text-image-rowcontainer-bg-type-sm=""
5537 +
5538 +
5539 +
5540 +
5541 +
5542 + data-text-image-rowcontainer-height-sm="0"
5543 + data-text-image-rowcontainer-width-sm="0"
5544 + data-text-image-rowcontainer-class-sm=""
5545 +
5546 + data-text-image-rowcontainer-bg-type-xs=""
5547 +
5548 +
5549 +
5550 +
5551 +
5552 + data-text-image-rowcontainer-height-xs="0"
5553 + data-text-image-rowcontainer-width-xs="0"
5554 + data-text-image-rowcontainer-class-xs="">
5555 +
5556 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="https://retail.appointment.bnc.ca/service?category=mo&amp;lang=en&amp;utm_medium=BNCWEBCA&amp;utm_source=14" class="link-not-underlined__darker" target="_blank" hrefnoextension="false">Make an appointment</a></p>
5557 +</div>
5558 + </div>
5559 +
5560 +
5561 +
5562 +
5563 +
5564 +
5565 +
5566 +
5567 +
5568 +
5569 +
5570 + <script>
5571 +
5572 + (function(){
5573 +
5574 + var dataLayerViewEventName = '' || '';
5575 + var dataLayerViewLayerProperties = [];
5576 + var $el;
5577 +
5578 +
5579 +
5580 + if(dataLayerViewEventName.trim().length) {
5581 +
5582 + var obj = {
5583 + dataLayerViewEventName: dataLayerViewEventName,
5584 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys3_textandimage_1540660" ,
5585 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
5586 + };
5587 +
5588 + // IE11 trick (because IE11 don't know document.currentScript):
5589 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
5590 + if(document.currentScript){
5591 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5592 + } else {
5593 + var scripts = document.getElementsByTagName( 'script' );
5594 + var currentScript = scripts[scripts.length - 1];
5595 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5596 + }
5597 +
5598 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
5599 + Websites.DataLayer.cleanViewEventJSON(obj)));
5600 + $el.setAttribute("data-dataLayerViewEvent", 'true');
5601 +
5602 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
5603 +
5604 + }
5605 +
5606 + })();
5607 +
5608 + </script>
5609 +
5610 +</div>
5611 +
5612 + <script>
5613 +
5614 + /**
5615 + * clickEventDownloadHandler()
5616 + * Is used to handle download image action selected as an opening mode
5617 + *
5618 + */
5619 +
5620 + var firstDownload = true;
5621 +
5622 + function clickEventDownloadHandler() {
5623 +
5624 + var link = this;
5625 + var filename = link.dataset.linkpath;
5626 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
5627 + var fn = filename.substring(filename.lastIndexOf('/')+1);
5628 +
5629 + if (newFile) {
5630 +
5631 + if (firstDownload) {
5632 + firstDownload = false;
5633 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
5634 + } else {
5635 + this.href = link.href;
5636 + }
5637 +
5638 + this.download = fn;
5639 +
5640 + } else {
5641 + this.download = fn + ".html";
5642 + }
5643 + }
5644 +
5645 + </script></div>
5646 +
5647 +</div>
5648 +
5649 + </div>
5650 +
5651 + <div class="col-xs-12 col-sm-3 column col-last ">
5652 + <div class="parsys4 parsys">
5653 +</div>
5654 +
5655 + </div>
5656 +
5657 + </div>
5658 +
5659 +
5660 +
5661 +</div>
5662 +
5663 +</div>
5664 +
5665 +</div>
5666 +
5667 +
5668 +
5669 +<!--/* Initialize Js */-->
5670 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_14340">
5671 + if(""){
5672 + new Websites.Sticky({
5673 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_14340",
5674 + breakpoint: {
5675 + lg: {
5676 + to: "none"
5677 + },
5678 + md: {
5679 + to: "none"
5680 + },
5681 + sm: {
5682 + to: "none",
5683 + },
5684 + xs: {
5685 + to: "none"
5686 + }
5687 + }
5688 + });
5689 + }
5690 +</script>
5691 +
5692 +</div>
5693 +</div>
5694 +<div class="panelContainer section">
5695 +
5696 +
5697 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
5698 +
5699 +
5700 +
5701 + <div>
5702 +
5703 +
5704 +
5705 +
5706 +
5707 +
5708 +
5709 +
5710 +
5711 +
5712 +
5713 +
5714 +
5715 +
5716 +
5717 +
5718 +
5719 +
5720 +
5721 +
5722 +
5723 +
5724 +
5725 +<div class="panelContainer "
5726 +
5727 +
5728 + data-websites-component="/components/panelContainer.v1"
5729 + data-panel-container-lg-mg="5% 0 0 0"
5730 + data-panel-container-lg-pd=""
5731 + data-panel-container-lg-ht=""
5732 + data-panel-container-md-mg="5% 0 0 0"
5733 + data-panel-container-md-pd=""
5734 + data-panel-container-md-ht=""
5735 + data-panel-container-sm-mg="5% 0 0 0"
5736 + data-panel-container-sm-pd=""
5737 + data-panel-container-sm-ht=""
5738 + data-panel-container-xs-mg="5% 0 0 0"
5739 + data-panel-container-xs-pd=""
5740 + data-panel-container-xs-ht=""
5741 + data-panel-container-limit="">
5742 + <div class="parsys"><div class="textandimage parbase section">
5743 +
5744 +
5745 +
5746 +
5747 +
5748 +
5749 +
5750 +
5751 +
5752 +
5753 +
5754 +
5755 +
5756 +
5757 +
5758 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_textandimage_copy" class="text-image-container "
5759 + data-text-image-container-right-left="false">
5760 +
5761 +
5762 +
5763 +
5764 +
5765 +
5766 +
5767 +
5768 +
5769 + <div class="row text-image-row"
5770 + data-websites-component="/components/textandimage/rowcontainer"
5771 +
5772 + data-text-image-rowcontainer-bg-type-lg=""
5773 +
5774 +
5775 +
5776 +
5777 +
5778 + data-text-image-rowcontainer-height-lg="0"
5779 + data-text-image-rowcontainer-width-lg="0"
5780 + data-text-image-rowcontainer-class-lg=""
5781 +
5782 + data-text-image-rowcontainer-bg-type-md=""
5783 +
5784 +
5785 +
5786 +
5787 +
5788 + data-text-image-rowcontainer-height-md="0"
5789 + data-text-image-rowcontainer-width-md="0"
5790 + data-text-image-rowcontainer-class-md=""
5791 +
5792 + data-text-image-rowcontainer-bg-type-sm=""
5793 +
5794 +
5795 +
5796 +
5797 +
5798 + data-text-image-rowcontainer-height-sm="0"
5799 + data-text-image-rowcontainer-width-sm="0"
5800 + data-text-image-rowcontainer-class-sm=""
5801 +
5802 + data-text-image-rowcontainer-bg-type-xs=""
5803 +
5804 +
5805 +
5806 +
5807 +
5808 + data-text-image-rowcontainer-height-xs="0"
5809 + data-text-image-rowcontainer-width-xs="0"
5810 + data-text-image-rowcontainer-class-xs="">
5811 +
5812 + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant3">Do your calculations<br>
5813 +</h2>
5814 +</div>
5815 + </div>
5816 +
5817 +
5818 +
5819 +
5820 +
5821 +
5822 +
5823 +
5824 +
5825 +
5826 +
5827 + <script>
5828 +
5829 + (function(){
5830 +
5831 + var dataLayerViewEventName = '' || '';
5832 + var dataLayerViewLayerProperties = [];
5833 + var $el;
5834 +
5835 +
5836 +
5837 + if(dataLayerViewEventName.trim().length) {
5838 +
5839 + var obj = {
5840 + dataLayerViewEventName: dataLayerViewEventName,
5841 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_textandimage_copy" ,
5842 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
5843 + };
5844 +
5845 + // IE11 trick (because IE11 don't know document.currentScript):
5846 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
5847 + if(document.currentScript){
5848 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5849 + } else {
5850 + var scripts = document.getElementsByTagName( 'script' );
5851 + var currentScript = scripts[scripts.length - 1];
5852 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
5853 + }
5854 +
5855 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
5856 + Websites.DataLayer.cleanViewEventJSON(obj)));
5857 + $el.setAttribute("data-dataLayerViewEvent", 'true');
5858 +
5859 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
5860 +
5861 + }
5862 +
5863 + })();
5864 +
5865 + </script>
5866 +
5867 +</div>
5868 +
5869 + <script>
5870 +
5871 + /**
5872 + * clickEventDownloadHandler()
5873 + * Is used to handle download image action selected as an opening mode
5874 + *
5875 + */
5876 +
5877 + var firstDownload = true;
5878 +
5879 + function clickEventDownloadHandler() {
5880 +
5881 + var link = this;
5882 + var filename = link.dataset.linkpath;
5883 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
5884 + var fn = filename.substring(filename.lastIndexOf('/')+1);
5885 +
5886 + if (newFile) {
5887 +
5888 + if (firstDownload) {
5889 + firstDownload = false;
5890 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
5891 + } else {
5892 + this.href = link.href;
5893 + }
5894 +
5895 + this.download = fn;
5896 +
5897 + } else {
5898 + this.download = fn + ".html";
5899 + }
5900 + }
5901 +
5902 + </script></div>
5903 +<div class="columns parbase section">
5904 +
5905 +
5906 +
5907 +
5908 +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div>
5909 +
5910 +
5911 +
5912 +
5913 +
5914 +
5915 +
5916 +
5917 +
5918 +
5919 +
5920 +
5921 +
5922 + <div style=""
5923 + class="columns-row row row-eq-height"
5924 +
5925 + data-style-lg="" data-height-lg=""
5926 + data-width-lg=""
5927 + data-background-color-lg=""
5928 + data-background-color-xs="">
5929 + <div style=""
5930 + class="col-xs-12 col-sm-12 columns-title "
5931 + data-height="" data-width=""
5932 + data-style-xs="" data-height-xs=""
5933 + data-width-xs="">
5934 +
5935 + </div>
5936 +
5937 +
5938 +
5939 +
5940 + <div class="col-xs-12 col-sm-3 column col-first ">
5941 + <div class="parsys1 parsys"><div class="panelContainer section">
5942 +
5943 +
5944 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
5945 +
5946 +
5947 +
5948 + <div>
5949 +
5950 +
5951 +
5952 +
5953 +
5954 +
5955 +
5956 +
5957 +
5958 +
5959 +
5960 +
5961 +
5962 +
5963 +
5964 +
5965 +
5966 +
5967 +
5968 +
5969 +
5970 +
5971 +
5972 +<div class="panelContainer "
5973 +
5974 +
5975 + data-websites-component="/components/panelContainer.v1"
5976 + data-panel-container-lg-mg="10px 5px 10px 5px"
5977 + data-panel-container-lg-pd=""
5978 + data-panel-container-lg-ht=""
5979 + data-panel-container-md-mg="10px 5px 10px 5px"
5980 + data-panel-container-md-pd=""
5981 + data-panel-container-md-ht=""
5982 + data-panel-container-sm-mg="10px 5px 10px 5px"
5983 + data-panel-container-sm-pd=""
5984 + data-panel-container-sm-ht=""
5985 + data-panel-container-xs-mg="10px"
5986 + data-panel-container-xs-pd=""
5987 + data-panel-container-xs-ht=""
5988 + data-panel-container-limit="">
5989 + <div class="parsys"><div class="textandimage parbase section">
5990 +
5991 +
5992 +
5993 +
5994 +
5995 +
5996 +
5997 +
5998 +
5999 +
6000 +
6001 +
6002 +
6003 +
6004 +
6005 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_3840856" class="text-image-container "
6006 + data-text-image-container-right-left="false">
6007 +
6008 +
6009 +
6010 +
6011 +
6012 +
6013 +
6014 +
6015 +
6016 + <div class="row text-image-row"
6017 + data-websites-component="/components/textandimage/rowcontainer"
6018 +
6019 + data-text-image-rowcontainer-bg-type-lg="none"
6020 +
6021 +
6022 +
6023 +
6024 +
6025 + data-text-image-rowcontainer-height-lg="0"
6026 + data-text-image-rowcontainer-width-lg="0"
6027 + data-text-image-rowcontainer-class-lg="backgroundColor1"
6028 +
6029 + data-text-image-rowcontainer-bg-type-md="none"
6030 +
6031 +
6032 +
6033 +
6034 +
6035 + data-text-image-rowcontainer-height-md="0"
6036 + data-text-image-rowcontainer-width-md="0"
6037 + data-text-image-rowcontainer-class-md="backgroundColor1"
6038 +
6039 + data-text-image-rowcontainer-bg-type-sm="none"
6040 +
6041 +
6042 +
6043 +
6044 +
6045 + data-text-image-rowcontainer-height-sm="0"
6046 + data-text-image-rowcontainer-width-sm="0"
6047 + data-text-image-rowcontainer-class-sm="backgroundColor1"
6048 +
6049 + data-text-image-rowcontainer-bg-type-xs="none"
6050 +
6051 +
6052 +
6053 +
6054 +
6055 + data-text-image-rowcontainer-height-xs="0"
6056 + data-text-image-rowcontainer-width-xs="0"
6057 + data-text-image-rowcontainer-class-xs="backgroundColor1">
6058 +
6059 +
6060 +
6061 +
6062 +
6063 +
6064 +
6065 +
6066 +
6067 +
6068 +
6069 +
6070 +
6071 +
6072 + <div class="col-xs-12 text-image-image-container" >
6073 +
6074 +
6075 +
6076 + <div>
6077 +
6078 +
6079 +
6080 +
6081 +
6082 +
6083 + <picture>
6084 +
6085 +
6086 +
6087 +
6088 +
6089 +
6090 +
6091 +
6092 +
6093 +
6094 +
6095 +
6096 +
6097 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(max-width: 767px)">
6098 +
6099 +
6100 +
6101 +
6102 +
6103 +
6104 +
6105 +
6106 +
6107 +
6108 +
6109 +
6110 +
6111 +
6112 +
6113 +
6114 +
6115 +
6116 +
6117 +
6118 +
6119 +
6120 +
6121 +
6122 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(max-width: 991px)">
6123 +
6124 +
6125 +
6126 +
6127 +
6128 +
6129 +
6130 +
6131 +
6132 +
6133 +
6134 +
6135 +
6136 +
6137 +
6138 +
6139 +
6140 +
6141 +
6142 +
6143 +
6144 +
6145 +
6146 +
6147 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(max-width: 1199px)">
6148 +
6149 +
6150 +
6151 +
6152 +
6153 +
6154 +
6155 +
6156 +
6157 +
6158 +
6159 +
6160 +
6161 +
6162 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(min-width: 1200px)">
6163 +
6164 +
6165 +
6166 +
6167 + <img src='/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-lg="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-md="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-sm="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-xs="Illustration of bundle of banknotes with thought bubble containing a question mark " class="center-block image-responsive">
6168 + </picture>
6169 +
6170 +
6171 +
6172 + <script type="text/javascript">
6173 +
6174 + var Websites = Websites || {};
6175 + Websites.FragmentPicture = Websites.FragmentPicture || {
6176 + init: function(viewport) {
6177 + Websites.FragmentPicture.loadAlternativeText(viewport);
6178 + },
6179 +
6180 + loadAlternativeText: function(viewport) {
6181 + $('[data-websites-component="/components/textandimage/image"]').each(function(){
6182 + if(viewport.is("xs") ) {
6183 + $(this).attr("alt", $(this).data("picture-alttext-xs"));
6184 + } else if(viewport.is("sm") ) {
6185 + $(this).attr("alt", $(this).data("picture-alttext-sm"));
6186 + } else if(viewport.is("md") ) {
6187 + $(this).attr("alt", $(this).data("picture-alttext-md"));
6188 + } else if(viewport.is("lg") ) {
6189 + $(this).attr("alt", $(this).data("picture-alttext-lg"));
6190 + }
6191 + });
6192 + }
6193 + };
6194 +
6195 + $(document).ready(function(){
6196 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
6197 + });
6198 +
6199 + Websites.Events.onBreakpointChanged(function(){
6200 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
6201 + });
6202 + </script>
6203 +
6204 +
6205 +
6206 +
6207 +
6208 + </div>
6209 +
6210 +
6211 +
6212 +</div>
6213 +<div
6214 + class="col-xs-12 text-image-text-container "
6215 +
6216 + data-websites-component="/components/textandimage/text"
6217 + data-text-image-text-container-style-xs="{'padding-top': '0px'}"
6218 + data-text-image-text-container-style-sm="{'padding-top': '0px'}"
6219 + data-text-image-text-container-style-md="{'padding-top': '0px'}"
6220 + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>How much can you borrow?</b><br>
6221 +</p>
6222 +<p style="text-align: center;">Estimate the mortgage amount you could get.<br>
6223 +</p>
6224 +</div>
6225 +
6226 +
6227 +
6228 +
6229 +
6230 +
6231 +
6232 +
6233 +
6234 + </div>
6235 +
6236 +
6237 +
6238 +
6239 +
6240 +
6241 +
6242 +
6243 +
6244 +
6245 +
6246 +
6247 + <script>
6248 +
6249 + (function(){
6250 +
6251 + var dataLayerViewEventName = '' || '';
6252 + var dataLayerViewLayerProperties = [];
6253 + var $el;
6254 +
6255 +
6256 +
6257 + if(dataLayerViewEventName.trim().length) {
6258 +
6259 + var obj = {
6260 + dataLayerViewEventName: dataLayerViewEventName,
6261 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_3840856" ,
6262 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
6263 + };
6264 +
6265 + // IE11 trick (because IE11 don't know document.currentScript):
6266 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
6267 + if(document.currentScript){
6268 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
6269 + } else {
6270 + var scripts = document.getElementsByTagName( 'script' );
6271 + var currentScript = scripts[scripts.length - 1];
6272 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
6273 + }
6274 +
6275 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
6276 + Websites.DataLayer.cleanViewEventJSON(obj)));
6277 + $el.setAttribute("data-dataLayerViewEvent", 'true');
6278 +
6279 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
6280 +
6281 + }
6282 +
6283 + })();
6284 +
6285 + </script>
6286 +
6287 +</div>
6288 +
6289 + <script>
6290 +
6291 + /**
6292 + * clickEventDownloadHandler()
6293 + * Is used to handle download image action selected as an opening mode
6294 + *
6295 + */
6296 +
6297 + var firstDownload = true;
6298 +
6299 + function clickEventDownloadHandler() {
6300 +
6301 + var link = this;
6302 + var filename = link.dataset.linkpath;
6303 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
6304 + var fn = filename.substring(filename.lastIndexOf('/')+1);
6305 +
6306 + if (newFile) {
6307 +
6308 + if (firstDownload) {
6309 + firstDownload = false;
6310 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
6311 + } else {
6312 + this.href = link.href;
6313 + }
6314 +
6315 + this.download = fn;
6316 +
6317 + } else {
6318 + this.download = fn + ".html";
6319 + }
6320 + }
6321 +
6322 + </script></div>
6323 +<div class="textandimage parbase section">
6324 +
6325 +
6326 +
6327 +
6328 +
6329 +
6330 +
6331 +
6332 +
6333 +
6334 +
6335 +
6336 +
6337 +
6338 +
6339 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_copy_co" class="text-image-container "
6340 + data-text-image-container-right-left="false">
6341 +
6342 +
6343 +
6344 +
6345 +
6346 +
6347 +
6348 +
6349 +
6350 + <div class="row text-image-row"
6351 + data-websites-component="/components/textandimage/rowcontainer"
6352 +
6353 + data-text-image-rowcontainer-bg-type-lg="none"
6354 +
6355 +
6356 +
6357 +
6358 +
6359 + data-text-image-rowcontainer-height-lg="0"
6360 + data-text-image-rowcontainer-width-lg="0"
6361 + data-text-image-rowcontainer-class-lg="backgroundColor1"
6362 +
6363 + data-text-image-rowcontainer-bg-type-md="none"
6364 +
6365 +
6366 +
6367 +
6368 +
6369 + data-text-image-rowcontainer-height-md="0"
6370 + data-text-image-rowcontainer-width-md="0"
6371 + data-text-image-rowcontainer-class-md="backgroundColor1"
6372 +
6373 + data-text-image-rowcontainer-bg-type-sm="none"
6374 +
6375 +
6376 +
6377 +
6378 +
6379 + data-text-image-rowcontainer-height-sm="0"
6380 + data-text-image-rowcontainer-width-sm="0"
6381 + data-text-image-rowcontainer-class-sm="backgroundColor1"
6382 +
6383 + data-text-image-rowcontainer-bg-type-xs="none"
6384 +
6385 +
6386 +
6387 +
6388 +
6389 + data-text-image-rowcontainer-height-xs="0"
6390 + data-text-image-rowcontainer-width-xs="0"
6391 + data-text-image-rowcontainer-class-xs="backgroundColor1">
6392 +
6393 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/calculators/borrowing-capacity.html" target="_self" hrefnoextension="false">Calculate my loan</a></p>
6394 +</div>
6395 + </div>
6396 +
6397 +
6398 +
6399 +
6400 +
6401 +
6402 +
6403 +
6404 +
6405 +
6406 +
6407 + <script>
6408 +
6409 + (function(){
6410 +
6411 + var dataLayerViewEventName = '' || '';
6412 + var dataLayerViewLayerProperties = [];
6413 + var $el;
6414 +
6415 +
6416 +
6417 + if(dataLayerViewEventName.trim().length) {
6418 +
6419 + var obj = {
6420 + dataLayerViewEventName: dataLayerViewEventName,
6421 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_copy_co" ,
6422 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
6423 + };
6424 +
6425 + // IE11 trick (because IE11 don't know document.currentScript):
6426 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
6427 + if(document.currentScript){
6428 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
6429 + } else {
6430 + var scripts = document.getElementsByTagName( 'script' );
6431 + var currentScript = scripts[scripts.length - 1];
6432 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
6433 + }
6434 +
6435 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
6436 + Websites.DataLayer.cleanViewEventJSON(obj)));
6437 + $el.setAttribute("data-dataLayerViewEvent", 'true');
6438 +
6439 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
6440 +
6441 + }
6442 +
6443 + })();
6444 +
6445 + </script>
6446 +
6447 +</div>
6448 +
6449 + <script>
6450 +
6451 + /**
6452 + * clickEventDownloadHandler()
6453 + * Is used to handle download image action selected as an opening mode
6454 + *
6455 + */
6456 +
6457 + var firstDownload = true;
6458 +
6459 + function clickEventDownloadHandler() {
6460 +
6461 + var link = this;
6462 + var filename = link.dataset.linkpath;
6463 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
6464 + var fn = filename.substring(filename.lastIndexOf('/')+1);
6465 +
6466 + if (newFile) {
6467 +
6468 + if (firstDownload) {
6469 + firstDownload = false;
6470 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
6471 + } else {
6472 + this.href = link.href;
6473 + }
6474 +
6475 + this.download = fn;
6476 +
6477 + } else {
6478 + this.download = fn + ".html";
6479 + }
6480 + }
6481 +
6482 + </script></div>
6483 +
6484 +</div>
6485 +
6486 +</div>
6487 +
6488 +
6489 +
6490 +<!--/* Initialize Js */-->
6491 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys1/panelcontainer">
6492 + if(""){
6493 + new Websites.Sticky({
6494 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys1/panelcontainer",
6495 + breakpoint: {
6496 + lg: {
6497 + to: ""
6498 + },
6499 + md: {
6500 + to: ""
6501 + },
6502 + sm: {
6503 + to: "",
6504 + },
6505 + xs: {
6506 + to: ""
6507 + }
6508 + }
6509 + });
6510 + }
6511 +</script>
6512 +
6513 +</div>
6514 +</div>
6515 +
6516 +</div>
6517 +
6518 + </div>
6519 +
6520 + <div class="col-xs-12 col-sm-3 column ">
6521 + <div class="parsys2 parsys"><div class="panelContainer section">
6522 +
6523 +
6524 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
6525 +
6526 +
6527 +
6528 + <div>
6529 +
6530 +
6531 +
6532 +
6533 +
6534 +
6535 +
6536 +
6537 +
6538 +
6539 +
6540 +
6541 +
6542 +
6543 +
6544 +
6545 +
6546 +
6547 +
6548 +
6549 +
6550 +
6551 +
6552 +<div class="panelContainer "
6553 +
6554 +
6555 + data-websites-component="/components/panelContainer.v1"
6556 + data-panel-container-lg-mg="10px 5px 10px 5px"
6557 + data-panel-container-lg-pd=""
6558 + data-panel-container-lg-ht=""
6559 + data-panel-container-md-mg="10px 5px 10px 5px"
6560 + data-panel-container-md-pd=""
6561 + data-panel-container-md-ht=""
6562 + data-panel-container-sm-mg="10px 5px 10px 5px"
6563 + data-panel-container-sm-pd=""
6564 + data-panel-container-sm-ht=""
6565 + data-panel-container-xs-mg="10px"
6566 + data-panel-container-xs-pd=""
6567 + data-panel-container-xs-ht=""
6568 + data-panel-container-limit="">
6569 + <div class="parsys"><div class="textandimage parbase section">
6570 +
6571 +
6572 +
6573 +
6574 +
6575 +
6576 +
6577 +
6578 +
6579 +
6580 +
6581 +
6582 +
6583 +
6584 +
6585 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys2_panelcontainer_61569_parsys_textandimage_7231150" class="text-image-container "
6586 + data-text-image-container-right-left="false">
6587 +
6588 +
6589 +
6590 +
6591 +
6592 +
6593 +
6594 +
6595 +
6596 + <div class="row text-image-row"
6597 + data-websites-component="/components/textandimage/rowcontainer"
6598 +
6599 + data-text-image-rowcontainer-bg-type-lg="none"
6600 +
6601 +
6602 +
6603 +
6604 +
6605 + data-text-image-rowcontainer-height-lg="0"
6606 + data-text-image-rowcontainer-width-lg="0"
6607 + data-text-image-rowcontainer-class-lg="backgroundColor1"
6608 +
6609 + data-text-image-rowcontainer-bg-type-md="none"
6610 +
6611 +
6612 +
6613 +
6614 +
6615 + data-text-image-rowcontainer-height-md="0"
6616 + data-text-image-rowcontainer-width-md="0"
6617 + data-text-image-rowcontainer-class-md="backgroundColor1"
6618 +
6619 + data-text-image-rowcontainer-bg-type-sm="none"
6620 +
6621 +
6622 +
6623 +
6624 +
6625 + data-text-image-rowcontainer-height-sm="0"
6626 + data-text-image-rowcontainer-width-sm="0"
6627 + data-text-image-rowcontainer-class-sm="backgroundColor1"
6628 +
6629 + data-text-image-rowcontainer-bg-type-xs="none"
6630 +
6631 +
6632 +
6633 +
6634 +
6635 + data-text-image-rowcontainer-height-xs="0"
6636 + data-text-image-rowcontainer-width-xs="0"
6637 + data-text-image-rowcontainer-class-xs="backgroundColor1">
6638 +
6639 +
6640 +
6641 +
6642 +
6643 +
6644 +
6645 +
6646 +
6647 +
6648 +
6649 +
6650 +
6651 +
6652 + <div class="col-xs-12 text-image-image-container" >
6653 +
6654 +
6655 +
6656 + <div>
6657 +
6658 +
6659 +
6660 +
6661 +
6662 +
6663 + <picture>
6664 +
6665 +
6666 +
6667 +
6668 +
6669 +
6670 +
6671 +
6672 +
6673 +
6674 +
6675 +
6676 +
6677 + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(max-width: 767px)">
6678 +
6679 +
6680 +
6681 +
6682 +
6683 +
6684 +
6685 +
6686 +
6687 +
6688 +
6689 +
6690 +
6691 +
6692 +
6693 +
6694 +
6695 +
6696 +
6697 +
6698 +
6699 +
6700 +
6701 +
6702 + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(max-width: 991px)">
6703 +
6704 +
6705 +
6706 +
6707 +
6708 +
6709 +
6710 +
6711 +
6712 +
6713 +
6714 +
6715 +
6716 +
6717 +
6718 +
6719 +
6720 +
6721 +
6722 +
6723 +
6724 +
6725 +
6726 +
6727 + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(max-width: 1199px)">
6728 +
6729 +
6730 +
6731 +
6732 +
6733 +
6734 +
6735 +
6736 +
6737 +
6738 +
6739 +
6740 +
6741 +
6742 + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(min-width: 1200px)">
6743 +
6744 +
6745 +
6746 +
6747 + <img src='/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-lg="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-md="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-sm="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-xs="Picto of a calculator and house with the National Bank logo in the background" class="center-block image-responsive">
6748 + </picture>
6749 +
6750 +
6751 +
6752 + <script type="text/javascript">
6753 +
6754 + var Websites = Websites || {};
6755 + Websites.FragmentPicture = Websites.FragmentPicture || {
6756 + init: function(viewport) {
6757 + Websites.FragmentPicture.loadAlternativeText(viewport);
6758 + },
6759 +
6760 + loadAlternativeText: function(viewport) {
6761 + $('[data-websites-component="/components/textandimage/image"]').each(function(){
6762 + if(viewport.is("xs") ) {
6763 + $(this).attr("alt", $(this).data("picture-alttext-xs"));
6764 + } else if(viewport.is("sm") ) {
6765 + $(this).attr("alt", $(this).data("picture-alttext-sm"));
6766 + } else if(viewport.is("md") ) {
6767 + $(this).attr("alt", $(this).data("picture-alttext-md"));
6768 + } else if(viewport.is("lg") ) {
6769 + $(this).attr("alt", $(this).data("picture-alttext-lg"));
6770 + }
6771 + });
6772 + }
6773 + };
6774 +
6775 + $(document).ready(function(){
6776 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
6777 + });
6778 +
6779 + Websites.Events.onBreakpointChanged(function(){
6780 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
6781 + });
6782 + </script>
6783 +
6784 +
6785 +
6786 +
6787 +
6788 + </div>
6789 +
6790 +
6791 +
6792 +</div>
6793 +<div
6794 + class="col-xs-12 text-image-text-container "
6795 +
6796 + data-websites-component="/components/textandimage/text"
6797 + data-text-image-text-container-style-xs="{'padding-top': '0px'}"
6798 + data-text-image-text-container-style-sm="{'padding-top': '0px'}"
6799 + data-text-image-text-container-style-md="{'padding-top': '0px'}"
6800 + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>Calculate your monthly payments</b><br>
6801 +</p>
6802 +<p style="text-align: center;">Figure out how much you could repay each month based on your budget.<br>
6803 +</p>
6804 +<p class="pvariant3" style="text-align: center;"><a href="/personal/mortgages/calculators/payments.html" target="_blank" hrefnoextension="false">Calculate my payments</a><br>
6805 +</p>
6806 +</div>
6807 +
6808 +
6809 +
6810 +
6811 +
6812 +
6813 +
6814 +
6815 +
6816 + </div>
6817 +
6818 +
6819 +
6820 +
6821 +
6822 +
6823 +
6824 +
6825 +
6826 +
6827 +
6828 +
6829 + <script>
6830 +
6831 + (function(){
6832 +
6833 + var dataLayerViewEventName = '' || '';
6834 + var dataLayerViewLayerProperties = [];
6835 + var $el;
6836 +
6837 +
6838 +
6839 + if(dataLayerViewEventName.trim().length) {
6840 +
6841 + var obj = {
6842 + dataLayerViewEventName: dataLayerViewEventName,
6843 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys2_panelcontainer_61569_parsys_textandimage_7231150" ,
6844 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
6845 + };
6846 +
6847 + // IE11 trick (because IE11 don't know document.currentScript):
6848 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
6849 + if(document.currentScript){
6850 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
6851 + } else {
6852 + var scripts = document.getElementsByTagName( 'script' );
6853 + var currentScript = scripts[scripts.length - 1];
6854 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
6855 + }
6856 +
6857 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
6858 + Websites.DataLayer.cleanViewEventJSON(obj)));
6859 + $el.setAttribute("data-dataLayerViewEvent", 'true');
6860 +
6861 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
6862 +
6863 + }
6864 +
6865 + })();
6866 +
6867 + </script>
6868 +
6869 +</div>
6870 +
6871 + <script>
6872 +
6873 + /**
6874 + * clickEventDownloadHandler()
6875 + * Is used to handle download image action selected as an opening mode
6876 + *
6877 + */
6878 +
6879 + var firstDownload = true;
6880 +
6881 + function clickEventDownloadHandler() {
6882 +
6883 + var link = this;
6884 + var filename = link.dataset.linkpath;
6885 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
6886 + var fn = filename.substring(filename.lastIndexOf('/')+1);
6887 +
6888 + if (newFile) {
6889 +
6890 + if (firstDownload) {
6891 + firstDownload = false;
6892 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
6893 + } else {
6894 + this.href = link.href;
6895 + }
6896 +
6897 + this.download = fn;
6898 +
6899 + } else {
6900 + this.download = fn + ".html";
6901 + }
6902 + }
6903 +
6904 + </script></div>
6905 +
6906 +</div>
6907 +
6908 +</div>
6909 +
6910 +
6911 +
6912 +<!--/* Initialize Js */-->
6913 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys2/panelcontainer_61569">
6914 + if(""){
6915 + new Websites.Sticky({
6916 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys2/panelcontainer_61569",
6917 + breakpoint: {
6918 + lg: {
6919 + to: ""
6920 + },
6921 + md: {
6922 + to: ""
6923 + },
6924 + sm: {
6925 + to: "",
6926 + },
6927 + xs: {
6928 + to: ""
6929 + }
6930 + }
6931 + });
6932 + }
6933 +</script>
6934 +
6935 +</div>
6936 +</div>
6937 +
6938 +</div>
6939 +
6940 + </div>
6941 +
6942 + <div class="col-xs-12 col-sm-3 column ">
6943 + <div class="parsys3 parsys"><div class="panelContainer section">
6944 +
6945 +
6946 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
6947 +
6948 +
6949 +
6950 + <div>
6951 +
6952 +
6953 +
6954 +
6955 +
6956 +
6957 +
6958 +
6959 +
6960 +
6961 +
6962 +
6963 +
6964 +
6965 +
6966 +
6967 +
6968 +
6969 +
6970 +
6971 +
6972 +
6973 +
6974 +<div class="panelContainer "
6975 +
6976 +
6977 + data-websites-component="/components/panelContainer.v1"
6978 + data-panel-container-lg-mg="10px 5px 10px 5px"
6979 + data-panel-container-lg-pd=""
6980 + data-panel-container-lg-ht=""
6981 + data-panel-container-md-mg="10px 5px 10px 5px"
6982 + data-panel-container-md-pd=""
6983 + data-panel-container-md-ht=""
6984 + data-panel-container-sm-mg="10px 5px 10px 5px"
6985 + data-panel-container-sm-pd=""
6986 + data-panel-container-sm-ht=""
6987 + data-panel-container-xs-mg="10px"
6988 + data-panel-container-xs-pd=""
6989 + data-panel-container-xs-ht=""
6990 + data-panel-container-limit="">
6991 + <div class="parsys"><div class="textandimage parbase section">
6992 +
6993 +
6994 +
6995 +
6996 +
6997 +
6998 +
6999 +
7000 +
7001 +
7002 +
7003 +
7004 +
7005 +
7006 +
7007 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_7231150" class="text-image-container "
7008 + data-text-image-container-right-left="false">
7009 +
7010 +
7011 +
7012 +
7013 +
7014 +
7015 +
7016 +
7017 +
7018 + <div class="row text-image-row"
7019 + data-websites-component="/components/textandimage/rowcontainer"
7020 +
7021 + data-text-image-rowcontainer-bg-type-lg="none"
7022 +
7023 +
7024 +
7025 +
7026 +
7027 + data-text-image-rowcontainer-height-lg="0"
7028 + data-text-image-rowcontainer-width-lg="0"
7029 + data-text-image-rowcontainer-class-lg="backgroundColor1"
7030 +
7031 + data-text-image-rowcontainer-bg-type-md="none"
7032 +
7033 +
7034 +
7035 +
7036 +
7037 + data-text-image-rowcontainer-height-md="0"
7038 + data-text-image-rowcontainer-width-md="0"
7039 + data-text-image-rowcontainer-class-md="backgroundColor1"
7040 +
7041 + data-text-image-rowcontainer-bg-type-sm="none"
7042 +
7043 +
7044 +
7045 +
7046 +
7047 + data-text-image-rowcontainer-height-sm="0"
7048 + data-text-image-rowcontainer-width-sm="0"
7049 + data-text-image-rowcontainer-class-sm="backgroundColor1"
7050 +
7051 + data-text-image-rowcontainer-bg-type-xs="none"
7052 +
7053 +
7054 +
7055 +
7056 +
7057 + data-text-image-rowcontainer-height-xs="0"
7058 + data-text-image-rowcontainer-width-xs="0"
7059 + data-text-image-rowcontainer-class-xs="backgroundColor1">
7060 +
7061 +
7062 +
7063 +
7064 +
7065 +
7066 +
7067 +
7068 +
7069 +
7070 +
7071 +
7072 +
7073 +
7074 + <div class="col-xs-12 text-image-image-container" >
7075 +
7076 +
7077 +
7078 + <div>
7079 +
7080 +
7081 +
7082 +
7083 +
7084 +
7085 + <picture>
7086 +
7087 +
7088 +
7089 +
7090 +
7091 +
7092 +
7093 +
7094 +
7095 +
7096 +
7097 +
7098 +
7099 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(max-width: 767px)">
7100 +
7101 +
7102 +
7103 +
7104 +
7105 +
7106 +
7107 +
7108 +
7109 +
7110 +
7111 +
7112 +
7113 +
7114 +
7115 +
7116 +
7117 +
7118 +
7119 +
7120 +
7121 +
7122 +
7123 +
7124 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(max-width: 991px)">
7125 +
7126 +
7127 +
7128 +
7129 +
7130 +
7131 +
7132 +
7133 +
7134 +
7135 +
7136 +
7137 +
7138 +
7139 +
7140 +
7141 +
7142 +
7143 +
7144 +
7145 +
7146 +
7147 +
7148 +
7149 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(max-width: 1199px)">
7150 +
7151 +
7152 +
7153 +
7154 +
7155 +
7156 +
7157 +
7158 +
7159 +
7160 +
7161 +
7162 +
7163 +
7164 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(min-width: 1200px)">
7165 +
7166 +
7167 +
7168 +
7169 + <img src='/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-lg="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-md="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-sm="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-xs="Illustration of house with thought bubble saying rent or buy" class="center-block image-responsive">
7170 + </picture>
7171 +
7172 +
7173 +
7174 + <script type="text/javascript">
7175 +
7176 + var Websites = Websites || {};
7177 + Websites.FragmentPicture = Websites.FragmentPicture || {
7178 + init: function(viewport) {
7179 + Websites.FragmentPicture.loadAlternativeText(viewport);
7180 + },
7181 +
7182 + loadAlternativeText: function(viewport) {
7183 + $('[data-websites-component="/components/textandimage/image"]').each(function(){
7184 + if(viewport.is("xs") ) {
7185 + $(this).attr("alt", $(this).data("picture-alttext-xs"));
7186 + } else if(viewport.is("sm") ) {
7187 + $(this).attr("alt", $(this).data("picture-alttext-sm"));
7188 + } else if(viewport.is("md") ) {
7189 + $(this).attr("alt", $(this).data("picture-alttext-md"));
7190 + } else if(viewport.is("lg") ) {
7191 + $(this).attr("alt", $(this).data("picture-alttext-lg"));
7192 + }
7193 + });
7194 + }
7195 + };
7196 +
7197 + $(document).ready(function(){
7198 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
7199 + });
7200 +
7201 + Websites.Events.onBreakpointChanged(function(){
7202 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
7203 + });
7204 + </script>
7205 +
7206 +
7207 +
7208 +
7209 +
7210 + </div>
7211 +
7212 +
7213 +
7214 +</div>
7215 +<div
7216 + class="col-xs-12 text-image-text-container "
7217 +
7218 + data-websites-component="/components/textandimage/text"
7219 + data-text-image-text-container-style-xs="{'padding-top': '0px'}"
7220 + data-text-image-text-container-style-sm="{'padding-top': '0px'}"
7221 + data-text-image-text-container-style-md="{'padding-top': '0px'}"
7222 + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>Rent or buy?</b><br>
7223 +</p>
7224 +<p style="text-align: center;">Find out if it's more profitable for you to buy or&nbsp;rent.<br>
7225 +</p>
7226 +</div>
7227 +
7228 +
7229 +
7230 +
7231 +
7232 +
7233 +
7234 +
7235 +
7236 + </div>
7237 +
7238 +
7239 +
7240 +
7241 +
7242 +
7243 +
7244 +
7245 +
7246 +
7247 +
7248 +
7249 + <script>
7250 +
7251 + (function(){
7252 +
7253 + var dataLayerViewEventName = '' || '';
7254 + var dataLayerViewLayerProperties = [];
7255 + var $el;
7256 +
7257 +
7258 +
7259 + if(dataLayerViewEventName.trim().length) {
7260 +
7261 + var obj = {
7262 + dataLayerViewEventName: dataLayerViewEventName,
7263 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_7231150" ,
7264 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
7265 + };
7266 +
7267 + // IE11 trick (because IE11 don't know document.currentScript):
7268 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
7269 + if(document.currentScript){
7270 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
7271 + } else {
7272 + var scripts = document.getElementsByTagName( 'script' );
7273 + var currentScript = scripts[scripts.length - 1];
7274 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
7275 + }
7276 +
7277 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
7278 + Websites.DataLayer.cleanViewEventJSON(obj)));
7279 + $el.setAttribute("data-dataLayerViewEvent", 'true');
7280 +
7281 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
7282 +
7283 + }
7284 +
7285 + })();
7286 +
7287 + </script>
7288 +
7289 +</div>
7290 +
7291 + <script>
7292 +
7293 + /**
7294 + * clickEventDownloadHandler()
7295 + * Is used to handle download image action selected as an opening mode
7296 + *
7297 + */
7298 +
7299 + var firstDownload = true;
7300 +
7301 + function clickEventDownloadHandler() {
7302 +
7303 + var link = this;
7304 + var filename = link.dataset.linkpath;
7305 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
7306 + var fn = filename.substring(filename.lastIndexOf('/')+1);
7307 +
7308 + if (newFile) {
7309 +
7310 + if (firstDownload) {
7311 + firstDownload = false;
7312 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
7313 + } else {
7314 + this.href = link.href;
7315 + }
7316 +
7317 + this.download = fn;
7318 +
7319 + } else {
7320 + this.download = fn + ".html";
7321 + }
7322 + }
7323 +
7324 + </script></div>
7325 +<div class="textandimage parbase section">
7326 +
7327 +
7328 +
7329 +
7330 +
7331 +
7332 +
7333 +
7334 +
7335 +
7336 +
7337 +
7338 +
7339 +
7340 +
7341 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_copy_co" class="text-image-container "
7342 + data-text-image-container-right-left="false">
7343 +
7344 +
7345 +
7346 +
7347 +
7348 +
7349 +
7350 +
7351 +
7352 + <div class="row text-image-row"
7353 + data-websites-component="/components/textandimage/rowcontainer"
7354 +
7355 + data-text-image-rowcontainer-bg-type-lg="none"
7356 +
7357 +
7358 +
7359 +
7360 +
7361 + data-text-image-rowcontainer-height-lg="0"
7362 + data-text-image-rowcontainer-width-lg="0"
7363 + data-text-image-rowcontainer-class-lg="backgroundColor1"
7364 +
7365 + data-text-image-rowcontainer-bg-type-md="none"
7366 +
7367 +
7368 +
7369 +
7370 +
7371 + data-text-image-rowcontainer-height-md="0"
7372 + data-text-image-rowcontainer-width-md="0"
7373 + data-text-image-rowcontainer-class-md="backgroundColor1"
7374 +
7375 + data-text-image-rowcontainer-bg-type-sm="none"
7376 +
7377 +
7378 +
7379 +
7380 +
7381 + data-text-image-rowcontainer-height-sm="0"
7382 + data-text-image-rowcontainer-width-sm="0"
7383 + data-text-image-rowcontainer-class-sm="backgroundColor1"
7384 +
7385 + data-text-image-rowcontainer-bg-type-xs="none"
7386 +
7387 +
7388 +
7389 +
7390 +
7391 + data-text-image-rowcontainer-height-xs="0"
7392 + data-text-image-rowcontainer-width-xs="0"
7393 + data-text-image-rowcontainer-class-xs="backgroundColor1">
7394 +
7395 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/calculators/rent-or-buy.html" target="_blank" hrefnoextension="false">Take the test</a></p>
7396 +</div>
7397 + </div>
7398 +
7399 +
7400 +
7401 +
7402 +
7403 +
7404 +
7405 +
7406 +
7407 +
7408 +
7409 + <script>
7410 +
7411 + (function(){
7412 +
7413 + var dataLayerViewEventName = '' || '';
7414 + var dataLayerViewLayerProperties = [];
7415 + var $el;
7416 +
7417 +
7418 +
7419 + if(dataLayerViewEventName.trim().length) {
7420 +
7421 + var obj = {
7422 + dataLayerViewEventName: dataLayerViewEventName,
7423 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_copy_co" ,
7424 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
7425 + };
7426 +
7427 + // IE11 trick (because IE11 don't know document.currentScript):
7428 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
7429 + if(document.currentScript){
7430 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
7431 + } else {
7432 + var scripts = document.getElementsByTagName( 'script' );
7433 + var currentScript = scripts[scripts.length - 1];
7434 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
7435 + }
7436 +
7437 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
7438 + Websites.DataLayer.cleanViewEventJSON(obj)));
7439 + $el.setAttribute("data-dataLayerViewEvent", 'true');
7440 +
7441 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
7442 +
7443 + }
7444 +
7445 + })();
7446 +
7447 + </script>
7448 +
7449 +</div>
7450 +
7451 + <script>
7452 +
7453 + /**
7454 + * clickEventDownloadHandler()
7455 + * Is used to handle download image action selected as an opening mode
7456 + *
7457 + */
7458 +
7459 + var firstDownload = true;
7460 +
7461 + function clickEventDownloadHandler() {
7462 +
7463 + var link = this;
7464 + var filename = link.dataset.linkpath;
7465 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
7466 + var fn = filename.substring(filename.lastIndexOf('/')+1);
7467 +
7468 + if (newFile) {
7469 +
7470 + if (firstDownload) {
7471 + firstDownload = false;
7472 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
7473 + } else {
7474 + this.href = link.href;
7475 + }
7476 +
7477 + this.download = fn;
7478 +
7479 + } else {
7480 + this.download = fn + ".html";
7481 + }
7482 + }
7483 +
7484 + </script></div>
7485 +
7486 +</div>
7487 +
7488 +</div>
7489 +
7490 +
7491 +
7492 +<!--/* Initialize Js */-->
7493 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys3/panelcontainer_1423965634">
7494 + if(""){
7495 + new Websites.Sticky({
7496 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys3/panelcontainer_1423965634",
7497 + breakpoint: {
7498 + lg: {
7499 + to: ""
7500 + },
7501 + md: {
7502 + to: ""
7503 + },
7504 + sm: {
7505 + to: "",
7506 + },
7507 + xs: {
7508 + to: ""
7509 + }
7510 + }
7511 + });
7512 + }
7513 +</script>
7514 +
7515 +</div>
7516 +</div>
7517 +
7518 +</div>
7519 +
7520 + </div>
7521 +
7522 + <div class="col-xs-12 col-sm-3 column col-last ">
7523 + <div class="parsys4 parsys"><div class="panelContainer section">
7524 +
7525 +
7526 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
7527 +
7528 +
7529 +
7530 + <div>
7531 +
7532 +
7533 +
7534 +
7535 +
7536 +
7537 +
7538 +
7539 +
7540 +
7541 +
7542 +
7543 +
7544 +
7545 +
7546 +
7547 +
7548 +
7549 +
7550 +
7551 +
7552 +
7553 +
7554 +<div class="panelContainer "
7555 +
7556 +
7557 + data-websites-component="/components/panelContainer.v1"
7558 + data-panel-container-lg-mg="1% 2% 0 2%"
7559 + data-panel-container-lg-pd=""
7560 + data-panel-container-lg-ht=""
7561 + data-panel-container-md-mg="1% 2% 0 2%"
7562 + data-panel-container-md-pd=""
7563 + data-panel-container-md-ht=""
7564 + data-panel-container-sm-mg="1% 2% 0 2%"
7565 + data-panel-container-sm-pd=""
7566 + data-panel-container-sm-ht=""
7567 + data-panel-container-xs-mg="1% 2% 0 2%"
7568 + data-panel-container-xs-pd=""
7569 + data-panel-container-xs-ht=""
7570 + data-panel-container-limit="">
7571 + <div class="parsys"><div class="textandimage parbase section">
7572 +
7573 +
7574 +
7575 +
7576 +
7577 +
7578 +
7579 +
7580 +
7581 +
7582 +
7583 +
7584 +
7585 +
7586 +
7587 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys4_panelcontainer_copy__parsys_textandimage_723115041" class="text-image-container "
7588 + data-text-image-container-right-left="false">
7589 +
7590 +
7591 +
7592 +
7593 +
7594 +
7595 +
7596 +
7597 +
7598 + <div class="row text-image-row"
7599 + data-websites-component="/components/textandimage/rowcontainer"
7600 +
7601 + data-text-image-rowcontainer-bg-type-lg="none"
7602 +
7603 +
7604 +
7605 +
7606 +
7607 + data-text-image-rowcontainer-height-lg="0"
7608 + data-text-image-rowcontainer-width-lg="0"
7609 + data-text-image-rowcontainer-class-lg="backgroundColor1"
7610 +
7611 + data-text-image-rowcontainer-bg-type-md="none"
7612 +
7613 +
7614 +
7615 +
7616 +
7617 + data-text-image-rowcontainer-height-md="0"
7618 + data-text-image-rowcontainer-width-md="0"
7619 + data-text-image-rowcontainer-class-md="backgroundColor1"
7620 +
7621 + data-text-image-rowcontainer-bg-type-sm="none"
7622 +
7623 +
7624 +
7625 +
7626 +
7627 + data-text-image-rowcontainer-height-sm="0"
7628 + data-text-image-rowcontainer-width-sm="0"
7629 + data-text-image-rowcontainer-class-sm="backgroundColor1"
7630 +
7631 + data-text-image-rowcontainer-bg-type-xs="none"
7632 +
7633 +
7634 +
7635 +
7636 +
7637 + data-text-image-rowcontainer-height-xs="0"
7638 + data-text-image-rowcontainer-width-xs="0"
7639 + data-text-image-rowcontainer-class-xs="backgroundColor1">
7640 +
7641 +
7642 +
7643 +
7644 +
7645 +
7646 +
7647 +
7648 +
7649 +
7650 +
7651 +
7652 +
7653 +
7654 + <div class="col-xs-12 text-image-image-container" >
7655 +
7656 +
7657 +
7658 + <div>
7659 +
7660 +
7661 +
7662 +
7663 +
7664 +
7665 + <picture>
7666 +
7667 +
7668 +
7669 +
7670 +
7671 +
7672 +
7673 +
7674 +
7675 +
7676 +
7677 +
7678 +
7679 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(max-width: 767px)">
7680 +
7681 +
7682 +
7683 +
7684 +
7685 +
7686 +
7687 +
7688 +
7689 +
7690 +
7691 +
7692 +
7693 +
7694 +
7695 +
7696 +
7697 +
7698 +
7699 +
7700 +
7701 +
7702 +
7703 +
7704 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(max-width: 991px)">
7705 +
7706 +
7707 +
7708 +
7709 +
7710 +
7711 +
7712 +
7713 +
7714 +
7715 +
7716 +
7717 +
7718 +
7719 +
7720 +
7721 +
7722 +
7723 +
7724 +
7725 +
7726 +
7727 +
7728 +
7729 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(max-width: 1199px)">
7730 +
7731 +
7732 +
7733 +
7734 +
7735 +
7736 +
7737 +
7738 +
7739 +
7740 +
7741 +
7742 +
7743 +
7744 + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(min-width: 1200px)">
7745 +
7746 +
7747 +
7748 +
7749 + <img src='/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-lg="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-md="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-sm="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-xs="Picto of a calculator and calendar with the National Bank logo in the background" class="center-block image-responsive">
7750 + </picture>
7751 +
7752 +
7753 +
7754 + <script type="text/javascript">
7755 +
7756 + var Websites = Websites || {};
7757 + Websites.FragmentPicture = Websites.FragmentPicture || {
7758 + init: function(viewport) {
7759 + Websites.FragmentPicture.loadAlternativeText(viewport);
7760 + },
7761 +
7762 + loadAlternativeText: function(viewport) {
7763 + $('[data-websites-component="/components/textandimage/image"]').each(function(){
7764 + if(viewport.is("xs") ) {
7765 + $(this).attr("alt", $(this).data("picture-alttext-xs"));
7766 + } else if(viewport.is("sm") ) {
7767 + $(this).attr("alt", $(this).data("picture-alttext-sm"));
7768 + } else if(viewport.is("md") ) {
7769 + $(this).attr("alt", $(this).data("picture-alttext-md"));
7770 + } else if(viewport.is("lg") ) {
7771 + $(this).attr("alt", $(this).data("picture-alttext-lg"));
7772 + }
7773 + });
7774 + }
7775 + };
7776 +
7777 + $(document).ready(function(){
7778 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
7779 + });
7780 +
7781 + Websites.Events.onBreakpointChanged(function(){
7782 + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit);
7783 + });
7784 + </script>
7785 +
7786 +
7787 +
7788 +
7789 +
7790 + </div>
7791 +
7792 +
7793 +
7794 +</div>
7795 +<div
7796 + class="col-xs-12 text-image-text-container "
7797 +
7798 + data-websites-component="/components/textandimage/text"
7799 + data-text-image-text-container-style-xs="{'padding-top': '0px'}"
7800 + data-text-image-text-container-style-sm="{'padding-top': '0px'}"
7801 + data-text-image-text-container-style-md="{'padding-top': '0px'}"
7802 + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>Calculate your renewal payments</b><br>
7803 +</p>
7804 +<p style="text-align: center;">Is your mortgage renewal approaching, and you want to calculate your budget?&nbsp;Learn the amount and frequency of your mortgage payments while still being able to save each month.<br>
7805 +</p>
7806 +<p class="pvariant3" style="text-align: center;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="/personal/mortgages/calculators/renewal-payments.html" target="_blank" hrefnoextension="false">Calculate my payments</a><br>
7807 +</p>
7808 +</div>
7809 +
7810 +
7811 +
7812 +
7813 +
7814 +
7815 +
7816 +
7817 +
7818 + </div>
7819 +
7820 +
7821 +
7822 +
7823 +
7824 +
7825 +
7826 +
7827 +
7828 +
7829 +
7830 +
7831 + <script>
7832 +
7833 + (function(){
7834 +
7835 + var dataLayerViewEventName = '' || '';
7836 + var dataLayerViewLayerProperties = [];
7837 + var $el;
7838 +
7839 +
7840 +
7841 + if(dataLayerViewEventName.trim().length) {
7842 +
7843 + var obj = {
7844 + dataLayerViewEventName: dataLayerViewEventName,
7845 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys4_panelcontainer_copy__parsys_textandimage_723115041" ,
7846 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
7847 + };
7848 +
7849 + // IE11 trick (because IE11 don't know document.currentScript):
7850 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
7851 + if(document.currentScript){
7852 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
7853 + } else {
7854 + var scripts = document.getElementsByTagName( 'script' );
7855 + var currentScript = scripts[scripts.length - 1];
7856 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
7857 + }
7858 +
7859 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
7860 + Websites.DataLayer.cleanViewEventJSON(obj)));
7861 + $el.setAttribute("data-dataLayerViewEvent", 'true');
7862 +
7863 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
7864 +
7865 + }
7866 +
7867 + })();
7868 +
7869 + </script>
7870 +
7871 +</div>
7872 +
7873 + <script>
7874 +
7875 + /**
7876 + * clickEventDownloadHandler()
7877 + * Is used to handle download image action selected as an opening mode
7878 + *
7879 + */
7880 +
7881 + var firstDownload = true;
7882 +
7883 + function clickEventDownloadHandler() {
7884 +
7885 + var link = this;
7886 + var filename = link.dataset.linkpath;
7887 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
7888 + var fn = filename.substring(filename.lastIndexOf('/')+1);
7889 +
7890 + if (newFile) {
7891 +
7892 + if (firstDownload) {
7893 + firstDownload = false;
7894 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
7895 + } else {
7896 + this.href = link.href;
7897 + }
7898 +
7899 + this.download = fn;
7900 +
7901 + } else {
7902 + this.download = fn + ".html";
7903 + }
7904 + }
7905 +
7906 + </script></div>
7907 +
7908 +</div>
7909 +
7910 +</div>
7911 +
7912 +
7913 +
7914 +<!--/* Initialize Js */-->
7915 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys4/panelcontainer_copy_">
7916 + if(""){
7917 + new Websites.Sticky({
7918 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys4/panelcontainer_copy_",
7919 + breakpoint: {
7920 + lg: {
7921 + to: ""
7922 + },
7923 + md: {
7924 + to: ""
7925 + },
7926 + sm: {
7927 + to: "",
7928 + },
7929 + xs: {
7930 + to: ""
7931 + }
7932 + }
7933 + });
7934 + }
7935 +</script>
7936 +
7937 +</div>
7938 +</div>
7939 +
7940 +</div>
7941 +
7942 + </div>
7943 +
7944 + </div>
7945 +
7946 +
7947 +
7948 +</div>
7949 +
7950 +</div>
7951 +
7952 +</div>
7953 +
7954 +
7955 +
7956 +<!--/* Initialize Js */-->
7957 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860">
7958 + if(""){
7959 + new Websites.Sticky({
7960 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860",
7961 + breakpoint: {
7962 + lg: {
7963 + to: "none"
7964 + },
7965 + md: {
7966 + to: "none"
7967 + },
7968 + sm: {
7969 + to: "none",
7970 + },
7971 + xs: {
7972 + to: "none"
7973 + }
7974 + }
7975 + });
7976 + }
7977 +</script>
7978 +
7979 +</div>
7980 +</div>
7981 +
7982 +</div>
7983 +
7984 +</div>
7985 +
7986 +
7987 +
7988 +<!--/* Initialize Js */-->
7989 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer">
7990 + if(""){
7991 + new Websites.Sticky({
7992 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer",
7993 + breakpoint: {
7994 + lg: {
7995 + to: "none"
7996 + },
7997 + md: {
7998 + to: "none"
7999 + },
8000 + sm: {
8001 + to: "none",
8002 + },
8003 + xs: {
8004 + to: "none"
8005 + }
8006 + }
8007 + });
8008 + }
8009 +</script>
8010 +
8011 +</div>
8012 +</div>
8013 +
8014 +</div>
8015 +
8016 +</div>
8017 +
8018 +
8019 +
8020 +<!--/* Initialize Js */-->
8021 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer">
8022 + if(""){
8023 + new Websites.Sticky({
8024 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer",
8025 + breakpoint: {
8026 + lg: {
8027 + to: ""
8028 + },
8029 + md: {
8030 + to: ""
8031 + },
8032 + sm: {
8033 + to: "",
8034 + },
8035 + xs: {
8036 + to: ""
8037 + }
8038 + }
8039 + });
8040 + }
8041 +</script>
8042 +
8043 +</div>
8044 +</div>
8045 +<div class="panelContainer section">
8046 +
8047 +
8048 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
8049 +
8050 +
8051 +
8052 + <div>
8053 +
8054 +
8055 +
8056 +
8057 +
8058 +
8059 +
8060 +
8061 +
8062 +
8063 +
8064 +
8065 +
8066 +
8067 +
8068 +
8069 +
8070 +
8071 +
8072 +
8073 +
8074 +
8075 +
8076 +<div class="panelContainer panelContainerStyle2 "
8077 +
8078 +
8079 + data-websites-component="/components/panelContainer.v1"
8080 + data-panel-container-lg-mg=""
8081 + data-panel-container-lg-pd=""
8082 + data-panel-container-lg-ht=""
8083 + data-panel-container-md-mg=""
8084 + data-panel-container-md-pd=""
8085 + data-panel-container-md-ht=""
8086 + data-panel-container-sm-mg=""
8087 + data-panel-container-sm-pd=""
8088 + data-panel-container-sm-ht=""
8089 + data-panel-container-xs-mg=""
8090 + data-panel-container-xs-pd=""
8091 + data-panel-container-xs-ht=""
8092 + data-panel-container-limit="">
8093 + <div class="parsys"><div class="textandimage parbase section">
8094 +
8095 +
8096 +
8097 +
8098 +
8099 +
8100 +
8101 +
8102 +
8103 +
8104 +
8105 +
8106 +
8107 +
8108 +
8109 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_textandimage" class="text-image-container "
8110 + data-text-image-container-right-left="false">
8111 +
8112 +
8113 +
8114 +
8115 +
8116 +
8117 +
8118 +
8119 +
8120 + <div class="row text-image-row"
8121 + data-websites-component="/components/textandimage/rowcontainer"
8122 +
8123 + data-text-image-rowcontainer-bg-type-lg="none"
8124 +
8125 +
8126 +
8127 +
8128 +
8129 + data-text-image-rowcontainer-height-lg="0"
8130 + data-text-image-rowcontainer-width-lg="0"
8131 + data-text-image-rowcontainer-class-lg="backgroundColor1"
8132 +
8133 + data-text-image-rowcontainer-bg-type-md="none"
8134 +
8135 +
8136 +
8137 +
8138 +
8139 + data-text-image-rowcontainer-height-md="0"
8140 + data-text-image-rowcontainer-width-md="0"
8141 + data-text-image-rowcontainer-class-md="backgroundColor1"
8142 +
8143 + data-text-image-rowcontainer-bg-type-sm="none"
8144 +
8145 +
8146 +
8147 +
8148 +
8149 + data-text-image-rowcontainer-height-sm="0"
8150 + data-text-image-rowcontainer-width-sm="0"
8151 + data-text-image-rowcontainer-class-sm="backgroundColor1"
8152 +
8153 + data-text-image-rowcontainer-bg-type-xs="none"
8154 +
8155 +
8156 +
8157 +
8158 +
8159 + data-text-image-rowcontainer-height-xs="0"
8160 + data-text-image-rowcontainer-width-xs="0"
8161 + data-text-image-rowcontainer-class-xs="backgroundColor1">
8162 +
8163 + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="fixed"></a><span style="letter-spacing: 0.3px; background-color: transparent;">Fixed-rate loan</span><br>
8164 +</h2>
8165 +</div>
8166 + </div>
8167 +
8168 +
8169 +
8170 +
8171 +
8172 +
8173 +
8174 +
8175 +
8176 +
8177 +
8178 + <script>
8179 +
8180 + (function(){
8181 +
8182 + var dataLayerViewEventName = '' || '';
8183 + var dataLayerViewLayerProperties = [];
8184 + var $el;
8185 +
8186 +
8187 +
8188 + if(dataLayerViewEventName.trim().length) {
8189 +
8190 + var obj = {
8191 + dataLayerViewEventName: dataLayerViewEventName,
8192 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_textandimage" ,
8193 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
8194 + };
8195 +
8196 + // IE11 trick (because IE11 don't know document.currentScript):
8197 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
8198 + if(document.currentScript){
8199 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
8200 + } else {
8201 + var scripts = document.getElementsByTagName( 'script' );
8202 + var currentScript = scripts[scripts.length - 1];
8203 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
8204 + }
8205 +
8206 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
8207 + Websites.DataLayer.cleanViewEventJSON(obj)));
8208 + $el.setAttribute("data-dataLayerViewEvent", 'true');
8209 +
8210 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
8211 +
8212 + }
8213 +
8214 + })();
8215 +
8216 + </script>
8217 +
8218 +</div>
8219 +
8220 + <script>
8221 +
8222 + /**
8223 + * clickEventDownloadHandler()
8224 + * Is used to handle download image action selected as an opening mode
8225 + *
8226 + */
8227 +
8228 + var firstDownload = true;
8229 +
8230 + function clickEventDownloadHandler() {
8231 +
8232 + var link = this;
8233 + var filename = link.dataset.linkpath;
8234 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
8235 + var fn = filename.substring(filename.lastIndexOf('/')+1);
8236 +
8237 + if (newFile) {
8238 +
8239 + if (firstDownload) {
8240 + firstDownload = false;
8241 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
8242 + } else {
8243 + this.href = link.href;
8244 + }
8245 +
8246 + this.download = fn;
8247 +
8248 + } else {
8249 + this.download = fn + ".html";
8250 + }
8251 + }
8252 +
8253 + </script></div>
8254 +<div class="panelContainer section">
8255 +
8256 +
8257 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
8258 +
8259 +
8260 +
8261 + <div>
8262 +
8263 +
8264 +
8265 +
8266 +
8267 +
8268 +
8269 +
8270 +
8271 +
8272 +
8273 +
8274 +
8275 +
8276 +
8277 +
8278 +
8279 +
8280 +
8281 +
8282 +
8283 +
8284 +
8285 +<div class="panelContainer background-none no-pad-collapse at-0173-astuce"
8286 +
8287 +
8288 + data-websites-component="/components/panelContainer.v1"
8289 + data-panel-container-lg-mg="1% 20% 0 0"
8290 + data-panel-container-lg-pd=""
8291 + data-panel-container-lg-ht=""
8292 + data-panel-container-md-mg="1% 20% 0 0"
8293 + data-panel-container-md-pd=""
8294 + data-panel-container-md-ht=""
8295 + data-panel-container-sm-mg="1% 0 0 0"
8296 + data-panel-container-sm-pd=""
8297 + data-panel-container-sm-ht=""
8298 + data-panel-container-xs-mg="1% 0 0 0"
8299 + data-panel-container-xs-pd=""
8300 + data-panel-container-xs-ht=""
8301 + data-panel-container-limit="">
8302 + <div class="parsys"><div class="textandimage parbase section">
8303 +
8304 +
8305 +
8306 +
8307 +
8308 +
8309 +
8310 +
8311 +
8312 +
8313 +
8314 +
8315 +
8316 +
8317 +
8318 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage" class="text-image-container "
8319 + data-text-image-container-right-left="false">
8320 +
8321 +
8322 +
8323 +
8324 +
8325 +
8326 +
8327 +
8328 +
8329 + <div class="row text-image-row"
8330 + data-websites-component="/components/textandimage/rowcontainer"
8331 +
8332 + data-text-image-rowcontainer-bg-type-lg="none"
8333 +
8334 +
8335 +
8336 +
8337 +
8338 + data-text-image-rowcontainer-height-lg="0"
8339 + data-text-image-rowcontainer-width-lg="0"
8340 + data-text-image-rowcontainer-class-lg="backgroundColor1"
8341 +
8342 + data-text-image-rowcontainer-bg-type-md="none"
8343 +
8344 +
8345 +
8346 +
8347 +
8348 + data-text-image-rowcontainer-height-md="0"
8349 + data-text-image-rowcontainer-width-md="0"
8350 + data-text-image-rowcontainer-class-md="backgroundColor1"
8351 +
8352 + data-text-image-rowcontainer-bg-type-sm="none"
8353 +
8354 +
8355 +
8356 +
8357 +
8358 + data-text-image-rowcontainer-height-sm="0"
8359 + data-text-image-rowcontainer-width-sm="0"
8360 + data-text-image-rowcontainer-class-sm="backgroundColor1"
8361 +
8362 + data-text-image-rowcontainer-bg-type-xs="none"
8363 +
8364 +
8365 +
8366 +
8367 +
8368 + data-text-image-rowcontainer-height-xs="0"
8369 + data-text-image-rowcontainer-width-xs="0"
8370 + data-text-image-rowcontainer-class-xs="backgroundColor1">
8371 +
8372 + <div class="col-xs-12 text-image-text-container " ><p>Your interest rate is set as soon as you take out your mortgage. This rate is not affected by fluctuations for the duration of your term. This type of rate is only available with a&nbsp;<a href="/personal/mortgages/loan.html" target="_self">mortgage loans</a>.</p>
8373 +</div>
8374 + </div>
8375 +
8376 +
8377 +
8378 +
8379 +
8380 +
8381 +
8382 +
8383 +
8384 +
8385 +
8386 + <script>
8387 +
8388 + (function(){
8389 +
8390 + var dataLayerViewEventName = '' || '';
8391 + var dataLayerViewLayerProperties = [];
8392 + var $el;
8393 +
8394 +
8395 +
8396 + if(dataLayerViewEventName.trim().length) {
8397 +
8398 + var obj = {
8399 + dataLayerViewEventName: dataLayerViewEventName,
8400 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage" ,
8401 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
8402 + };
8403 +
8404 + // IE11 trick (because IE11 don't know document.currentScript):
8405 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
8406 + if(document.currentScript){
8407 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
8408 + } else {
8409 + var scripts = document.getElementsByTagName( 'script' );
8410 + var currentScript = scripts[scripts.length - 1];
8411 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
8412 + }
8413 +
8414 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
8415 + Websites.DataLayer.cleanViewEventJSON(obj)));
8416 + $el.setAttribute("data-dataLayerViewEvent", 'true');
8417 +
8418 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
8419 +
8420 + }
8421 +
8422 + })();
8423 +
8424 + </script>
8425 +
8426 +</div>
8427 +
8428 + <script>
8429 +
8430 + /**
8431 + * clickEventDownloadHandler()
8432 + * Is used to handle download image action selected as an opening mode
8433 + *
8434 + */
8435 +
8436 + var firstDownload = true;
8437 +
8438 + function clickEventDownloadHandler() {
8439 +
8440 + var link = this;
8441 + var filename = link.dataset.linkpath;
8442 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
8443 + var fn = filename.substring(filename.lastIndexOf('/')+1);
8444 +
8445 + if (newFile) {
8446 +
8447 + if (firstDownload) {
8448 + firstDownload = false;
8449 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
8450 + } else {
8451 + this.href = link.href;
8452 + }
8453 +
8454 + this.download = fn;
8455 +
8456 + } else {
8457 + this.download = fn + ".html";
8458 + }
8459 + }
8460 +
8461 + </script></div>
8462 +<div class="textandimage parbase section">
8463 +
8464 +
8465 +
8466 +
8467 +
8468 +
8469 +
8470 +
8471 +
8472 +
8473 +
8474 +
8475 +
8476 +
8477 +
8478 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage_2116172" class="text-image-container "
8479 + data-text-image-container-right-left="false">
8480 +
8481 +
8482 +
8483 +
8484 +
8485 +
8486 +
8487 +
8488 +
8489 + <div class="row text-image-row"
8490 + data-websites-component="/components/textandimage/rowcontainer"
8491 +
8492 + data-text-image-rowcontainer-bg-type-lg="none"
8493 +
8494 +
8495 +
8496 +
8497 +
8498 + data-text-image-rowcontainer-height-lg="0"
8499 + data-text-image-rowcontainer-width-lg="0"
8500 + data-text-image-rowcontainer-class-lg="backgroundColor1"
8501 +
8502 + data-text-image-rowcontainer-bg-type-md="none"
8503 +
8504 +
8505 +
8506 +
8507 +
8508 + data-text-image-rowcontainer-height-md="0"
8509 + data-text-image-rowcontainer-width-md="0"
8510 + data-text-image-rowcontainer-class-md="backgroundColor1"
8511 +
8512 + data-text-image-rowcontainer-bg-type-sm="none"
8513 +
8514 +
8515 +
8516 +
8517 +
8518 + data-text-image-rowcontainer-height-sm="0"
8519 + data-text-image-rowcontainer-width-sm="0"
8520 + data-text-image-rowcontainer-class-sm="backgroundColor1"
8521 +
8522 + data-text-image-rowcontainer-bg-type-xs="none"
8523 +
8524 +
8525 +
8526 +
8527 +
8528 + data-text-image-rowcontainer-height-xs="0"
8529 + data-text-image-rowcontainer-width-xs="0"
8530 + data-text-image-rowcontainer-class-xs="backgroundColor1">
8531 +
8532 + <div class="col-xs-12 text-image-text-container
8533 + initializing" ><p class="pvariant3"><b><br>
8534 + Rate (%) as at&nbsp;<span static-token='tauxDateJour|date:&quot;-&quot;'>${p1.tauxDateJour|date:&quot;-&quot;}</span></b></p></div>
8535 + </div>
8536 +
8537 +
8538 +
8539 +
8540 +
8541 +
8542 +
8543 +
8544 +
8545 +
8546 +
8547 +
8548 + <script>
8549 + (function(){
8550 + var $el;
8551 + var listeners = [];
8552 + var dataLayerViewEventName = '';
8553 + var dataLayerViewLayerProperties = [];
8554 +
8555 + dataLayerViewEventName = '';
8556 +
8557 +
8558 +
8559 +
8560 +
8561 + // IE11 trick (because IE11 don't know document.currentScript):
8562 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
8563 + if(document.currentScript){
8564 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
8565 + } else {
8566 + var scripts = document.getElementsByTagName( 'script' );
8567 + var currentScript = scripts[scripts.length - 1];
8568 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
8569 + }
8570 +
8571 + Websites.Product.Core.initContentQueue.push(function () {
8572 + Websites.Product.TextContent.initTextContent({
8573 + $el: $el,
8574 + capsuleAlias: "c1",
8575 + listeners: listeners,
8576 + products: Websites.Product.Core.determineProductsArray("c1"),
8577 + dataLayerViewEvent: {
8578 + dataLayerViewEventName: dataLayerViewEventName,
8579 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage_2116172" ,
8580 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
8581 + }
8582 + });
8583 + });
8584 + })();
8585 +
8586 + </script>
8587 +
8588 +
8589 +
8590 +
8591 +
8592 +</div>
8593 +
8594 + <script>
8595 +
8596 + /**
8597 + * clickEventDownloadHandler()
8598 + * Is used to handle download image action selected as an opening mode
8599 + *
8600 + */
8601 +
8602 + var firstDownload = true;
8603 +
8604 + function clickEventDownloadHandler() {
8605 +
8606 + var link = this;
8607 + var filename = link.dataset.linkpath;
8608 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
8609 + var fn = filename.substring(filename.lastIndexOf('/')+1);
8610 +
8611 + if (newFile) {
8612 +
8613 + if (firstDownload) {
8614 + firstDownload = false;
8615 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
8616 + } else {
8617 + this.href = link.href;
8618 + }
8619 +
8620 + this.download = fn;
8621 +
8622 + } else {
8623 + this.download = fn + ".html";
8624 + }
8625 + }
8626 +
8627 + </script></div>
8628 +<div class="table parbase section">
8629 +
8630 +
8631 +
8632 +
8633 +
8634 +
8635 +
8636 +<div class="table-container">
8637 + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1">
8638 + <tbody>
8639 + <tr class="no-border">
8640 + <th style="text-align: center; width: 25%;" class="filled">Term</th>
8641 + <th style="text-align: center; width: 25%;" class="filled">Open</th>
8642 + <th style="text-align: center; width: 25%;" class="filled">Closed</th>
8643 + <th style="text-align: center; width: 25%;" class="filled">APR<a href="#notes-item-30819b1e37" target="_self" class="link-not-underlined__darker" hrefnoextension="false"><sup style="left: 0;">8</sup>**</a></th>
8644 + </tr>
8645 + <tr class="no-border">
8646 + <td colspan="4" class="separator"><b>Prime = <span static-token='tauxBase|percent'>${p1.tauxBase|percent}</span></b></td>
8647 + </tr>
8648 + <tr>
8649 + <td><p style="margin-left: 40px;">3 months</p></td>
8650 + <td><p style="margin-left: 40px;">---</p></td>
8651 + <td><p style="margin-left: 40px;"><span static-token='taux3moisF|percent:"true"'>${p1.taux3moisF|percent:"true"}</span><br></p></td>
8652 + <td><p style="margin-left: 40px;">8.37%</p></td>
8653 + </tr>
8654 + <tr>
8655 + <td><p style="margin-left: 40px;">6 months</p></td>
8656 + <td><p style="margin-left: 40px;"><span static-token='taux6moisO|percent:"true"'>${p1.taux6moisO|percent:"true"}</span><br></p></td>
8657 + <td><p style="margin-left: 40px;"><span static-token='taux6moisF|percent:"true"'>${p1.taux6moisF|percent:"true"}</span><br></p></td>
8658 + <td><p style="margin-left: 40px;">Open: 9.98%<br> Closed: 6.31%</p></td>
8659 + </tr>
8660 + <tr>
8661 + <td><p style="margin-left: 40px;">1 year</p></td>
8662 + <td><p style="margin-left: 40px;"><span static-token='taux1anO|percent:"true"'>${p1.taux1anO|percent:"true"}</span><br></p></td>
8663 + <td><p style="margin-left: 40px;"><span static-token='taux1anF|percent:"true"'>${p1.taux1anF|percent:"true"}</span><br></p></td>
8664 + <td><p style="margin-left: 40px;">Open: 9.77%<br> Closed: 5.61%<br></p></td>
8665 + </tr>
8666 + <tr>
8667 + <td><p style="margin-left: 40px;">2 years</p></td>
8668 + <td><p style="margin-left: 40px;">---</p></td>
8669 + <td><p style="margin-left: 40px;"><span static-token='taux2ansF|percent:"true"'>${p1.taux2ansF|percent:"true"}</span><br></p></td>
8670 + <td><p style="margin-left: 40px;">5.31%<br></p></td>
8671 + </tr>
8672 + <tr>
8673 + <td><p style="margin-left: 40px;">3&nbsp;years</p></td>
8674 + <td><p style="margin-left: 40px;">---</p></td>
8675 + <td><p style="margin-left: 40px;"><span static-token='taux3ansF|percent:"true"'>${p1.taux3ansF|percent:"true"}</span><br></p></td>
8676 + <td><p style="margin-left: 40px;">6.10%<br></p></td>
8677 + </tr>
8678 + <tr>
8679 + <td><p style="margin-left: 40px;">4&nbsp;years</p></td>
8680 + <td><p style="margin-left: 40px;">---</p></td>
8681 + <td><p style="margin-left: 40px;"><span static-token='taux4ansF|percent:"true"'>${p1.taux4ansF|percent:"true"}</span>&nbsp; &nbsp;<a href="#promo" target="_self">see the promo</a><br></p></td>
8682 + <td><p style="margin-left: 40px;">6.03%<br></p></td>
8683 + </tr>
8684 + <tr>
8685 + <td><p style="margin-left: 40px;">5&nbsp;years</p></td>
8686 + <td><p style="margin-left: 40px;">---</p></td>
8687 + <td><p style="margin-left: 40px;"><span static-token='taux5ansF|percent:"true"'>${p1.taux5ansF|percent:"true"}</span>&nbsp;&nbsp;&nbsp;<a href="#promo" target="_self">see the promo</a><br></p></td>
8688 + <td><p style="margin-left: 40px;">6.13%<br></p></td>
8689 + </tr>
8690 + </tbody>
8691 +</table>
8692 +
8693 + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span>
8694 + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span>
8695 + <div class="table-carousel-dots"></div>
8696 +</div>
8697 +
8698 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/table">
8699 + new Websites.TableStatic({
8700 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/table",
8701 + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')),
8702 + capsuleAlias: "c1",
8703 + staticHeader: !!(""), // use !! to convert to boolean
8704 + carousel: !!(""),
8705 + transposition: !!(""),
8706 + customId: ""
8707 + });
8708 +</script>
8709 +</div>
8710 +<div class="accordion panelcontainer section">
8711 +
8712 +
8713 +<script src="/etc.clientlibs/core/wcm/components/commons/site/clientlibs/container.min.0a6aff292f5cc42142779cde92054524.js"></script>
8714 +<script src="/etc.clientlibs/core/wcm/components/accordion/v1/accordion/clientlibs/site.min.c254b351182288a72fbd32db1f3a5320.js"></script>
8715 +
8716 +
8717 +
8718 +
8719 +
8720 +<link rel="stylesheet" href="/etc.clientlibs/core/wcm/components/accordion/v1/accordion/clientlibs/site.min.44a1783be8e88dc73188908af6c38c01.css" type="text/css">
8721 +<link rel="stylesheet" href="/etc.clientlibs/web-sites-toolkit/components/content/accordion/clientlibs/site.min.f6c1348a612942645a5181a642bcadb4.css" type="text/css">
8722 +
8723 +
8724 +
8725 +
8726 +
8727 +<div id="accordion-d1c9554935" class="cmp-accordion" data-cmp-is="accordion" data-placeholder-text="false">
8728 + <div class="cmp-accordion__item" data-cmp-hook-accordion="item" id="accordion-d1c9554935-item-264a601db1">
8729 + <h3 class="cmp-accordion__header">
8730 + <button id="accordion-d1c9554935-item-264a601db1-button" class="cmp-accordion__button" aria-controls="accordion-d1c9554935-item-264a601db1-panel" data-cmp-hook-accordion="button">
8731 + <span class="cmp-accordion__title">See all fixed-rates</span>
8732 + <span class="cmp-accordion__icon"></span>
8733 + </button>
8734 + </h3>
8735 + <div data-cmp-hook-accordion="panel" id="accordion-d1c9554935-item-264a601db1-panel" class="cmp-accordion__panel cmp-accordion__panel--hidden" role="region" aria-labelledby="accordion-d1c9554935-item-264a601db1-button"><div class="container responsivegrid">
8736 +
8737 +
8738 +<link rel="stylesheet" href="/etc.clientlibs/web-sites-toolkit/components/content/container/clientlibs.min.90932f7188b6de3499a57fd9afe1ddb6.css" type="text/css">
8739 +
8740 +
8741 +
8742 +
8743 +
8744 +
8745 +
8746 +
8747 + <div id="container-264a601db1" class="cmp-container">
8748 +
8749 + <div class="table parbase">
8750 +
8751 +
8752 +
8753 +
8754 +
8755 +
8756 +
8757 +<div class="table-container">
8758 + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1">
8759 + <tbody>
8760 + <tr class="no-border">
8761 + <th style="text-align: center; width: 25%;" class="filled">Term</th>
8762 + <th style="text-align: center; width: 25%;" class="filled">Open</th>
8763 + <th style="text-align: center; width: 25%;" class="filled">Closed</th>
8764 + <th style="text-align: center; width: 25%;" class="filled">APR<a href="#notes-item-30819b1e37" target="_self" class="link-not-underlined__darker" hrefnoextension="false"><sup style="left: 0;">8</sup>**</a></th>
8765 + </tr>
8766 + <tr>
8767 + <td><p style="margin-left: 40px;">6&nbsp;years</p></td>
8768 + <td><p style="margin-left: 40px;">---</p></td>
8769 + <td><p style="margin-left: 40px;"><span static-token='taux6ansF|percent:"true"'>${p1.taux6ansF|percent:"true"}</span><br></p></td>
8770 + <td><p style="margin-left: 40px;">6.44%</p></td>
8771 + </tr>
8772 + <tr>
8773 + <td><p style="margin-left: 40px;">7&nbsp;years</p></td>
8774 + <td><p style="margin-left: 40px;">---</p></td>
8775 + <td><p style="margin-left: 40px;"><span static-token='taux7ansF|percent:"true"'>${p1.taux7ansF|percent:"true"}</span><br></p></td>
8776 + <td><p style="margin-left: 40px;">6.43%</p></td>
8777 + </tr>
8778 + <tr>
8779 + <td><p style="margin-left: 40px;">10&nbsp;years</p></td>
8780 + <td><p style="margin-left: 40px;">---</p></td>
8781 + <td><p style="margin-left: 40px;"><span static-token='taux10ansF|percent:"true"'>${p1.taux10ansF|percent:"true"}</span><br></p></td>
8782 + <td><p style="margin-left: 40px;">6.83%</p></td>
8783 + </tr>
8784 + </tbody>
8785 +</table>
8786 +
8787 + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span>
8788 + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span>
8789 + <div class="table-carousel-dots"></div>
8790 +</div>
8791 +
8792 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/accordion_1525997712/item_1330618322/table_copy_165091638">
8793 + new Websites.TableStatic({
8794 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/accordion_1525997712/item_1330618322/table_copy_165091638",
8795 + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')),
8796 + capsuleAlias: "c1",
8797 + staticHeader: !!(""), // use !! to convert to boolean
8798 + carousel: !!(""),
8799 + transposition: !!(""),
8800 + customId: ""
8801 + });
8802 +</script>
8803 +</div>
8804 +
8805 +
8806 + </div>
8807 +
8808 +</div>
8809 +</div>
8810 + </div>
8811 +
8812 +
8813 +</div>
8814 +</div>
8815 +
8816 +</div>
8817 +
8818 +</div>
8819 +
8820 +
8821 +
8822 +<!--/* Initialize Js */-->
8823 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer">
8824 + if(""){
8825 + new Websites.Sticky({
8826 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer",
8827 + breakpoint: {
8828 + lg: {
8829 + to: ""
8830 + },
8831 + md: {
8832 + to: ""
8833 + },
8834 + sm: {
8835 + to: "none",
8836 + },
8837 + xs: {
8838 + to: "none"
8839 + }
8840 + }
8841 + });
8842 + }
8843 +</script>
8844 +
8845 +</div>
8846 +</div>
8847 +<div class="panelContainer section">
8848 +
8849 +
8850 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
8851 +
8852 +
8853 +
8854 + <div>
8855 +
8856 +
8857 +
8858 +
8859 +
8860 +
8861 +
8862 +
8863 +
8864 +
8865 +
8866 +
8867 +
8868 +
8869 +
8870 +
8871 +
8872 +
8873 +
8874 +
8875 +
8876 +
8877 +
8878 +<div class="panelContainer "
8879 +
8880 +
8881 + data-websites-component="/components/panelContainer.v1"
8882 + data-panel-container-lg-mg="5% 0 0 0"
8883 + data-panel-container-lg-pd=""
8884 + data-panel-container-lg-ht=""
8885 + data-panel-container-md-mg="5% 0 0 0"
8886 + data-panel-container-md-pd=""
8887 + data-panel-container-md-ht=""
8888 + data-panel-container-sm-mg="5% 0 0 0"
8889 + data-panel-container-sm-pd=""
8890 + data-panel-container-sm-ht=""
8891 + data-panel-container-xs-mg="5% 0 0 0"
8892 + data-panel-container-xs-pd=""
8893 + data-panel-container-xs-ht=""
8894 + data-panel-container-limit="">
8895 + <div class="parsys"><div class="textandimage parbase section">
8896 +
8897 +
8898 +
8899 +
8900 +
8901 +
8902 +
8903 +
8904 +
8905 +
8906 +
8907 +
8908 +
8909 +
8910 +
8911 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage" class="text-image-container "
8912 + data-text-image-container-right-left="false">
8913 +
8914 +
8915 +
8916 +
8917 +
8918 +
8919 +
8920 +
8921 +
8922 + <div class="row text-image-row"
8923 + data-websites-component="/components/textandimage/rowcontainer"
8924 +
8925 + data-text-image-rowcontainer-bg-type-lg="none"
8926 +
8927 +
8928 +
8929 +
8930 +
8931 + data-text-image-rowcontainer-height-lg="0"
8932 + data-text-image-rowcontainer-width-lg="0"
8933 + data-text-image-rowcontainer-class-lg="backgroundColor1"
8934 +
8935 + data-text-image-rowcontainer-bg-type-md="none"
8936 +
8937 +
8938 +
8939 +
8940 +
8941 + data-text-image-rowcontainer-height-md="0"
8942 + data-text-image-rowcontainer-width-md="0"
8943 + data-text-image-rowcontainer-class-md="backgroundColor1"
8944 +
8945 + data-text-image-rowcontainer-bg-type-sm="none"
8946 +
8947 +
8948 +
8949 +
8950 +
8951 + data-text-image-rowcontainer-height-sm="0"
8952 + data-text-image-rowcontainer-width-sm="0"
8953 + data-text-image-rowcontainer-class-sm="backgroundColor1"
8954 +
8955 + data-text-image-rowcontainer-bg-type-xs="none"
8956 +
8957 +
8958 +
8959 +
8960 +
8961 + data-text-image-rowcontainer-height-xs="0"
8962 + data-text-image-rowcontainer-width-xs="0"
8963 + data-text-image-rowcontainer-class-xs="backgroundColor1">
8964 +
8965 + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="variable-rate"></a>Variable-rate loan<br>
8966 +</h2>
8967 +</div>
8968 + </div>
8969 +
8970 +
8971 +
8972 +
8973 +
8974 +
8975 +
8976 +
8977 +
8978 +
8979 +
8980 + <script>
8981 +
8982 + (function(){
8983 +
8984 + var dataLayerViewEventName = '' || '';
8985 + var dataLayerViewLayerProperties = [];
8986 + var $el;
8987 +
8988 +
8989 +
8990 + if(dataLayerViewEventName.trim().length) {
8991 +
8992 + var obj = {
8993 + dataLayerViewEventName: dataLayerViewEventName,
8994 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage" ,
8995 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
8996 + };
8997 +
8998 + // IE11 trick (because IE11 don't know document.currentScript):
8999 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
9000 + if(document.currentScript){
9001 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9002 + } else {
9003 + var scripts = document.getElementsByTagName( 'script' );
9004 + var currentScript = scripts[scripts.length - 1];
9005 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9006 + }
9007 +
9008 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
9009 + Websites.DataLayer.cleanViewEventJSON(obj)));
9010 + $el.setAttribute("data-dataLayerViewEvent", 'true');
9011 +
9012 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
9013 +
9014 + }
9015 +
9016 + })();
9017 +
9018 + </script>
9019 +
9020 +</div>
9021 +
9022 + <script>
9023 +
9024 + /**
9025 + * clickEventDownloadHandler()
9026 + * Is used to handle download image action selected as an opening mode
9027 + *
9028 + */
9029 +
9030 + var firstDownload = true;
9031 +
9032 + function clickEventDownloadHandler() {
9033 +
9034 + var link = this;
9035 + var filename = link.dataset.linkpath;
9036 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
9037 + var fn = filename.substring(filename.lastIndexOf('/')+1);
9038 +
9039 + if (newFile) {
9040 +
9041 + if (firstDownload) {
9042 + firstDownload = false;
9043 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
9044 + } else {
9045 + this.href = link.href;
9046 + }
9047 +
9048 + this.download = fn;
9049 +
9050 + } else {
9051 + this.download = fn + ".html";
9052 + }
9053 + }
9054 +
9055 + </script></div>
9056 +<div class="panelContainer section">
9057 +
9058 +
9059 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
9060 +
9061 +
9062 +
9063 + <div>
9064 +
9065 +
9066 +
9067 +
9068 +
9069 +
9070 +
9071 +
9072 +
9073 +
9074 +
9075 +
9076 +
9077 +
9078 +
9079 +
9080 +
9081 +
9082 +
9083 +
9084 +
9085 +
9086 +
9087 +<div class="panelContainer background-none "
9088 +
9089 +
9090 + data-websites-component="/components/panelContainer.v1"
9091 + data-panel-container-lg-mg="1% 20% 0 0"
9092 + data-panel-container-lg-pd=""
9093 + data-panel-container-lg-ht=""
9094 + data-panel-container-md-mg="1% 20% 0 0"
9095 + data-panel-container-md-pd=""
9096 + data-panel-container-md-ht=""
9097 + data-panel-container-sm-mg="1% 0 0 0"
9098 + data-panel-container-sm-pd=""
9099 + data-panel-container-sm-ht=""
9100 + data-panel-container-xs-mg="1% 0 0 0"
9101 + data-panel-container-xs-pd=""
9102 + data-panel-container-xs-ht=""
9103 + data-panel-container-limit="">
9104 + <div class="parsys"><div class="textandimage parbase section">
9105 +
9106 +
9107 +
9108 +
9109 +
9110 +
9111 +
9112 +
9113 +
9114 +
9115 +
9116 +
9117 +
9118 +
9119 +
9120 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_panelcontainer_parsys_textandimage" class="text-image-container "
9121 + data-text-image-container-right-left="false">
9122 +
9123 +
9124 +
9125 +
9126 +
9127 +
9128 +
9129 +
9130 +
9131 + <div class="row text-image-row"
9132 + data-websites-component="/components/textandimage/rowcontainer"
9133 +
9134 + data-text-image-rowcontainer-bg-type-lg="none"
9135 +
9136 +
9137 +
9138 +
9139 +
9140 + data-text-image-rowcontainer-height-lg="0"
9141 + data-text-image-rowcontainer-width-lg="0"
9142 + data-text-image-rowcontainer-class-lg="backgroundColor1"
9143 +
9144 + data-text-image-rowcontainer-bg-type-md="none"
9145 +
9146 +
9147 +
9148 +
9149 +
9150 + data-text-image-rowcontainer-height-md="0"
9151 + data-text-image-rowcontainer-width-md="0"
9152 + data-text-image-rowcontainer-class-md="backgroundColor1"
9153 +
9154 + data-text-image-rowcontainer-bg-type-sm="none"
9155 +
9156 +
9157 +
9158 +
9159 +
9160 + data-text-image-rowcontainer-height-sm="0"
9161 + data-text-image-rowcontainer-width-sm="0"
9162 + data-text-image-rowcontainer-class-sm="backgroundColor1"
9163 +
9164 + data-text-image-rowcontainer-bg-type-xs="none"
9165 +
9166 +
9167 +
9168 +
9169 +
9170 + data-text-image-rowcontainer-height-xs="0"
9171 + data-text-image-rowcontainer-width-xs="0"
9172 + data-text-image-rowcontainer-class-xs="backgroundColor1">
9173 +
9174 + <div class="col-xs-12 text-image-text-container
9175 + initializing" ><p>Variable-rate&nbsp;<a href="/personal/mortgages/loan.html" target="_self" class="link-underlined__darker" hrefnoextension="false">mortgage loan&nbsp;</a>have an interest rate of Prime + <span static-token='ecart|percent:&quot;true&quot;'>${p2.ecart|percent:&quot;true&quot;}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>4</sup></a>&nbsp;and are adjusted monthly. They allow you to take advantage of lower interest rates.</p></div>
9176 + </div>
9177 +
9178 +
9179 +
9180 +
9181 +
9182 +
9183 +
9184 +
9185 +
9186 +
9187 +
9188 +
9189 + <script>
9190 + (function(){
9191 + var $el;
9192 + var listeners = [];
9193 + var dataLayerViewEventName = '';
9194 + var dataLayerViewLayerProperties = [];
9195 +
9196 + dataLayerViewEventName = '';
9197 +
9198 +
9199 +
9200 +
9201 +
9202 + // IE11 trick (because IE11 don't know document.currentScript):
9203 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
9204 + if(document.currentScript){
9205 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9206 + } else {
9207 + var scripts = document.getElementsByTagName( 'script' );
9208 + var currentScript = scripts[scripts.length - 1];
9209 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9210 + }
9211 +
9212 + Websites.Product.Core.initContentQueue.push(function () {
9213 + Websites.Product.TextContent.initTextContent({
9214 + $el: $el,
9215 + capsuleAlias: "c1",
9216 + listeners: listeners,
9217 + products: Websites.Product.Core.determineProductsArray("c1"),
9218 + dataLayerViewEvent: {
9219 + dataLayerViewEventName: dataLayerViewEventName,
9220 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_panelcontainer_parsys_textandimage" ,
9221 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
9222 + }
9223 + });
9224 + });
9225 + })();
9226 +
9227 + </script>
9228 +
9229 +
9230 +
9231 +
9232 +
9233 +</div>
9234 +
9235 + <script>
9236 +
9237 + /**
9238 + * clickEventDownloadHandler()
9239 + * Is used to handle download image action selected as an opening mode
9240 + *
9241 + */
9242 +
9243 + var firstDownload = true;
9244 +
9245 + function clickEventDownloadHandler() {
9246 +
9247 + var link = this;
9248 + var filename = link.dataset.linkpath;
9249 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
9250 + var fn = filename.substring(filename.lastIndexOf('/')+1);
9251 +
9252 + if (newFile) {
9253 +
9254 + if (firstDownload) {
9255 + firstDownload = false;
9256 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
9257 + } else {
9258 + this.href = link.href;
9259 + }
9260 +
9261 + this.download = fn;
9262 +
9263 + } else {
9264 + this.download = fn + ".html";
9265 + }
9266 + }
9267 +
9268 + </script></div>
9269 +
9270 +</div>
9271 +
9272 +</div>
9273 +
9274 +
9275 +
9276 +<!--/* Initialize Js */-->
9277 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/panelcontainer">
9278 + if(""){
9279 + new Websites.Sticky({
9280 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/panelcontainer",
9281 + breakpoint: {
9282 + lg: {
9283 + to: ""
9284 + },
9285 + md: {
9286 + to: ""
9287 + },
9288 + sm: {
9289 + to: "",
9290 + },
9291 + xs: {
9292 + to: ""
9293 + }
9294 + }
9295 + });
9296 + }
9297 +</script>
9298 +
9299 +</div>
9300 +</div>
9301 +<div class="textandimage parbase section">
9302 +
9303 +
9304 +
9305 +
9306 +
9307 +
9308 +
9309 +
9310 +
9311 +
9312 +
9313 +
9314 +
9315 +
9316 +
9317 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage_2116172872" class="text-image-container "
9318 + data-text-image-container-right-left="false">
9319 +
9320 +
9321 +
9322 +
9323 +
9324 +
9325 +
9326 +
9327 +
9328 + <div class="row text-image-row"
9329 + data-websites-component="/components/textandimage/rowcontainer"
9330 +
9331 + data-text-image-rowcontainer-bg-type-lg="none"
9332 +
9333 +
9334 +
9335 +
9336 +
9337 + data-text-image-rowcontainer-height-lg="0"
9338 + data-text-image-rowcontainer-width-lg="0"
9339 + data-text-image-rowcontainer-class-lg="backgroundColor1"
9340 +
9341 + data-text-image-rowcontainer-bg-type-md="none"
9342 +
9343 +
9344 +
9345 +
9346 +
9347 + data-text-image-rowcontainer-height-md="0"
9348 + data-text-image-rowcontainer-width-md="0"
9349 + data-text-image-rowcontainer-class-md="backgroundColor1"
9350 +
9351 + data-text-image-rowcontainer-bg-type-sm="none"
9352 +
9353 +
9354 +
9355 +
9356 +
9357 + data-text-image-rowcontainer-height-sm="0"
9358 + data-text-image-rowcontainer-width-sm="0"
9359 + data-text-image-rowcontainer-class-sm="backgroundColor1"
9360 +
9361 + data-text-image-rowcontainer-bg-type-xs="none"
9362 +
9363 +
9364 +
9365 +
9366 +
9367 + data-text-image-rowcontainer-height-xs="0"
9368 + data-text-image-rowcontainer-width-xs="0"
9369 + data-text-image-rowcontainer-class-xs="backgroundColor1">
9370 +
9371 + <div class="col-xs-12 text-image-text-container
9372 + initializing" ><p class="pvariant3"><b><br>
9373 + Rate (%) as at&nbsp;<span static-token='tauxDateJour|date:&quot;-&quot;'>${p2.tauxDateJour|date:&quot;-&quot;}</span></b></p></div>
9374 + </div>
9375 +
9376 +
9377 +
9378 +
9379 +
9380 +
9381 +
9382 +
9383 +
9384 +
9385 +
9386 +
9387 + <script>
9388 + (function(){
9389 + var $el;
9390 + var listeners = [];
9391 + var dataLayerViewEventName = '';
9392 + var dataLayerViewLayerProperties = [];
9393 +
9394 + dataLayerViewEventName = '';
9395 +
9396 +
9397 +
9398 +
9399 +
9400 + // IE11 trick (because IE11 don't know document.currentScript):
9401 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
9402 + if(document.currentScript){
9403 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9404 + } else {
9405 + var scripts = document.getElementsByTagName( 'script' );
9406 + var currentScript = scripts[scripts.length - 1];
9407 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9408 + }
9409 +
9410 + Websites.Product.Core.initContentQueue.push(function () {
9411 + Websites.Product.TextContent.initTextContent({
9412 + $el: $el,
9413 + capsuleAlias: "c1",
9414 + listeners: listeners,
9415 + products: Websites.Product.Core.determineProductsArray("c1"),
9416 + dataLayerViewEvent: {
9417 + dataLayerViewEventName: dataLayerViewEventName,
9418 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage_2116172872" ,
9419 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
9420 + }
9421 + });
9422 + });
9423 + })();
9424 +
9425 + </script>
9426 +
9427 +
9428 +
9429 +
9430 +
9431 +</div>
9432 +
9433 + <script>
9434 +
9435 + /**
9436 + * clickEventDownloadHandler()
9437 + * Is used to handle download image action selected as an opening mode
9438 + *
9439 + */
9440 +
9441 + var firstDownload = true;
9442 +
9443 + function clickEventDownloadHandler() {
9444 +
9445 + var link = this;
9446 + var filename = link.dataset.linkpath;
9447 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
9448 + var fn = filename.substring(filename.lastIndexOf('/')+1);
9449 +
9450 + if (newFile) {
9451 +
9452 + if (firstDownload) {
9453 + firstDownload = false;
9454 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
9455 + } else {
9456 + this.href = link.href;
9457 + }
9458 +
9459 + this.download = fn;
9460 +
9461 + } else {
9462 + this.download = fn + ".html";
9463 + }
9464 + }
9465 +
9466 + </script></div>
9467 +<div class="table parbase section">
9468 +
9469 +
9470 +
9471 +
9472 +
9473 +
9474 +
9475 +<div class="table-container">
9476 + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1">
9477 + <tbody>
9478 + <tr class="no-border">
9479 + <th style="text-align: center;" class="filled">Mortgage</th>
9480 + <th style="text-align: center;" class="filled">Reference rate</th>
9481 + <th style="text-align: center;" class="filled">Difference</th>
9482 + <th style="text-align: center;" class="filled">Rate in effect<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">*</a></th>
9483 + <th style="text-align: center;" class="filled">APR<a href="#notes-item-30819b1e37" target="_self" class="link-not-underlined__darker" hrefnoextension="false"><sup style="left: 0;">8</sup>**</a></th>
9484 + </tr>
9485 + <tr class="no-border">
9486 + <td colspan="5" class="separator"><b>Prime =&nbsp;<span static-token='tauxBase|percent'>${p1.tauxBase|percent}</span></b></td>
9487 + </tr>
9488 + <tr>
9489 + <td>Variable-rate mortgage (60 month term)</td>
9490 + <td><p style="margin-left: 40px;">Prime rate<br></p></td>
9491 + <td><p style="margin-left: 40px;"><span static-token='ecart|percent:"true"'>${p2.ecart|percent:"true"}</span><br></p></td>
9492 + <td><p style="margin-left: 40px;"><span static-token='taux5ansO|percent:"true"'>${p2.taux5ansO|percent:"true"}</span><br></p></td>
9493 + <td><p style="margin-left: 40px;">4.74%</p></td>
9494 + </tr>
9495 + <tr>
9496 + <td><a href="/personal/help-centre.html#mortgage" target="_self" hrefnoextension="false">Capped-rate mortgage</a>&nbsp;(60 month term)</td>
9497 + <td><p style="margin-left: 40px;">Prime rate</p> <p style="margin-left: 40px;">Capped rate<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>5</sup></a>&nbsp;=&nbsp;<span static-token='tauxPlafond|percent:"true"'>${p3.tauxPlafond|percent:"true"}</span><br></p></td>
9498 + <td><p style="margin-left: 40px;"><span static-token='ecart|percent:"true"'>${p3.ecart|percent:"true"}</span><br></p></td>
9499 + <td><p style="margin-left: 40px;"><span static-token='taux5ansO|percent:"true"'>${p3.taux5ansO|percent:"true"}</span><br></p></td>
9500 + <td><p style="margin-left: 40px;">5.24%</p></td>
9501 + </tr>
9502 + </tbody>
9503 +</table>
9504 +
9505 + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span>
9506 + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span>
9507 + <div class="table-carousel-dots"></div>
9508 +</div>
9509 +
9510 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/table">
9511 + new Websites.TableStatic({
9512 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/table",
9513 + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')),
9514 + capsuleAlias: "c1",
9515 + staticHeader: !!(""), // use !! to convert to boolean
9516 + carousel: !!(""),
9517 + transposition: !!(""),
9518 + customId: ""
9519 + });
9520 +</script>
9521 +</div>
9522 +
9523 +</div>
9524 +
9525 +</div>
9526 +
9527 +
9528 +
9529 +<!--/* Initialize Js */-->
9530 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630">
9531 + if(""){
9532 + new Websites.Sticky({
9533 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630",
9534 + breakpoint: {
9535 + lg: {
9536 + to: ""
9537 + },
9538 + md: {
9539 + to: ""
9540 + },
9541 + sm: {
9542 + to: "",
9543 + },
9544 + xs: {
9545 + to: ""
9546 + }
9547 + }
9548 + });
9549 + }
9550 +</script>
9551 +
9552 +</div>
9553 +</div>
9554 +
9555 +</div>
9556 +
9557 +</div>
9558 +
9559 +
9560 +
9561 +<!--/* Initialize Js */-->
9562 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686">
9563 + if(""){
9564 + new Websites.Sticky({
9565 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686",
9566 + breakpoint: {
9567 + lg: {
9568 + to: "none"
9569 + },
9570 + md: {
9571 + to: "none"
9572 + },
9573 + sm: {
9574 + to: "none",
9575 + },
9576 + xs: {
9577 + to: "none"
9578 + }
9579 + }
9580 + });
9581 + }
9582 +</script>
9583 +
9584 +</div>
9585 +</div>
9586 +<div class="panelContainer section">
9587 +
9588 +
9589 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
9590 +
9591 +
9592 +
9593 + <div>
9594 +
9595 +
9596 +
9597 +
9598 +
9599 +
9600 +
9601 +
9602 +
9603 +
9604 +
9605 +
9606 +
9607 +
9608 +
9609 +
9610 +
9611 +
9612 +
9613 +
9614 +
9615 +
9616 +
9617 +<div class="panelContainer panelContainerStyle2 "
9618 +
9619 +
9620 + data-websites-component="/components/panelContainer.v1"
9621 + data-panel-container-lg-mg=""
9622 + data-panel-container-lg-pd=""
9623 + data-panel-container-lg-ht=""
9624 + data-panel-container-md-mg=""
9625 + data-panel-container-md-pd=""
9626 + data-panel-container-md-ht=""
9627 + data-panel-container-sm-mg=""
9628 + data-panel-container-sm-pd=""
9629 + data-panel-container-sm-ht=""
9630 + data-panel-container-xs-mg=""
9631 + data-panel-container-xs-pd=""
9632 + data-panel-container-xs-ht=""
9633 + data-panel-container-limit="">
9634 + <div class="parsys"><div class="panelContainer section">
9635 +
9636 +
9637 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
9638 +
9639 +
9640 +
9641 + <div>
9642 +
9643 +
9644 +
9645 +
9646 +
9647 +
9648 +
9649 +
9650 +
9651 +
9652 +
9653 +
9654 +
9655 +
9656 +
9657 +
9658 +
9659 +
9660 +
9661 +
9662 +
9663 +
9664 +
9665 +<div class="panelContainer "
9666 +
9667 +
9668 + data-websites-component="/components/panelContainer.v1"
9669 + data-panel-container-lg-mg="2% 0 0 0"
9670 + data-panel-container-lg-pd=""
9671 + data-panel-container-lg-ht=""
9672 + data-panel-container-md-mg="2% 0 0 0"
9673 + data-panel-container-md-pd=""
9674 + data-panel-container-md-ht=""
9675 + data-panel-container-sm-mg="2% 0 0 0"
9676 + data-panel-container-sm-pd=""
9677 + data-panel-container-sm-ht=""
9678 + data-panel-container-xs-mg="2% 0 0 0"
9679 + data-panel-container-xs-pd=""
9680 + data-panel-container-xs-ht=""
9681 + data-panel-container-limit="">
9682 + <div class="parsys"><div class="textandimage parbase section">
9683 +
9684 +
9685 +
9686 +
9687 +
9688 +
9689 +
9690 +
9691 +
9692 +
9693 +
9694 +
9695 +
9696 +
9697 +
9698 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_textandimage" class="text-image-container "
9699 + data-text-image-container-right-left="false">
9700 +
9701 +
9702 +
9703 +
9704 +
9705 +
9706 +
9707 +
9708 +
9709 + <div class="row text-image-row"
9710 + data-websites-component="/components/textandimage/rowcontainer"
9711 +
9712 + data-text-image-rowcontainer-bg-type-lg="none"
9713 +
9714 +
9715 +
9716 +
9717 +
9718 + data-text-image-rowcontainer-height-lg="0"
9719 + data-text-image-rowcontainer-width-lg="0"
9720 + data-text-image-rowcontainer-class-lg="backgroundColor1"
9721 +
9722 + data-text-image-rowcontainer-bg-type-md="none"
9723 +
9724 +
9725 +
9726 +
9727 +
9728 + data-text-image-rowcontainer-height-md="0"
9729 + data-text-image-rowcontainer-width-md="0"
9730 + data-text-image-rowcontainer-class-md="backgroundColor1"
9731 +
9732 + data-text-image-rowcontainer-bg-type-sm="none"
9733 +
9734 +
9735 +
9736 +
9737 +
9738 + data-text-image-rowcontainer-height-sm="0"
9739 + data-text-image-rowcontainer-width-sm="0"
9740 + data-text-image-rowcontainer-class-sm="backgroundColor1"
9741 +
9742 + data-text-image-rowcontainer-bg-type-xs="none"
9743 +
9744 +
9745 +
9746 +
9747 +
9748 + data-text-image-rowcontainer-height-xs="0"
9749 + data-text-image-rowcontainer-width-xs="0"
9750 + data-text-image-rowcontainer-class-xs="backgroundColor1">
9751 +
9752 + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="credit"></a>Home equity line of credit<br>
9753 +</h2>
9754 +</div>
9755 + </div>
9756 +
9757 +
9758 +
9759 +
9760 +
9761 +
9762 +
9763 +
9764 +
9765 +
9766 +
9767 + <script>
9768 +
9769 + (function(){
9770 +
9771 + var dataLayerViewEventName = '' || '';
9772 + var dataLayerViewLayerProperties = [];
9773 + var $el;
9774 +
9775 +
9776 +
9777 + if(dataLayerViewEventName.trim().length) {
9778 +
9779 + var obj = {
9780 + dataLayerViewEventName: dataLayerViewEventName,
9781 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_textandimage" ,
9782 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
9783 + };
9784 +
9785 + // IE11 trick (because IE11 don't know document.currentScript):
9786 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
9787 + if(document.currentScript){
9788 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9789 + } else {
9790 + var scripts = document.getElementsByTagName( 'script' );
9791 + var currentScript = scripts[scripts.length - 1];
9792 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9793 + }
9794 +
9795 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
9796 + Websites.DataLayer.cleanViewEventJSON(obj)));
9797 + $el.setAttribute("data-dataLayerViewEvent", 'true');
9798 +
9799 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
9800 +
9801 + }
9802 +
9803 + })();
9804 +
9805 + </script>
9806 +
9807 +</div>
9808 +
9809 + <script>
9810 +
9811 + /**
9812 + * clickEventDownloadHandler()
9813 + * Is used to handle download image action selected as an opening mode
9814 + *
9815 + */
9816 +
9817 + var firstDownload = true;
9818 +
9819 + function clickEventDownloadHandler() {
9820 +
9821 + var link = this;
9822 + var filename = link.dataset.linkpath;
9823 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
9824 + var fn = filename.substring(filename.lastIndexOf('/')+1);
9825 +
9826 + if (newFile) {
9827 +
9828 + if (firstDownload) {
9829 + firstDownload = false;
9830 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
9831 + } else {
9832 + this.href = link.href;
9833 + }
9834 +
9835 + this.download = fn;
9836 +
9837 + } else {
9838 + this.download = fn + ".html";
9839 + }
9840 + }
9841 +
9842 + </script></div>
9843 +<div class="panelContainer section">
9844 +
9845 +
9846 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
9847 +
9848 +
9849 +
9850 + <div>
9851 +
9852 +
9853 +
9854 +
9855 +
9856 +
9857 +
9858 +
9859 +
9860 +
9861 +
9862 +
9863 +
9864 +
9865 +
9866 +
9867 +
9868 +
9869 +
9870 +
9871 +
9872 +
9873 +
9874 +<div class="panelContainer background-none "
9875 +
9876 +
9877 + data-websites-component="/components/panelContainer.v1"
9878 + data-panel-container-lg-mg="1% 20% 0 0"
9879 + data-panel-container-lg-pd=""
9880 + data-panel-container-lg-ht=""
9881 + data-panel-container-md-mg="1% 20% 0 0"
9882 + data-panel-container-md-pd=""
9883 + data-panel-container-md-ht=""
9884 + data-panel-container-sm-mg="1% 0 0 0"
9885 + data-panel-container-sm-pd=""
9886 + data-panel-container-sm-ht=""
9887 + data-panel-container-xs-mg="1% 0 0 0"
9888 + data-panel-container-xs-pd=""
9889 + data-panel-container-xs-ht=""
9890 + data-panel-container-limit="">
9891 + <div class="parsys"><div class="textandimage parbase section">
9892 +
9893 +
9894 +
9895 +
9896 +
9897 +
9898 +
9899 +
9900 +
9901 +
9902 +
9903 +
9904 +
9905 +
9906 +
9907 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_panelcontainer_parsys_textandimage" class="text-image-container "
9908 + data-text-image-container-right-left="false">
9909 +
9910 +
9911 +
9912 +
9913 +
9914 +
9915 +
9916 +
9917 +
9918 + <div class="row text-image-row"
9919 + data-websites-component="/components/textandimage/rowcontainer"
9920 +
9921 + data-text-image-rowcontainer-bg-type-lg="none"
9922 +
9923 +
9924 +
9925 +
9926 +
9927 + data-text-image-rowcontainer-height-lg="0"
9928 + data-text-image-rowcontainer-width-lg="0"
9929 + data-text-image-rowcontainer-class-lg="backgroundColor1"
9930 +
9931 + data-text-image-rowcontainer-bg-type-md="none"
9932 +
9933 +
9934 +
9935 +
9936 +
9937 + data-text-image-rowcontainer-height-md="0"
9938 + data-text-image-rowcontainer-width-md="0"
9939 + data-text-image-rowcontainer-class-md="backgroundColor1"
9940 +
9941 + data-text-image-rowcontainer-bg-type-sm="none"
9942 +
9943 +
9944 +
9945 +
9946 +
9947 + data-text-image-rowcontainer-height-sm="0"
9948 + data-text-image-rowcontainer-width-sm="0"
9949 + data-text-image-rowcontainer-class-sm="backgroundColor1"
9950 +
9951 + data-text-image-rowcontainer-bg-type-xs="none"
9952 +
9953 +
9954 +
9955 +
9956 +
9957 + data-text-image-rowcontainer-height-xs="0"
9958 + data-text-image-rowcontainer-width-xs="0"
9959 + data-text-image-rowcontainer-class-xs="backgroundColor1">
9960 +
9961 + <div class="col-xs-12 text-image-text-container " ><p>The All-In-One<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">TM</a></sup>&nbsp;<a href="/personal/mortgages/all-in-one.html" target="_self" class="link-underlined__darker" hrefnoextension="false">home equity line of credit</a>&nbsp;allows you to use the principal you repay to finance new projects, like renovations or travel.&nbsp;The&nbsp;rate is variable.<br>
9962 +</p>
9963 +</div>
9964 + </div>
9965 +
9966 +
9967 +
9968 +
9969 +
9970 +
9971 +
9972 +
9973 +
9974 +
9975 +
9976 + <script>
9977 +
9978 + (function(){
9979 +
9980 + var dataLayerViewEventName = '' || '';
9981 + var dataLayerViewLayerProperties = [];
9982 + var $el;
9983 +
9984 +
9985 +
9986 + if(dataLayerViewEventName.trim().length) {
9987 +
9988 + var obj = {
9989 + dataLayerViewEventName: dataLayerViewEventName,
9990 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_panelcontainer_parsys_textandimage" ,
9991 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
9992 + };
9993 +
9994 + // IE11 trick (because IE11 don't know document.currentScript):
9995 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
9996 + if(document.currentScript){
9997 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
9998 + } else {
9999 + var scripts = document.getElementsByTagName( 'script' );
10000 + var currentScript = scripts[scripts.length - 1];
10001 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
10002 + }
10003 +
10004 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
10005 + Websites.DataLayer.cleanViewEventJSON(obj)));
10006 + $el.setAttribute("data-dataLayerViewEvent", 'true');
10007 +
10008 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
10009 +
10010 + }
10011 +
10012 + })();
10013 +
10014 + </script>
10015 +
10016 +</div>
10017 +
10018 + <script>
10019 +
10020 + /**
10021 + * clickEventDownloadHandler()
10022 + * Is used to handle download image action selected as an opening mode
10023 + *
10024 + */
10025 +
10026 + var firstDownload = true;
10027 +
10028 + function clickEventDownloadHandler() {
10029 +
10030 + var link = this;
10031 + var filename = link.dataset.linkpath;
10032 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
10033 + var fn = filename.substring(filename.lastIndexOf('/')+1);
10034 +
10035 + if (newFile) {
10036 +
10037 + if (firstDownload) {
10038 + firstDownload = false;
10039 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
10040 + } else {
10041 + this.href = link.href;
10042 + }
10043 +
10044 + this.download = fn;
10045 +
10046 + } else {
10047 + this.download = fn + ".html";
10048 + }
10049 + }
10050 +
10051 + </script></div>
10052 +
10053 +</div>
10054 +
10055 +</div>
10056 +
10057 +
10058 +
10059 +<!--/* Initialize Js */-->
10060 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689/parsys/panelcontainer">
10061 + if(""){
10062 + new Websites.Sticky({
10063 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689/parsys/panelcontainer",
10064 + breakpoint: {
10065 + lg: {
10066 + to: ""
10067 + },
10068 + md: {
10069 + to: ""
10070 + },
10071 + sm: {
10072 + to: "",
10073 + },
10074 + xs: {
10075 + to: ""
10076 + }
10077 + }
10078 + });
10079 + }
10080 +</script>
10081 +
10082 +</div>
10083 +</div>
10084 +
10085 +</div>
10086 +
10087 +</div>
10088 +
10089 +
10090 +
10091 +<!--/* Initialize Js */-->
10092 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689">
10093 + if(""){
10094 + new Websites.Sticky({
10095 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689",
10096 + breakpoint: {
10097 + lg: {
10098 + to: "none"
10099 + },
10100 + md: {
10101 + to: "none"
10102 + },
10103 + sm: {
10104 + to: "none",
10105 + },
10106 + xs: {
10107 + to: "none"
10108 + }
10109 + }
10110 + });
10111 + }
10112 +</script>
10113 +
10114 +</div>
10115 +</div>
10116 +<div class="textandimage parbase section">
10117 +
10118 +
10119 +
10120 +
10121 +
10122 +
10123 +
10124 +
10125 +
10126 +
10127 +
10128 +
10129 +
10130 +
10131 +
10132 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage_2116172" class="text-image-container "
10133 + data-text-image-container-right-left="false">
10134 +
10135 +
10136 +
10137 +
10138 +
10139 +
10140 +
10141 +
10142 +
10143 + <div class="row text-image-row"
10144 + data-websites-component="/components/textandimage/rowcontainer"
10145 +
10146 + data-text-image-rowcontainer-bg-type-lg="none"
10147 +
10148 +
10149 +
10150 +
10151 +
10152 + data-text-image-rowcontainer-height-lg="0"
10153 + data-text-image-rowcontainer-width-lg="0"
10154 + data-text-image-rowcontainer-class-lg="backgroundColor1"
10155 +
10156 + data-text-image-rowcontainer-bg-type-md="none"
10157 +
10158 +
10159 +
10160 +
10161 +
10162 + data-text-image-rowcontainer-height-md="0"
10163 + data-text-image-rowcontainer-width-md="0"
10164 + data-text-image-rowcontainer-class-md="backgroundColor1"
10165 +
10166 + data-text-image-rowcontainer-bg-type-sm="none"
10167 +
10168 +
10169 +
10170 +
10171 +
10172 + data-text-image-rowcontainer-height-sm="0"
10173 + data-text-image-rowcontainer-width-sm="0"
10174 + data-text-image-rowcontainer-class-sm="backgroundColor1"
10175 +
10176 + data-text-image-rowcontainer-bg-type-xs="none"
10177 +
10178 +
10179 +
10180 +
10181 +
10182 + data-text-image-rowcontainer-height-xs="0"
10183 + data-text-image-rowcontainer-width-xs="0"
10184 + data-text-image-rowcontainer-class-xs="backgroundColor1">
10185 +
10186 + <div class="col-xs-12 text-image-text-container
10187 + initializing" ><p class="pvariant3"><b><br>
10188 + Rate (%) as at&nbsp;<span static-token='tauxDateJour|date:&quot;-&quot;'>${p2.tauxDateJour|date:&quot;-&quot;}</span><br>
10189 + </b></p></div>
10190 + </div>
10191 +
10192 +
10193 +
10194 +
10195 +
10196 +
10197 +
10198 +
10199 +
10200 +
10201 +
10202 +
10203 + <script>
10204 + (function(){
10205 + var $el;
10206 + var listeners = [];
10207 + var dataLayerViewEventName = '';
10208 + var dataLayerViewLayerProperties = [];
10209 +
10210 + dataLayerViewEventName = '';
10211 +
10212 +
10213 +
10214 +
10215 +
10216 + // IE11 trick (because IE11 don't know document.currentScript):
10217 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
10218 + if(document.currentScript){
10219 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
10220 + } else {
10221 + var scripts = document.getElementsByTagName( 'script' );
10222 + var currentScript = scripts[scripts.length - 1];
10223 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
10224 + }
10225 +
10226 + Websites.Product.Core.initContentQueue.push(function () {
10227 + Websites.Product.TextContent.initTextContent({
10228 + $el: $el,
10229 + capsuleAlias: "c1",
10230 + listeners: listeners,
10231 + products: Websites.Product.Core.determineProductsArray("c1"),
10232 + dataLayerViewEvent: {
10233 + dataLayerViewEventName: dataLayerViewEventName,
10234 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage_2116172" ,
10235 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
10236 + }
10237 + });
10238 + });
10239 + })();
10240 +
10241 + </script>
10242 +
10243 +
10244 +
10245 +
10246 +
10247 +</div>
10248 +
10249 + <script>
10250 +
10251 + /**
10252 + * clickEventDownloadHandler()
10253 + * Is used to handle download image action selected as an opening mode
10254 + *
10255 + */
10256 +
10257 + var firstDownload = true;
10258 +
10259 + function clickEventDownloadHandler() {
10260 +
10261 + var link = this;
10262 + var filename = link.dataset.linkpath;
10263 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
10264 + var fn = filename.substring(filename.lastIndexOf('/')+1);
10265 +
10266 + if (newFile) {
10267 +
10268 + if (firstDownload) {
10269 + firstDownload = false;
10270 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
10271 + } else {
10272 + this.href = link.href;
10273 + }
10274 +
10275 + this.download = fn;
10276 +
10277 + } else {
10278 + this.download = fn + ".html";
10279 + }
10280 + }
10281 +
10282 + </script></div>
10283 +<div class="table parbase section">
10284 +
10285 +
10286 +
10287 +
10288 +
10289 +
10290 +
10291 +<div class="table-container">
10292 + <table width="100%" cellspacing="0" cellpadding="1" border="1" class="bncr-table bncr-table-mobile">
10293 + <tbody>
10294 + <tr class="no-border">
10295 + <th class="filled">&nbsp;</th>
10296 + <th style="text-align: center;" class="filled">Prime rate<br></th>
10297 + <th style="text-align: center;" class="filled">Difference</th>
10298 + <th style="text-align: center;" class="filled">Rate in effect<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">*</a></th>
10299 + <th style="text-align: center;" class="filled">Interest earned</th>
10300 + </tr>
10301 + <tr>
10302 + <td><p>Rate for the home equity line of credit<br></p></td>
10303 + <td><p style="text-align: center;"><span static-token='tauxBase|percent:"true"'>${p5.tauxBase|percent:"true"}</span><br></p></td>
10304 + <td><p style="text-align: center;">1%<br></p></td>
10305 + <td><p style="text-align: center;"><span static-token='taux|percent:"true"'>${p5.taux|percent:"true"}</span><br></p></td>
10306 + <td style="text-align: center;"><p style="text-align: center;"><span static-token='interetCredT2|percent:"true"'>${p5.interetCredT2|percent:"true"}</span><sup>&nbsp;</sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>6</sup></a></p></td>
10307 + </tr>
10308 + <tr>
10309 + <td colspan="5"><p>Fixed rate of 7$ per month, per account</p></td>
10310 + </tr>
10311 + </tbody>
10312 +</table>
10313 +
10314 + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span>
10315 + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span>
10316 + <div class="table-carousel-dots"></div>
10317 +</div>
10318 +
10319 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/table_copy_copy">
10320 + new Websites.TableStatic({
10321 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/table_copy_copy",
10322 + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')),
10323 + capsuleAlias: "c2",
10324 + staticHeader: !!(""), // use !! to convert to boolean
10325 + carousel: !!(""),
10326 + transposition: !!(""),
10327 + customId: ""
10328 + });
10329 +</script>
10330 +</div>
10331 +<div class="textandimage parbase section">
10332 +
10333 +
10334 +
10335 +
10336 +
10337 +
10338 +
10339 +
10340 +
10341 +
10342 +
10343 +
10344 +
10345 +
10346 +
10347 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage" class="text-image-container "
10348 + data-text-image-container-right-left="false">
10349 +
10350 +
10351 +
10352 +
10353 +
10354 +
10355 +
10356 +
10357 +
10358 + <div class="row text-image-row"
10359 + data-websites-component="/components/textandimage/rowcontainer"
10360 +
10361 + data-text-image-rowcontainer-bg-type-lg=""
10362 +
10363 +
10364 +
10365 +
10366 +
10367 + data-text-image-rowcontainer-height-lg="0"
10368 + data-text-image-rowcontainer-width-lg="0"
10369 + data-text-image-rowcontainer-class-lg=""
10370 +
10371 + data-text-image-rowcontainer-bg-type-md=""
10372 +
10373 +
10374 +
10375 +
10376 +
10377 + data-text-image-rowcontainer-height-md="0"
10378 + data-text-image-rowcontainer-width-md="0"
10379 + data-text-image-rowcontainer-class-md=""
10380 +
10381 + data-text-image-rowcontainer-bg-type-sm=""
10382 +
10383 +
10384 +
10385 +
10386 +
10387 + data-text-image-rowcontainer-height-sm="0"
10388 + data-text-image-rowcontainer-width-sm="0"
10389 + data-text-image-rowcontainer-class-sm=""
10390 +
10391 + data-text-image-rowcontainer-bg-type-xs=""
10392 +
10393 +
10394 +
10395 +
10396 +
10397 + data-text-image-rowcontainer-height-xs="0"
10398 + data-text-image-rowcontainer-width-xs="0"
10399 + data-text-image-rowcontainer-class-xs="">
10400 +
10401 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/all-in-one.html" target="_self" class="btnRTE4 btn-arrow btn" hrefnoextension="false">See the line of credit</a></p>
10402 +</div>
10403 + </div>
10404 +
10405 +
10406 +
10407 +
10408 +
10409 +
10410 +
10411 +
10412 +
10413 +
10414 +
10415 + <script>
10416 +
10417 + (function(){
10418 +
10419 + var dataLayerViewEventName = '' || '';
10420 + var dataLayerViewLayerProperties = [];
10421 + var $el;
10422 +
10423 +
10424 +
10425 + if(dataLayerViewEventName.trim().length) {
10426 +
10427 + var obj = {
10428 + dataLayerViewEventName: dataLayerViewEventName,
10429 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage" ,
10430 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
10431 + };
10432 +
10433 + // IE11 trick (because IE11 don't know document.currentScript):
10434 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
10435 + if(document.currentScript){
10436 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
10437 + } else {
10438 + var scripts = document.getElementsByTagName( 'script' );
10439 + var currentScript = scripts[scripts.length - 1];
10440 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
10441 + }
10442 +
10443 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
10444 + Websites.DataLayer.cleanViewEventJSON(obj)));
10445 + $el.setAttribute("data-dataLayerViewEvent", 'true');
10446 +
10447 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
10448 +
10449 + }
10450 +
10451 + })();
10452 +
10453 + </script>
10454 +
10455 +</div>
10456 +
10457 + <script>
10458 +
10459 + /**
10460 + * clickEventDownloadHandler()
10461 + * Is used to handle download image action selected as an opening mode
10462 + *
10463 + */
10464 +
10465 + var firstDownload = true;
10466 +
10467 + function clickEventDownloadHandler() {
10468 +
10469 + var link = this;
10470 + var filename = link.dataset.linkpath;
10471 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
10472 + var fn = filename.substring(filename.lastIndexOf('/')+1);
10473 +
10474 + if (newFile) {
10475 +
10476 + if (firstDownload) {
10477 + firstDownload = false;
10478 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
10479 + } else {
10480 + this.href = link.href;
10481 + }
10482 +
10483 + this.download = fn;
10484 +
10485 + } else {
10486 + this.download = fn + ".html";
10487 + }
10488 + }
10489 +
10490 + </script></div>
10491 +<div class="panelContainer section">
10492 +
10493 +
10494 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
10495 +
10496 +
10497 +
10498 + <div>
10499 +
10500 +
10501 +
10502 +
10503 +
10504 +
10505 +
10506 +
10507 +
10508 +
10509 +
10510 +
10511 +
10512 +
10513 +
10514 +
10515 +
10516 +
10517 +
10518 +
10519 +
10520 +
10521 +
10522 +<div class="panelContainer hidden-lg hidden-md hidden-sm hidden-xs "
10523 +
10524 +
10525 + data-websites-component="/components/panelContainer.v1"
10526 + data-panel-container-lg-mg=""
10527 + data-panel-container-lg-pd=""
10528 + data-panel-container-lg-ht=""
10529 + data-panel-container-md-mg=""
10530 + data-panel-container-md-pd=""
10531 + data-panel-container-md-ht=""
10532 + data-panel-container-sm-mg=""
10533 + data-panel-container-sm-pd=""
10534 + data-panel-container-sm-ht=""
10535 + data-panel-container-xs-mg=""
10536 + data-panel-container-xs-pd=""
10537 + data-panel-container-xs-ht=""
10538 + data-panel-container-limit="">
10539 + <div class="parsys"><div class="table parbase section">
10540 +
10541 +
10542 +
10543 +
10544 +
10545 +
10546 +
10547 +<div class="table-container">
10548 + <table width="100%" cellspacing="0" cellpadding="1" border="1" class="bncr-table bncr-table-mobile">
10549 + <tbody>
10550 + <tr class="no-border">
10551 + <th style="text-align: center;" class="filled" colspan="2"><span style="font-size: 14px; font-weight: 400; letter-spacing: normal;">Interest earned (interest paid on accounts grouped together in the AIO)<br> </span></th>
10552 + </tr>
10553 + <tr class="no-border">
10554 + <td colspan="2" class="separator"><p style="margin-left: 40px;">Prime =&nbsp;<span static-token='tauxBase|percent:"true"'>${p5.tauxBase|percent:"true"}</span><br> All-in-one = Prime +&nbsp;<span static-token='ecart|percent:"true"'>${p5.ecart|percent:"true"}</span> =&nbsp;<span static-token='taux|percent:"true"'>${p5.taux|percent:"true"}</span><br> $6.00/month for the main account</p></td>
10555 + </tr>
10556 + <tr>
10557 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$0 to $4,999.99<br> </span></p></td>
10558 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT1|percent:"true"'>${p5.interetCredT1|percent:"true"}</span><br> </span></p></td>
10559 + </tr>
10560 + <tr>
10561 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$5,000 to $24,999.99<br> </span></p></td>
10562 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT2|percent:"true"'>${p5.interetCredT2|percent:"true"}</span><br> </span></p></td>
10563 + </tr>
10564 + <tr>
10565 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$25,000 to $59,999.99<br> </span></p></td>
10566 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT3|percent:"true"'>${p5.interetCredT3|percent:"true"}</span><br> </span></p></td>
10567 + </tr>
10568 + <tr>
10569 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$60,000 to $99,999.99<br> </span></p></td>
10570 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT4|percent:"true"'>${p5.interetCredT4|percent:"true"}</span><br> </span></p></td>
10571 + </tr>
10572 + <tr>
10573 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$100,000 or more<br> </span></p></td>
10574 + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT5|percent:"true"'>${p5.interetCredT5|percent:"true"}</span><br> </span></p></td>
10575 + </tr>
10576 + </tbody>
10577 +</table>
10578 +
10579 + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span>
10580 + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span>
10581 + <div class="table-carousel-dots"></div>
10582 +</div>
10583 +
10584 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer/parsys/table">
10585 + new Websites.TableStatic({
10586 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer/parsys/table",
10587 + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')),
10588 + capsuleAlias: "c2",
10589 + staticHeader: !!(""), // use !! to convert to boolean
10590 + carousel: !!(""),
10591 + transposition: !!(""),
10592 + customId: ""
10593 + });
10594 +</script>
10595 +</div>
10596 +
10597 +</div>
10598 +
10599 +</div>
10600 +
10601 +
10602 +
10603 +<!--/* Initialize Js */-->
10604 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer">
10605 + if(""){
10606 + new Websites.Sticky({
10607 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer",
10608 + breakpoint: {
10609 + lg: {
10610 + to: "none"
10611 + },
10612 + md: {
10613 + to: "none"
10614 + },
10615 + sm: {
10616 + to: "none",
10617 + },
10618 + xs: {
10619 + to: "none"
10620 + }
10621 + }
10622 + });
10623 + }
10624 +</script>
10625 +
10626 +</div>
10627 +</div>
10628 +<div class="panelContainer section">
10629 +
10630 +
10631 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
10632 +
10633 +
10634 +
10635 + <div>
10636 +
10637 +
10638 +
10639 +
10640 +
10641 +
10642 +
10643 +
10644 +
10645 +
10646 +
10647 +
10648 +
10649 +
10650 +
10651 +
10652 +
10653 +
10654 +
10655 +
10656 +
10657 +
10658 +
10659 +<div class="panelContainer at-0165-remove"
10660 +
10661 +
10662 + data-websites-component="/components/panelContainer.v1"
10663 + data-panel-container-lg-mg="5% 0% 0% 0%"
10664 + data-panel-container-lg-pd=""
10665 + data-panel-container-lg-ht=""
10666 + data-panel-container-md-mg="5% 0% 0% 0%"
10667 + data-panel-container-md-pd=""
10668 + data-panel-container-md-ht=""
10669 + data-panel-container-sm-mg="5% 0% 0% 0%"
10670 + data-panel-container-sm-pd=""
10671 + data-panel-container-sm-ht=""
10672 + data-panel-container-xs-mg="5% 0% 0% 0%"
10673 + data-panel-container-xs-pd=""
10674 + data-panel-container-xs-ht=""
10675 + data-panel-container-limit="">
10676 + <div class="parsys"><div class="textandimage parbase section">
10677 +
10678 +
10679 +
10680 +
10681 +
10682 +
10683 +
10684 +
10685 +
10686 +
10687 +
10688 +
10689 +
10690 +
10691 +
10692 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_textandimage" class="text-image-container "
10693 + data-text-image-container-right-left="false">
10694 +
10695 +
10696 +
10697 +
10698 +
10699 +
10700 +
10701 +
10702 +
10703 + <div class="row text-image-row"
10704 + data-websites-component="/components/textandimage/rowcontainer"
10705 +
10706 + data-text-image-rowcontainer-bg-type-lg="none"
10707 +
10708 +
10709 +
10710 +
10711 +
10712 + data-text-image-rowcontainer-height-lg="0"
10713 + data-text-image-rowcontainer-width-lg="0"
10714 + data-text-image-rowcontainer-class-lg="backgroundColor1"
10715 +
10716 + data-text-image-rowcontainer-bg-type-md="none"
10717 +
10718 +
10719 +
10720 +
10721 +
10722 + data-text-image-rowcontainer-height-md="0"
10723 + data-text-image-rowcontainer-width-md="0"
10724 + data-text-image-rowcontainer-class-md="backgroundColor1"
10725 +
10726 + data-text-image-rowcontainer-bg-type-sm="none"
10727 +
10728 +
10729 +
10730 +
10731 +
10732 + data-text-image-rowcontainer-height-sm="0"
10733 + data-text-image-rowcontainer-width-sm="0"
10734 + data-text-image-rowcontainer-class-sm="backgroundColor1"
10735 +
10736 + data-text-image-rowcontainer-bg-type-xs="none"
10737 +
10738 +
10739 +
10740 +
10741 +
10742 + data-text-image-rowcontainer-height-xs="0"
10743 + data-text-image-rowcontainer-width-xs="0"
10744 + data-text-image-rowcontainer-class-xs="backgroundColor1">
10745 +
10746 + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant3">Explore our mortgage solutions<br>
10747 +</h2>
10748 +</div>
10749 + </div>
10750 +
10751 +
10752 +
10753 +
10754 +
10755 +
10756 +
10757 +
10758 +
10759 +
10760 +
10761 + <script>
10762 +
10763 + (function(){
10764 +
10765 + var dataLayerViewEventName = '' || '';
10766 + var dataLayerViewLayerProperties = [];
10767 + var $el;
10768 +
10769 +
10770 +
10771 + if(dataLayerViewEventName.trim().length) {
10772 +
10773 + var obj = {
10774 + dataLayerViewEventName: dataLayerViewEventName,
10775 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_textandimage" ,
10776 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
10777 + };
10778 +
10779 + // IE11 trick (because IE11 don't know document.currentScript):
10780 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
10781 + if(document.currentScript){
10782 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
10783 + } else {
10784 + var scripts = document.getElementsByTagName( 'script' );
10785 + var currentScript = scripts[scripts.length - 1];
10786 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
10787 + }
10788 +
10789 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
10790 + Websites.DataLayer.cleanViewEventJSON(obj)));
10791 + $el.setAttribute("data-dataLayerViewEvent", 'true');
10792 +
10793 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
10794 +
10795 + }
10796 +
10797 + })();
10798 +
10799 + </script>
10800 +
10801 +</div>
10802 +
10803 + <script>
10804 +
10805 + /**
10806 + * clickEventDownloadHandler()
10807 + * Is used to handle download image action selected as an opening mode
10808 + *
10809 + */
10810 +
10811 + var firstDownload = true;
10812 +
10813 + function clickEventDownloadHandler() {
10814 +
10815 + var link = this;
10816 + var filename = link.dataset.linkpath;
10817 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
10818 + var fn = filename.substring(filename.lastIndexOf('/')+1);
10819 +
10820 + if (newFile) {
10821 +
10822 + if (firstDownload) {
10823 + firstDownload = false;
10824 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
10825 + } else {
10826 + this.href = link.href;
10827 + }
10828 +
10829 + this.download = fn;
10830 +
10831 + } else {
10832 + this.download = fn + ".html";
10833 + }
10834 + }
10835 +
10836 + </script></div>
10837 +<div class="panelContainer section">
10838 +
10839 +
10840 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
10841 +
10842 +
10843 +
10844 + <div>
10845 +
10846 +
10847 +
10848 +
10849 +
10850 +
10851 +
10852 +
10853 +
10854 +
10855 +
10856 +
10857 +
10858 +
10859 +
10860 +
10861 +
10862 +
10863 +
10864 +
10865 +
10866 +
10867 +
10868 +<div class="panelContainer panel-border panel-border-radius "
10869 +
10870 +
10871 + data-websites-component="/components/panelContainer.v1"
10872 + data-panel-container-lg-mg=""
10873 + data-panel-container-lg-pd=""
10874 + data-panel-container-lg-ht=""
10875 + data-panel-container-md-mg=""
10876 + data-panel-container-md-pd=""
10877 + data-panel-container-md-ht=""
10878 + data-panel-container-sm-mg=""
10879 + data-panel-container-sm-pd=""
10880 + data-panel-container-sm-ht=""
10881 + data-panel-container-xs-mg=""
10882 + data-panel-container-xs-pd=""
10883 + data-panel-container-xs-ht=""
10884 + data-panel-container-limit="">
10885 + <div class="parsys"><div class="columns parbase section">
10886 +
10887 +
10888 +
10889 +
10890 +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div>
10891 +
10892 +
10893 +
10894 +
10895 +
10896 +
10897 +
10898 +
10899 +
10900 +
10901 +
10902 +
10903 +
10904 + <div style=""
10905 + class="columns-row row adapt-size row-eq-height"
10906 +
10907 + data-style-lg="" data-height-lg=""
10908 + data-width-lg=""
10909 + data-background-color-lg=""
10910 + data-background-color-xs="">
10911 + <div style=""
10912 + class="col-xs-12 col-sm-12 columns-title "
10913 + data-height="" data-width=""
10914 + data-style-xs="" data-height-xs=""
10915 + data-width-xs="">
10916 +
10917 + </div>
10918 +
10919 +
10920 +
10921 +
10922 + <div class="col-xs-12 col-sm-4 column col-first separatorFilet">
10923 + <div class="parsys1 parsys"><div class="panelContainer section">
10924 +
10925 +
10926 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
10927 +
10928 +
10929 +
10930 + <div>
10931 +
10932 +
10933 +
10934 +
10935 +
10936 +
10937 +
10938 +
10939 +
10940 +
10941 +
10942 +
10943 +
10944 +
10945 +
10946 +
10947 +
10948 +
10949 +
10950 +
10951 +
10952 +
10953 +
10954 +<div class="panelContainer "
10955 +
10956 +
10957 + data-websites-component="/components/panelContainer.v1"
10958 + data-panel-container-lg-mg=""
10959 + data-panel-container-lg-pd="30px 20px 20px 20px"
10960 + data-panel-container-lg-ht=""
10961 + data-panel-container-md-mg=""
10962 + data-panel-container-md-pd="30px 20px 20px 20px"
10963 + data-panel-container-md-ht=""
10964 + data-panel-container-sm-mg=""
10965 + data-panel-container-sm-pd="30px 20px 20px 20px"
10966 + data-panel-container-sm-ht=""
10967 + data-panel-container-xs-mg=""
10968 + data-panel-container-xs-pd="30px 20px 20px 20px"
10969 + data-panel-container-xs-ht=""
10970 + data-panel-container-limit="">
10971 + <div class="parsys"><div class="plainhtmlcode section">
10972 +<div data-emptytext="HTML Component" class="cq-placeholder"></div>
10973 +<style>.bnc-promo-pastille {
10974 + position: absolute;
10975 + top: -35px;
10976 + right: 15px;
10977 +}</style>
10978 +
10979 +<p style="position:relative; margin: 0;"><span style="font-size: 14.0px; letter-spacing: normal;"><img src="/etc.clientlibs/web-sites/components/product/clientlibs/core/site/resources/images/bnc-promo.png" alt="promo" class="bnc-promo-pastille"></span></p>
10980 +</div>
10981 +<div class="textandimage parbase section">
10982 +
10983 +
10984 +
10985 +
10986 +
10987 +
10988 +
10989 +
10990 +
10991 +
10992 +
10993 +
10994 +
10995 +
10996 +
10997 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys1_panelcontainer_parsys_textandimage" class="text-image-container "
10998 + data-text-image-container-right-left="false">
10999 +
11000 +
11001 +
11002 +
11003 +
11004 +
11005 +
11006 +
11007 +
11008 + <div class="row text-image-row"
11009 + data-websites-component="/components/textandimage/rowcontainer"
11010 +
11011 + data-text-image-rowcontainer-bg-type-lg=""
11012 +
11013 +
11014 +
11015 +
11016 +
11017 + data-text-image-rowcontainer-height-lg="0"
11018 + data-text-image-rowcontainer-width-lg="0"
11019 + data-text-image-rowcontainer-class-lg=""
11020 +
11021 + data-text-image-rowcontainer-bg-type-md=""
11022 +
11023 +
11024 +
11025 +
11026 +
11027 + data-text-image-rowcontainer-height-md="0"
11028 + data-text-image-rowcontainer-width-md="0"
11029 + data-text-image-rowcontainer-class-md=""
11030 +
11031 + data-text-image-rowcontainer-bg-type-sm=""
11032 +
11033 +
11034 +
11035 +
11036 +
11037 + data-text-image-rowcontainer-height-sm="0"
11038 + data-text-image-rowcontainer-width-sm="0"
11039 + data-text-image-rowcontainer-class-sm=""
11040 +
11041 + data-text-image-rowcontainer-bg-type-xs=""
11042 +
11043 +
11044 +
11045 +
11046 +
11047 + data-text-image-rowcontainer-height-xs="0"
11048 + data-text-image-rowcontainer-width-xs="0"
11049 + data-text-image-rowcontainer-class-xs="">
11050 +
11051 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/loan.html" target="_self" hrefnoextension="false">Mortgage loan</a><br>
11052 +</p>
11053 +<p style="text-align: center;">Get financing for your project.<br>
11054 +</p>
11055 +</div>
11056 + </div>
11057 +
11058 +
11059 +
11060 +
11061 +
11062 +
11063 +
11064 +
11065 +
11066 +
11067 +
11068 + <script>
11069 +
11070 + (function(){
11071 +
11072 + var dataLayerViewEventName = '' || '';
11073 + var dataLayerViewLayerProperties = [];
11074 + var $el;
11075 +
11076 +
11077 +
11078 + if(dataLayerViewEventName.trim().length) {
11079 +
11080 + var obj = {
11081 + dataLayerViewEventName: dataLayerViewEventName,
11082 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys1_panelcontainer_parsys_textandimage" ,
11083 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
11084 + };
11085 +
11086 + // IE11 trick (because IE11 don't know document.currentScript):
11087 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
11088 + if(document.currentScript){
11089 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
11090 + } else {
11091 + var scripts = document.getElementsByTagName( 'script' );
11092 + var currentScript = scripts[scripts.length - 1];
11093 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
11094 + }
11095 +
11096 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
11097 + Websites.DataLayer.cleanViewEventJSON(obj)));
11098 + $el.setAttribute("data-dataLayerViewEvent", 'true');
11099 +
11100 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
11101 +
11102 + }
11103 +
11104 + })();
11105 +
11106 + </script>
11107 +
11108 +</div>
11109 +
11110 + <script>
11111 +
11112 + /**
11113 + * clickEventDownloadHandler()
11114 + * Is used to handle download image action selected as an opening mode
11115 + *
11116 + */
11117 +
11118 + var firstDownload = true;
11119 +
11120 + function clickEventDownloadHandler() {
11121 +
11122 + var link = this;
11123 + var filename = link.dataset.linkpath;
11124 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
11125 + var fn = filename.substring(filename.lastIndexOf('/')+1);
11126 +
11127 + if (newFile) {
11128 +
11129 + if (firstDownload) {
11130 + firstDownload = false;
11131 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
11132 + } else {
11133 + this.href = link.href;
11134 + }
11135 +
11136 + this.download = fn;
11137 +
11138 + } else {
11139 + this.download = fn + ".html";
11140 + }
11141 + }
11142 +
11143 + </script></div>
11144 +
11145 +</div>
11146 +
11147 +</div>
11148 +
11149 +
11150 +
11151 +<!--/* Initialize Js */-->
11152 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys1/panelcontainer">
11153 + if(""){
11154 + new Websites.Sticky({
11155 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys1/panelcontainer",
11156 + breakpoint: {
11157 + lg: {
11158 + to: "none"
11159 + },
11160 + md: {
11161 + to: "none"
11162 + },
11163 + sm: {
11164 + to: "none",
11165 + },
11166 + xs: {
11167 + to: "none"
11168 + }
11169 + }
11170 + });
11171 + }
11172 +</script>
11173 +
11174 +</div>
11175 +</div>
11176 +
11177 +</div>
11178 +
11179 + </div>
11180 +
11181 + <div class="col-xs-12 col-sm-4 column separatorFilet">
11182 + <div class="parsys2 parsys"><div class="panelContainer section">
11183 +
11184 +
11185 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
11186 +
11187 +
11188 +
11189 + <div>
11190 +
11191 +
11192 +
11193 +
11194 +
11195 +
11196 +
11197 +
11198 +
11199 +
11200 +
11201 +
11202 +
11203 +
11204 +
11205 +
11206 +
11207 +
11208 +
11209 +
11210 +
11211 +
11212 +
11213 +<div class="panelContainer "
11214 +
11215 +
11216 + data-websites-component="/components/panelContainer.v1"
11217 + data-panel-container-lg-mg=""
11218 + data-panel-container-lg-pd="30px 20px 20px 20px"
11219 + data-panel-container-lg-ht=""
11220 + data-panel-container-md-mg=""
11221 + data-panel-container-md-pd="30px 20px 20px 20px"
11222 + data-panel-container-md-ht=""
11223 + data-panel-container-sm-mg=""
11224 + data-panel-container-sm-pd="30px 20px 20px 20px"
11225 + data-panel-container-sm-ht=""
11226 + data-panel-container-xs-mg=""
11227 + data-panel-container-xs-pd="30px 20px 20px 20px"
11228 + data-panel-container-xs-ht=""
11229 + data-panel-container-limit="">
11230 + <div class="parsys"><div class="textandimage parbase section">
11231 +
11232 +
11233 +
11234 +
11235 +
11236 +
11237 +
11238 +
11239 +
11240 +
11241 +
11242 +
11243 +
11244 +
11245 +
11246 + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys2_panelcontainer_copy_parsys_textandimage" class="text-image-container "
11247 + data-text-image-container-right-left="false">
11248 +
11249 +
11250 +
11251 +
11252 +
11253 +
11254 +
11255 +
11256 +
11257 + <div class="row text-image-row"
11258 + data-websites-component="/components/textandimage/rowcontainer"
11259 +
11260 + data-text-image-rowcontainer-bg-type-lg=""
11261 +
11262 +
11263 +
11264 +
11265 +
11266 + data-text-image-rowcontainer-height-lg="0"
11267 + data-text-image-rowcontainer-width-lg="0"
11268 + data-text-image-rowcontainer-class-lg=""
11269 +
11270 + data-text-image-rowcontainer-bg-type-md=""
11271 +
11272 +
11273 +
11274 +
11275 +
11276 + data-text-image-rowcontainer-height-md="0"
11277 + data-text-image-rowcontainer-width-md="0"
11278 + data-text-image-rowcontainer-class-md=""
11279 +
11280 + data-text-image-rowcontainer-bg-type-sm=""
11281 +
11282 +
11283 +
11284 +
11285 +
11286 + data-text-image-rowcontainer-height-sm="0"
11287 + data-text-image-rowcontainer-width-sm="0"
11288 + data-text-image-rowcontainer-class-sm=""
11289 +
11290 + data-text-image-rowcontainer-bg-type-xs=""
11291 +
11292 +
11293 +
11294 +
11295 +
11296 + data-text-image-rowcontainer-height-xs="0"
11297 + data-text-image-rowcontainer-width-xs="0"
11298 + data-text-image-rowcontainer-class-xs="">
11299 +
11300 + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/all-in-one.html" target="_self" hrefnoextension="false">Home equity line of credit</a><br>
11301 +</p>
11302 +<p style="text-align: center;">Use the repaid amount of your mortgage to realize new projects.<br>
11303 +</p>
11304 +</div>
11305 + </div>
11306 +
11307 +
11308 +
11309 +
11310 +
11311 +
11312 +
11313 +
11314 +
11315 +
11316 +
11317 + <script>
11318 +
11319 + (function(){
11320 +
11321 + var dataLayerViewEventName = '' || '';
11322 + var dataLayerViewLayerProperties = [];
11323 + var $el;
11324 +
11325 +
11326 +
11327 + if(dataLayerViewEventName.trim().length) {
11328 +
11329 + var obj = {
11330 + dataLayerViewEventName: dataLayerViewEventName,
11331 + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys2_panelcontainer_copy_parsys_textandimage" ,
11332 + dataLayerViewLayerProperties: dataLayerViewLayerProperties
11333 + };
11334 +
11335 + // IE11 trick (because IE11 don't know document.currentScript):
11336 + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script
11337 + if(document.currentScript){
11338 + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
11339 + } else {
11340 + var scripts = document.getElementsByTagName( 'script' );
11341 + var currentScript = scripts[scripts.length - 1];
11342 + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0];
11343 + }
11344 +
11345 + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify(
11346 + Websites.DataLayer.cleanViewEventJSON(obj)));
11347 + $el.setAttribute("data-dataLayerViewEvent", 'true');
11348 +
11349 + Websites.DataLayer.updateDataLayerViewEventElementsArray();
11350 +
11351 + }
11352 +
11353 + })();
11354 +
11355 + </script>
11356 +
11357 +</div>
11358 +
11359 + <script>
11360 +
11361 + /**
11362 + * clickEventDownloadHandler()
11363 + * Is used to handle download image action selected as an opening mode
11364 + *
11365 + */
11366 +
11367 + var firstDownload = true;
11368 +
11369 + function clickEventDownloadHandler() {
11370 +
11371 + var link = this;
11372 + var filename = link.dataset.linkpath;
11373 + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
11374 + var fn = filename.substring(filename.lastIndexOf('/')+1);
11375 +
11376 + if (newFile) {
11377 +
11378 + if (firstDownload) {
11379 + firstDownload = false;
11380 + this.href = link.href.slice(0, link.href.lastIndexOf('.'));
11381 + } else {
11382 + this.href = link.href;
11383 + }
11384 +
11385 + this.download = fn;
11386 +
11387 + } else {
11388 + this.download = fn + ".html";
11389 + }
11390 + }
11391 +
11392 + </script></div>
11393 +
11394 +</div>
11395 +
11396 +</div>
11397 +
11398 +
11399 +
11400 +<!--/* Initialize Js */-->
11401 +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys2/panelcontainer_copy">
11402 + if(""){
11403 + new Websites.Sticky({
11404 + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys2/panelcontainer_copy",
11405 + breakpoint: {
11406 + lg: {
11407 + to: "none"
11408 + },
11409 + md: {
11410 + to: "none"
11411 + },
11412 + sm: {
11413 + to: "none",
11414 + },
11415 + xs: {
11416 + to: "none"
11417 + }
11418 + }
11419 + });
11420 + }
11421 +</script>
11422 +
11423 +</div>
11424 +</div>
11425 +
11426 +</div>
11427 +
11428 + </div>
11429 +
11430 + <div class="col-xs-12 col-sm-4 column col-last ">
11431 + <div class="parsys3 parsys"><div class="panelContainer section">
11432 +
11433 +
11434 +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div>
11435 +
11436 +
11437 +
11438 + <div>
11439 +
11440 +
11441 +
11442 +
11443 +
11444 +
11445 +
11446 +
11447 +
11448 +
11449 +

Diff truncated — file too large.