{"id":297775,"date":"2026-04-14T12:20:04","date_gmt":"2026-04-14T16:20:04","guid":{"rendered":"https:\/\/borhanifar.com\/?page_id=297775"},"modified":"2026-07-18T18:30:28","modified_gmt":"2026-07-18T22:30:28","slug":"crs-calculator","status":"publish","type":"page","link":"https:\/\/borhanifar.com\/en\/immigrate-canada\/express-entry\/crs-calculator\/","title":{"rendered":"Express Entry CRS Calculator | Calculate Your PR Score"},"content":{"rendered":"<div class=\"et_d4_element et_pb_section et_pb_section_0  et_pb_css_mix_blend_mode et_section_regular et_block_section\" >\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_d4_element et_pb_row et_pb_row_0  et_pb_css_mix_blend_mode et_block_row\">\n\t\t\t\t<div class=\"et_d4_element et_pb_column_4_4 et_pb_column et_pb_column_0  et_pb_css_mix_blend_mode et-last-child et_block_column\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_with_border et_pb_module et_d4_element et_pb_heading et_pb_heading_0 et_pb_bg_layout_\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_heading_container\"><h1 class=\"et_pb_module_heading\">Canada Express Entry CRS Calculator: Calculate Your PR Score<\/h1><\/div>\n\t\t\t<\/div><div class=\"et_pb_module et_d4_element et_pb_text et_pb_text_0  et_pb_text_align_left et_pb_bg_layout_light\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_text_inner\"><h2 style=\"text-align: left; direction: ltr;\"><span class=\"ez-toc-section\" id=\"canada-express-entry-score-%e2%80%93-crs-calculator\"><\/span>Canada Express Entry Score \u2013 CRS Calculator<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p style=\"text-align: left; direction: ltr;\">Use our CRS calculator to estimate your <a title=\"Canada Express Entry Guide\" href=\"https:\/\/borhanifar.com\/en\/immigrate-canada\/express-entry\/\" target=\"_blank\" rel=\"noopener\">Canada Express Entry <\/a>score based on the Comprehensive Ranking System (CRS) in less than 30 seconds, using the latest IRCC updates.<\/p>\n<p style=\"text-align: left; direction: ltr;\">Factors such as age, education, work experience, and language test results in English or French all impact your final score.<\/p>\n<p style=\"text-align: left; direction: ltr;\">Your results will help you assess your chances of receiving an Invitation to Apply (ITA) for permanent residence and plan effective strategies to improve your score.<\/p><\/div>\n\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t<\/div><div class=\"et_d4_element et_pb_row et_pb_row_1  et_pb_css_mix_blend_mode et_block_row\">\n\t\t\t\t<div class=\"et_d4_element et_pb_column_4_4 et_pb_column et_pb_column_1  et_pb_css_mix_blend_mode et-last-child et_block_column\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_module et_d4_element et_pb_code et_pb_code_0\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_code_inner\"><div id=\"borhanifar-crs\" class=\"bf-crs\" dir=\"ltr\" lang=\"en\">\n\n  <div class=\"bf-crs__header\">\n    <div>\n      <div class=\"bf-crs__brand\">Borhanifar Immigration<\/div>\n\n      <div class=\"bf-crs__title\">\n        CRS Score Calculator \u2013 Express Entry\n      <\/div>\n\n      <div class=\"bf-crs__note\">\n        Please enter your information carefully for a more accurate CRS score estimate.\n      <\/div>\n    <\/div>\n\n    <div class=\"bf-crs__scorebox\">\n      <div class=\"bf-crs__scorelabel\">Estimated CRS Score<\/div>\n\n      <div id=\"bfScore\" class=\"bf-crs__score\">0<\/div>\n\n      <div id=\"bfScoreHint\" class=\"bf-crs__scorehint\">\n        Select your details to calculate your score\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"bf-crs__grid\">\n\n    <!-- Form: 60% -->\n    <div class=\"bf-crs__card\">\n\n      <div class=\"bf-crs__cardtitle\">\n        A) Core \/ Human Capital Factors\n      <\/div>\n\n      <div class=\"bf-row\">\n        <label for=\"marital\">Marital status<\/label>\n\n        <select id=\"marital\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"single\">Single<\/option>\n<option value=\"married_accompanying\">\n            Married or common-law \u2014 spouse accompanying\n          <\/option>\n<option value=\"married_not_accompanying\">\n            Married or common-law \u2014 spouse not accompanying\n          <\/option>\n<option value=\"divorced\">Divorced<\/option>\n<option value=\"separated\">Legally separated<\/option>\n<option value=\"widowed\">Widowed<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"bf-row\">\n        <label for=\"age\">Age<\/label>\n\n        <input\n          id=\"age\"\n          type=\"number\"\n          min=\"16\"\n          max=\"60\"\n          step=\"1\"\n          inputmode=\"numeric\"\n          placeholder=\"e.g. 30\"\n        \/>\n      <\/div>\n\n      <div class=\"bf-row\">\n        <label for=\"edu\">Education \u2014 principal applicant<\/label>\n\n        <select id=\"edu\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"less_than_secondary\">\n            Less than secondary school\n          <\/option>\n<option value=\"secondary\">\n            Secondary school diploma\n          <\/option>\n<option value=\"one_year\">\n            One-year post-secondary degree, diploma or certificate\n          <\/option>\n<option value=\"two_year\">\n            Two-year post-secondary program\n          <\/option>\n<option value=\"bachelor_or_3plus\">\n            Bachelor\u2019s degree or program of three years or longer\n          <\/option>\n<option value=\"two_or_more\">\n            Two or more credentials \u2014 one must be three years or longer\n          <\/option>\n<option value=\"masters_or_professional\">\n            Master\u2019s degree or eligible professional degree\n          <\/option>\n<option value=\"phd\">\n            Doctoral degree \u2014 PhD\n          <\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"bf-row\">\n        <label for=\"cwe\">Canadian work experience<\/label>\n\n        <select id=\"cwe\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"0\">None or less than one year<\/option>\n<option value=\"1\">One year<\/option>\n<option value=\"2\">Two years<\/option>\n<option value=\"3\">Three years<\/option>\n<option value=\"4\">Four years<\/option>\n<option value=\"5\">Five years or more<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"bf-row\">\n        <label for=\"fwe\">Foreign work experience<\/label>\n\n        <select id=\"fwe\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"0\">None or less than one year<\/option>\n<option value=\"1\">One year<\/option>\n<option value=\"2\">Two years<\/option>\n<option value=\"3\">Three years or more<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"bf-row bf-row--inline\">\n        <label for=\"tradeCert\">\n          Do you have a Canadian certificate of qualification in a trade?\n        <\/label>\n\n        <input id=\"tradeCert\" type=\"checkbox\" \/>\n      <\/div>\n\n      <hr class=\"bf-hr\" \/>\n\n      <div class=\"bf-crs__cardtitle\">\n        First official language\n      <\/div>\n\n      <div class=\"bf-row\">\n        <label for=\"lang1Test\">Language test<\/label>\n\n        <select id=\"lang1Test\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"ielts\">\n            IELTS General Training \u2014 English\n          <\/option>\n<option value=\"celpip\">\n            CELPIP-General \u2014 English\n          <\/option>\n<option value=\"pte\">\n            PTE Core \u2014 English\n          <\/option>\n<option value=\"tef\">\n            TEF Canada \u2014 French\n          <\/option>\n<option value=\"tcf\">\n            TCF Canada \u2014 French\n          <\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"bf-langgrid\">\n        <div>\n          <label for=\"lang1R\">Reading<\/label>\n          <input id=\"lang1R\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n        <\/div>\n\n        <div>\n          <label for=\"lang1W\">Writing<\/label>\n          <input id=\"lang1W\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n        <\/div>\n\n        <div>\n          <label for=\"lang1L\">Listening<\/label>\n          <input id=\"lang1L\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n        <\/div>\n\n        <div>\n          <label for=\"lang1S\">Speaking<\/label>\n          <input id=\"lang1S\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n        <\/div>\n      <\/div>\n\n      <div id=\"tefDateWrap\" class=\"bf-row\" hidden>\n        <label for=\"tefAfter\">TEF test date<\/label>\n\n        <select id=\"tefAfter\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"after\">\n            After December 10, 2023\n          <\/option>\n<option value=\"before\">\n            Between October 1, 2019 and December 10, 2023\n          <\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"bf-row bf-row--inline\">\n        <label for=\"hasLang2\">\n          Do you have results in the second official language?\n        <\/label>\n\n        <input id=\"hasLang2\" type=\"checkbox\" \/>\n      <\/div>\n\n      <div id=\"lang2Wrap\" hidden>\n\n        <div class=\"bf-crs__subsection\">\n          <div class=\"bf-crs__cardtitle\">\n            Second official language\n          <\/div>\n\n          <div class=\"bf-row\">\n            <label for=\"lang2Test\">Language test<\/label>\n\n            <select id=\"lang2Test\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"ielts\">\n                IELTS General Training \u2014 English\n              <\/option>\n<option value=\"celpip\">\n                CELPIP-General \u2014 English\n              <\/option>\n<option value=\"pte\">\n                PTE Core \u2014 English\n              <\/option>\n<option value=\"tef\">\n                TEF Canada \u2014 French\n              <\/option>\n<option value=\"tcf\">\n                TCF Canada \u2014 French\n              <\/option>\n            <\/select>\n          <\/div>\n\n          <div class=\"bf-langgrid\">\n            <div>\n              <label for=\"lang2R\">Reading<\/label>\n              <input id=\"lang2R\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n            <\/div>\n\n            <div>\n              <label for=\"lang2W\">Writing<\/label>\n              <input id=\"lang2W\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n            <\/div>\n\n            <div>\n              <label for=\"lang2L\">Listening<\/label>\n              <input id=\"lang2L\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n            <\/div>\n\n            <div>\n              <label for=\"lang2S\">Speaking<\/label>\n              <input id=\"lang2S\" type=\"number\" step=\"0.5\" placeholder=\"Score\" \/>\n            <\/div>\n          <\/div>\n\n          <div id=\"tefDateWrap2\" class=\"bf-row\" hidden>\n            <label for=\"tefAfter2\">TEF test date<\/label>\n\n            <select id=\"tefAfter2\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"after\">\n                After December 10, 2023\n              <\/option>\n<option value=\"before\">\n                Between October 1, 2019 and December 10, 2023\n              <\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div id=\"spouseWrap\" hidden>\n\n        <hr class=\"bf-hr\" \/>\n\n        <div class=\"bf-crs__cardtitle\">\n          B) Spouse or Common-Law Partner Factors\n        <\/div>\n\n        <div class=\"bf-row\">\n          <label for=\"spEdu\">Spouse\u2019s education<\/label>\n\n          <select id=\"spEdu\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"less_than_secondary\">\n              Less than secondary school\n            <\/option>\n<option value=\"secondary\">\n              Secondary school diploma\n            <\/option>\n<option value=\"one_year\">\n              One-year post-secondary program\n            <\/option>\n<option value=\"two_year\">\n              Two-year post-secondary program\n            <\/option>\n<option value=\"bachelor_or_3plus\">\n              Bachelor\u2019s degree or program of three years or longer\n            <\/option>\n<option value=\"two_or_more\">\n              Two or more credentials \u2014 one must be three years or longer\n            <\/option>\n<option value=\"masters_or_professional\">\n              Master\u2019s degree or eligible professional degree\n            <\/option>\n<option value=\"phd\">\n              Doctoral degree \u2014 PhD\n            <\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"bf-row\">\n          <label for=\"spCwe\">Spouse\u2019s Canadian work experience<\/label>\n\n          <select id=\"spCwe\">\n<option value=\"\" selected>Select<\/option>\n<option value=\"0\">None or less than one year<\/option>\n<option value=\"1\">One year<\/option>\n<option value=\"2\">Two years<\/option>\n<option value=\"3\">Three years<\/option>\n<option value=\"4\">Four years<\/option>\n<option value=\"5\">Five years or more<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"bf-row\">\n          <label>\n            Spouse\u2019s first official language \u2014 CLB\/NCLC level\n          <\/label>\n\n          <div class=\"bf-crs__hint\">\n            Enter the CLB or NCLC level from 0 to 10 for each ability.\n          <\/div>\n\n          <div class=\"bf-langgrid\">\n            <div>\n              <label for=\"spR\">Reading<\/label>\n              <input id=\"spR\" type=\"number\" min=\"0\" max=\"10\" step=\"1\" placeholder=\"0\u201310\" \/>\n            <\/div>\n\n            <div>\n              <label for=\"spW\">Writing<\/label>\n              <input id=\"spW\" type=\"number\" min=\"0\" max=\"10\" step=\"1\" placeholder=\"0\u201310\" \/>\n            <\/div>\n\n            <div>\n              <label for=\"spL\">Listening<\/label>\n              <input id=\"spL\" type=\"number\" min=\"0\" max=\"10\" step=\"1\" placeholder=\"0\u201310\" \/>\n            <\/div>\n\n            <div>\n              <label for=\"spS\">Speaking<\/label>\n              <input id=\"spS\" type=\"number\" min=\"0\" max=\"10\" step=\"1\" placeholder=\"0\u201310\" \/>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <hr class=\"bf-hr\" \/>\n\n      <div class=\"bf-crs__cardtitle\">\n        D) Additional Points\n      <\/div>\n\n      <div class=\"bf-row bf-row--inline\">\n        <label for=\"sib\">\n          Do you have a brother or sister in Canada who is at least 18 years\n          old and is a Canadian citizen or permanent resident?\n        <\/label>\n\n        <input id=\"sib\" type=\"checkbox\" \/>\n      <\/div>\n\n      <div class=\"bf-row\">\n        <label for=\"canEdu\">\n          Canadian education credential\n        <\/label>\n\n        <select id=\"canEdu\">\n<option value=\"\" selected>Select<\/option>\n\n<option value=\"none\">\n            None \u2014 0 points\n          <\/option>\n\n<option value=\"secondary_or_less\">\n            Secondary school or less \u2014 0 points\n          <\/option>\n\n<option value=\"one_two_year\">\n            One- or two-year diploma or certificate \u2014 15 points\n          <\/option>\n\n<option value=\"three_plus\">\n            Degree, diploma or certificate of three years or longer, or an\n            eligible Master\u2019s, professional or doctoral degree of at least\n            one academic year \u2014 30 points\n          <\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"bf-row bf-row--inline\">\n        <label for=\"pnp\">\n          Do you have a provincial or territorial nomination?\n        <\/label>\n\n        <input id=\"pnp\" type=\"checkbox\" \/>\n      <\/div>\n    <\/div>\n\n    <!-- Result: 40% -->\n    <div class=\"bf-crs__card bf-result-card\">\n\n      <div class=\"bf-crs__cardtitle\">\n        Your Assessment Result\n      <\/div>\n\n      <div id=\"bfBreakdown\" class=\"bf-breakdown\">\n        <div class=\"bf-crs__hint\">\n          Complete the required fields to view your CRS assessment.\n        <\/div>\n      <\/div>\n\n      <hr class=\"bf-hr\" \/>\n\n      <div class=\"bf-crs__cardtitle\">\n        Send Your Assessment by WhatsApp\n      <\/div>\n\n      <p class=\"bf-whatsapp-text\">\n        Your CRS score, point breakdown and entered information will be\n        prepared in a WhatsApp message to Borhanifar Immigration.\n      \n\n      <div class=\"bf-actions\">\n        <button id=\"btnWhatsApp\" class=\"bf-whatsapp-button\" type=\"button\">\n          Send Full Assessment via WhatsApp\n        <\/button>\n\n        <span id=\"whatsappMsg\" class=\"bf-msg\" aria-live=\"polite\"><\/span>\n      <\/div>\n\n      <div class=\"bf-crs__hint bf-disclaimer\">\n        This calculator provides a preliminary estimate only. It does not\n        determine eligibility for an Express Entry program and does not\n        replace a professional immigration assessment.\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  #borhanifar-crs,\n  #borhanifar-crs * {\n    box-sizing: border-box;\n    font-size: 14px;\n  }\n\n  #borhanifar-crs {\n    max-width: 1100px;\n    margin: 0 auto;\n    direction: ltr;\n    text-align: left;\n    color: #1f2933;\n  }\n\n  #borhanifar-crs [hidden] {\n    display: none !important;\n  }\n\n  #borhanifar-crs input[type=\"checkbox\"] {\n    width: 19px !important;\n    height: 19px !important;\n    min-width: 19px;\n    margin: 0;\n    padding: 0;\n    cursor: pointer;\n    accent-color: #224462;\n  }\n\n  #borhanifar-crs input:not([type=\"checkbox\"]),\n  #borhanifar-crs select,\n  #borhanifar-crs textarea {\n    display: block;\n    width: 100%;\n    min-height: 43px;\n    padding: 10px 12px;\n    border: 1px solid #cfd7df;\n    border-radius: 8px;\n    background: #fff;\n    color: #1f2933;\n    line-height: 1.4;\n    outline: none;\n  }\n\n  #borhanifar-crs input:focus,\n  #borhanifar-crs select:focus,\n  #borhanifar-crs textarea:focus {\n    border-color: #224462;\n    box-shadow: 0 0 0 3px rgba(34, 68, 98, 0.12);\n  }\n\n  .bf-crs__header {\n    display: flex;\n    justify-content: space-between;\n    align-items: flex-start;\n    gap: 24px;\n    margin-bottom: 18px;\n  }\n\n  .bf-crs__brand {\n    margin-bottom: 5px;\n    color: #224462;\n    font-weight: 700;\n  }\n\n  .bf-crs__title {\n    font-size: 22px !important;\n    font-weight: 800;\n    line-height: 1.35;\n  }\n\n  .bf-crs__note {\n    max-width: 660px;\n    margin-top: 7px;\n    color: #52616f;\n    line-height: 1.65;\n  }\n\n  .bf-crs__scorebox {\n    min-width: 205px;\n    padding: 14px 16px;\n    border: 1px solid #d4dce3;\n    border-radius: 12px;\n    background: #f8fafc;\n    text-align: center;\n  }\n\n  .bf-crs__scorelabel {\n    color: #52616f;\n    font-weight: 600;\n  }\n\n  .bf-crs__score {\n    margin: 4px 0;\n    color: #224462;\n    font-size: 34px !important;\n    font-weight: 900;\n    line-height: 1.2;\n  }\n\n  .bf-crs__scorehint {\n    color: #697885;\n    font-size: 12px !important;\n    line-height: 1.45;\n  }\n\n  .bf-crs__grid {\n    display: grid;\n    grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);\n    align-items: start;\n    gap: 18px;\n  }\n\n  .bf-crs__card {\n    min-width: 0;\n    padding: 20px;\n    border: 1px solid #d4dce3;\n    border-radius: 12px;\n    background: #fff;\n  }\n\n  .bf-result-card {\n    position: sticky;\n    top: 20px;\n  }\n\n  .bf-crs__cardtitle {\n    margin: 0 0 14px;\n    color: #224462;\n    font-size: 16px !important;\n    font-weight: 800;\n    line-height: 1.45;\n  }\n\n  .bf-crs__subsection {\n    padding: 16px;\n    border: 1px solid #e2e7ec;\n    border-radius: 9px;\n    background: #f9fbfc;\n  }\n\n  .bf-row {\n    display: flex;\n    flex-direction: column;\n    gap: 7px;\n    margin-bottom: 14px;\n  }\n\n  .bf-row label {\n    color: #283642;\n    font-weight: 600;\n    line-height: 1.55;\n  }\n\n  .bf-row--inline {\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n    gap: 18px;\n    padding: 11px 12px;\n    border: 1px solid #e0e6eb;\n    border-radius: 8px;\n    background: #fafbfc;\n  }\n\n  .bf-row--inline label {\n    flex: 1;\n    margin: 0;\n  }\n\n  .bf-langgrid {\n    display: grid;\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n    gap: 10px;\n    margin-bottom: 14px;\n  }\n\n  .bf-langgrid > div {\n    min-width: 0;\n  }\n\n  .bf-langgrid label {\n    display: block;\n    margin-bottom: 6px;\n    color: #283642;\n    font-weight: 600;\n  }\n\n  .bf-hr {\n    height: 1px;\n    margin: 23px 0;\n    border: 0;\n    background: #e2e7ec;\n  }\n\n  .bf-breakdown {\n    line-height: 1.65;\n  }\n\n  .bf-breakdown h4 {\n    margin: 18px 0 6px;\n    color: #224462;\n    font-size: 14px !important;\n    font-weight: 800;\n  }\n\n  .bf-breakdown h4:first-child {\n    margin-top: 0;\n  }\n\n  .bf-breakdown .row {\n    display: flex;\n    justify-content: space-between;\n    align-items: flex-start;\n    gap: 14px;\n    padding: 8px 0;\n    border-bottom: 1px dashed #d8dfe5;\n  }\n\n  .bf-breakdown .row > div:first-child {\n    flex: 1;\n  }\n\n  .bf-breakdown .row > div:last-child {\n    min-width: 34px;\n    text-align: right;\n    font-weight: 700;\n  }\n\n  .bf-breakdown .bf-total-row {\n    margin-top: 9px;\n    padding: 11px 10px;\n    border: 0;\n    border-radius: 7px;\n    background: #eef3f7;\n    color: #17354e;\n  }\n\n  .bf-actions {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n  }\n\n  #borhanifar-crs .bf-whatsapp-button {\n    width: 100%;\n    min-height: 47px;\n    padding: 12px 18px;\n    border: 0;\n    border-radius: 8px;\n    background: #224462;\n    color: #fff;\n    font-weight: 700;\n    line-height: 1.4;\n    cursor: pointer;\n    transition: opacity 0.2s ease, transform 0.2s ease;\n  }\n\n  #borhanifar-crs .bf-whatsapp-button:hover {\n    opacity: 0.92;\n    transform: translateY(-1px);\n  }\n\n  #borhanifar-crs .bf-whatsapp-button:focus {\n    outline: 3px solid rgba(34, 68, 98, 0.22);\n    outline-offset: 2px;\n  }\n\n  .bf-whatsapp-text {\n    margin: 0 0 14px;\n    color: #52616f;\n    line-height: 1.7;\n  }\n\n  .bf-crs__hint {\n    color: #667684;\n    font-size: 12px !important;\n    line-height: 1.65;\n  }\n\n  .bf-disclaimer {\n    margin-top: 17px;\n    padding-top: 14px;\n    border-top: 1px solid #e2e7ec;\n  }\n\n  .bf-msg {\n    display: block;\n    margin-top: 8px;\n    color: #9a3412;\n    font-size: 12px !important;\n    line-height: 1.5;\n  }\n\n  @media (max-width: 920px) {\n    .bf-crs__header {\n      flex-direction: column;\n    }\n\n    .bf-crs__scorebox {\n      width: 100%;\n    }\n\n    .bf-crs__grid {\n      grid-template-columns: 1fr;\n    }\n\n    .bf-result-card {\n      position: static;\n    }\n  }\n\n  @media (max-width: 640px) {\n    .bf-crs__card {\n      padding: 15px;\n    }\n\n    .bf-langgrid {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n    .bf-row--inline {\n      align-items: flex-start;\n    }\n  }\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  const ROOT = document.getElementById(\"borhanifar-crs\");\n\n  if (!ROOT) {\n    return;\n  }\n\n  const WHATSAPP_NUMBER = \"16474500450\";\n  const ABILITIES = [\"reading\", \"writing\", \"listening\", \"speaking\"];\n\n  const $ = function (id) {\n    return ROOT.querySelector(\"#\" + id);\n  };\n\n  const AGE_WITH_SPOUSE = {\n    18: 90,\n    19: 95,\n    30: 95,\n    31: 90,\n    32: 85,\n    33: 80,\n    34: 75,\n    35: 70,\n    36: 65,\n    37: 60,\n    38: 55,\n    39: 50,\n    40: 45,\n    41: 35,\n    42: 25,\n    43: 15,\n    44: 5\n  };\n\n  const AGE_WITHOUT_SPOUSE = {\n    18: 99,\n    19: 105,\n    30: 105,\n    31: 99,\n    32: 94,\n    33: 88,\n    34: 83,\n    35: 77,\n    36: 72,\n    37: 66,\n    38: 61,\n    39: 55,\n    40: 50,\n    41: 39,\n    42: 28,\n    43: 17,\n    44: 6\n  };\n\n  const EDUCATION_WITH_SPOUSE = {\n    less_than_secondary: 0,\n    secondary: 28,\n    one_year: 84,\n    two_year: 91,\n    bachelor_or_3plus: 112,\n    two_or_more: 119,\n    masters_or_professional: 126,\n    phd: 140\n  };\n\n  const EDUCATION_WITHOUT_SPOUSE = {\n    less_than_secondary: 0,\n    secondary: 30,\n    one_year: 90,\n    two_year: 98,\n    bachelor_or_3plus: 120,\n    two_or_more: 128,\n    masters_or_professional: 135,\n    phd: 150\n  };\n\n  const CANADIAN_WORK_WITH_SPOUSE = {\n    0: 0,\n    1: 35,\n    2: 46,\n    3: 56,\n    4: 63,\n    5: 70\n  };\n\n  const CANADIAN_WORK_WITHOUT_SPOUSE = {\n    0: 0,\n    1: 40,\n    2: 53,\n    3: 64,\n    4: 72,\n    5: 80\n  };\n\n  const SPOUSE_EDUCATION = {\n    less_than_secondary: 0,\n    secondary: 2,\n    one_year: 6,\n    two_year: 7,\n    bachelor_or_3plus: 8,\n    two_or_more: 9,\n    masters_or_professional: 10,\n    phd: 10\n  };\n\n  const SPOUSE_CANADIAN_WORK = {\n    0: 0,\n    1: 5,\n    2: 7,\n    3: 8,\n    4: 9,\n    5: 10\n  };\n\n  const CANADIAN_EDUCATION_POINTS = {\n    \"\": 0,\n    none: 0,\n    secondary_or_less: 0,\n    one_two_year: 15,\n    three_plus: 30\n  };\n\n  const LABELS = {\n    marital: {\n      single: \"Single\",\n      married_accompanying: \"Married\/common-law \u2014 spouse accompanying\",\n      married_not_accompanying: \"Married\/common-law \u2014 spouse not accompanying\",\n      divorced: \"Divorced\",\n      separated: \"Legally separated\",\n      widowed: \"Widowed\"\n    },\n\n    education: {\n      less_than_secondary: \"Less than secondary school\",\n      secondary: \"Secondary school diploma\",\n      one_year: \"One-year post-secondary credential\",\n      two_year: \"Two-year post-secondary credential\",\n      bachelor_or_3plus: \"Bachelor\u2019s degree or program of three years or longer\",\n      two_or_more: \"Two or more credentials\",\n      masters_or_professional: \"Master\u2019s or eligible professional degree\",\n      phd: \"Doctoral degree\"\n    },\n\n    tests: {\n      ielts: \"IELTS General Training\",\n      celpip: \"CELPIP-General\",\n      pte: \"PTE Core\",\n      tef: \"TEF Canada\",\n      tcf: \"TCF Canada\"\n    },\n\n    canadianEducation: {\n      none: \"None\",\n      secondary_or_less: \"Secondary school or less\",\n      one_two_year: \"One- or two-year Canadian diploma or certificate\",\n      three_plus: \"Canadian credential of three years or longer \/ eligible graduate credential\"\n    }\n  };\n\n  function selectedText(selectElement) {\n    if (!selectElement || selectElement.selectedIndex < 0) {\n      return \"\";\n    }\n\n    return selectElement.options[selectElement.selectedIndex].text.trim();\n  }\n\n  function numericValue(element) {\n    if (!element || element.value === \"\") {\n      return 0;\n    }\n\n    const value = Number(element.value);\n\n    return Number.isFinite(value) ? value : 0;\n  }\n\n  function allAtLeast(levels, threshold) {\n    return ABILITIES.every(function (ability) {\n      return Number(levels[ability] || 0) >= threshold;\n    });\n  }\n\n  function allAtMost(levels, threshold) {\n    return ABILITIES.every(function (ability) {\n      return Number(levels[ability] || 0) <= threshold;\n    });\n  }\n\n  function agePoints(age, withSpouse) {\n    const numericAge = Number(age || 0);\n\n    if (numericAge <= 17 || numericAge >= 45) {\n      return 0;\n    }\n\n    if (numericAge >= 20 && numericAge <= 29) {\n      return withSpouse ? 100 : 110;\n    }\n\n    const table = withSpouse\n      ? AGE_WITH_SPOUSE\n      : AGE_WITHOUT_SPOUSE;\n\n    return table[numericAge] || 0;\n  }\n\n  function educationPoints(level, withSpouse) {\n    const table = withSpouse\n      ? EDUCATION_WITH_SPOUSE\n      : EDUCATION_WITHOUT_SPOUSE;\n\n    return table[level] || 0;\n  }\n\n  function canadianWorkPoints(years, withSpouse) {\n    const cappedYears = Math.max(\n      0,\n      Math.min(5, Number(years || 0))\n    );\n\n    const table = withSpouse\n      ? CANADIAN_WORK_WITH_SPOUSE\n      : CANADIAN_WORK_WITHOUT_SPOUSE;\n\n    return table[cappedYears] || 0;\n  }\n\n  function firstLanguagePointsPerAbility(level, withSpouse) {\n    const benchmark = Number(level || 0);\n\n    if (benchmark < 4) {\n      return 0;\n    }\n\n    if (benchmark === 4 || benchmark === 5) {\n      return 6;\n    }\n\n    if (benchmark === 6) {\n      return withSpouse ? 8 : 9;\n    }\n\n    if (benchmark === 7) {\n      return withSpouse ? 16 : 17;\n    }\n\n    if (benchmark === 8) {\n      return withSpouse ? 22 : 23;\n    }\n\n    if (benchmark === 9) {\n      return withSpouse ? 29 : 31;\n    }\n\n    return withSpouse ? 32 : 34;\n  }\n\n  function secondLanguagePointsPerAbility(level) {\n    const benchmark = Number(level || 0);\n\n    if (benchmark <= 4) {\n      return 0;\n    }\n\n    if (benchmark === 5 || benchmark === 6) {\n      return 1;\n    }\n\n    if (benchmark === 7 || benchmark === 8) {\n      return 3;\n    }\n\n    return 6;\n  }\n\n  function spouseLanguagePointsPerAbility(level) {\n    const benchmark = Number(level || 0);\n\n    if (benchmark <= 4) {\n      return 0;\n    }\n\n    if (benchmark === 5 || benchmark === 6) {\n      return 1;\n    }\n\n    if (benchmark === 7 || benchmark === 8) {\n      return 3;\n    }\n\n    return 5;\n  }\n\n  function clbFromIELTS(reading, writing, listening, speaking) {\n    function mapReading(score) {\n      if (score >= 8) return 10;\n      if (score >= 7) return 9;\n      if (score >= 6.5) return 8;\n      if (score >= 6) return 7;\n      if (score >= 5) return 6;\n      if (score >= 4) return 5;\n      if (score >= 3.5) return 4;\n      return 0;\n    }\n\n    function mapWriting(score) {\n      if (score >= 7.5) return 10;\n      if (score >= 7) return 9;\n      if (score >= 6.5) return 8;\n      if (score >= 6) return 7;\n      if (score >= 5.5) return 6;\n      if (score >= 5) return 5;\n      if (score >= 4) return 4;\n      return 0;\n    }\n\n    function mapListening(score) {\n      if (score >= 8.5) return 10;\n      if (score >= 8) return 9;\n      if (score >= 7.5) return 8;\n      if (score >= 6) return 7;\n      if (score >= 5.5) return 6;\n      if (score >= 5) return 5;\n      if (score >= 4.5) return 4;\n      return 0;\n    }\n\n    function mapSpeaking(score) {\n      if (score >= 7.5) return 10;\n      if (score >= 7) return 9;\n      if (score >= 6.5) return 8;\n      if (score >= 6) return 7;\n      if (score >= 5.5) return 6;\n      if (score >= 5) return 5;\n      if (score >= 4) return 4;\n      return 0;\n    }\n\n    return {\n      reading: mapReading(Number(reading)),\n      writing: mapWriting(Number(writing)),\n      listening: mapListening(Number(listening)),\n      speaking: mapSpeaking(Number(speaking))\n    };\n  }\n\n  function clbFromCELPIP(reading, writing, listening, speaking) {\n    function mapScore(score) {\n      const numericScore = Number(score);\n\n      if (numericScore < 4) {\n        return 0;\n      }\n\n      return Math.min(10, numericScore);\n    }\n\n    return {\n      reading: mapScore(reading),\n      writing: mapScore(writing),\n      listening: mapScore(listening),\n      speaking: mapScore(speaking)\n    };\n  }\n\n  function clbFromPTE(reading, writing, listening, speaking) {\n    function within(score, minimum, maximum) {\n      return score >= minimum && score <= maximum;\n    }\n\n    function mapReading(score) {\n      score = Number(score);\n\n      if (within(score, 88, 90)) return 10;\n      if (within(score, 78, 87)) return 9;\n      if (within(score, 69, 77)) return 8;\n      if (within(score, 60, 68)) return 7;\n      if (within(score, 51, 59)) return 6;\n      if (within(score, 42, 50)) return 5;\n      if (within(score, 33, 41)) return 4;\n      if (within(score, 24, 32)) return 3;\n      return 0;\n    }\n\n    function mapWriting(score) {\n      score = Number(score);\n\n      if (score >= 90) return 10;\n      if (within(score, 88, 89)) return 9;\n      if (within(score, 79, 87)) return 8;\n      if (within(score, 69, 78)) return 7;\n      if (within(score, 60, 68)) return 6;\n      if (within(score, 51, 59)) return 5;\n      if (within(score, 41, 50)) return 4;\n      if (within(score, 32, 40)) return 3;\n      return 0;\n    }\n\n    function mapListening(score) {\n      score = Number(score);\n\n      if (within(score, 89, 90)) return 10;\n      if (within(score, 82, 88)) return 9;\n      if (within(score, 71, 81)) return 8;\n      if (within(score, 60, 70)) return 7;\n      if (within(score, 50, 59)) return 6;\n      if (within(score, 39, 49)) return 5;\n      if (within(score, 28, 38)) return 4;\n      if (within(score, 18, 27)) return 3;\n      return 0;\n    }\n\n    function mapSpeaking(score) {\n      score = Number(score);\n\n      if (within(score, 89, 90)) return 10;\n      if (within(score, 84, 88)) return 9;\n      if (within(score, 76, 83)) return 8;\n      if (within(score, 68, 75)) return 7;\n      if (within(score, 59, 67)) return 6;\n      if (within(score, 51, 58)) return 5;\n      if (within(score, 42, 50)) return 4;\n      if (within(score, 34, 41)) return 3;\n      return 0;\n    }\n\n    return {\n      reading: mapReading(reading),\n      writing: mapWriting(writing),\n      listening: mapListening(listening),\n      speaking: mapSpeaking(speaking)\n    };\n  }\n\n  function nclcFromTEF(reading, writing, listening, speaking, afterDecember2023) {\n    function mapNewReading(score) {\n      score = Number(score);\n\n      if (score >= 546 && score <= 699) return 10;\n      if (score >= 503 && score <= 545) return 9;\n      if (score >= 462 && score <= 502) return 8;\n      if (score >= 434 && score <= 461) return 7;\n      if (score >= 393 && score <= 433) return 6;\n      if (score >= 352 && score <= 392) return 5;\n      if (score >= 306 && score <= 351) return 4;\n      return 0;\n    }\n\n    function mapNewWriting(score) {\n      score = Number(score);\n\n      if (score >= 558 && score <= 699) return 10;\n      if (score >= 512 && score <= 557) return 9;\n      if (score >= 472 && score <= 511) return 8;\n      if (score >= 428 && score <= 471) return 7;\n      if (score >= 379 && score <= 427) return 6;\n      if (score >= 330 && score <= 378) return 5;\n      if (score >= 268 && score <= 329) return 4;\n      return 0;\n    }\n\n    function mapNewSpeaking(score) {\n      score = Number(score);\n\n      if (score >= 556 && score <= 699) return 10;\n      if (score >= 518 && score <= 555) return 9;\n      if (score >= 494 && score <= 517) return 8;\n      if (score >= 456 && score <= 493) return 7;\n      if (score >= 422 && score <= 455) return 6;\n      if (score >= 387 && score <= 421) return 5;\n      if (score >= 328 && score <= 386) return 4;\n      return 0;\n    }\n\n    function mapOld(score) {\n      score = Number(score);\n\n      if (score >= 566 && score <= 699) return 10;\n      if (score >= 533 && score <= 565) return 9;\n      if (score >= 500 && score <= 532) return 8;\n      if (score >= 450 && score <= 499) return 7;\n      if (score >= 400 && score <= 449) return 6;\n      if (score >= 350 && score <= 399) return 5;\n      if (score >= 300 && score <= 349) return 4;\n      return 0;\n    }\n\n    if (afterDecember2023) {\n      return {\n        reading: mapNewReading(reading),\n        writing: mapNewWriting(writing),\n        listening: mapNewReading(listening),\n        speaking: mapNewSpeaking(speaking)\n      };\n    }\n\n    return {\n      reading: mapOld(reading),\n      writing: mapOld(writing),\n      listening: mapOld(listening),\n      speaking: mapOld(speaking)\n    };\n  }\n\n  function nclcFromTCF(reading, writing, listening, speaking) {\n    function mapReading(score) {\n      score = Number(score);\n\n      if (score >= 549 && score <= 699) return 10;\n      if (score >= 524 && score <= 548) return 9;\n      if (score >= 499 && score <= 523) return 8;\n      if (score >= 453 && score <= 498) return 7;\n      if (score >= 406 && score <= 452) return 6;\n      if (score >= 375 && score <= 405) return 5;\n      if (score >= 342 && score <= 374) return 4;\n      return 0;\n    }\n\n    function mapListening(score) {\n      score = Number(score);\n\n      if (score >= 549 && score <= 699) return 10;\n      if (score >= 523 && score <= 548) return 9;\n      if (score >= 503 && score <= 522) return 8;\n      if (score >= 458 && score <= 502) return 7;\n      if (score >= 398 && score <= 457) return 6;\n      if (score >= 369 && score <= 397) return 5;\n      if (score >= 331 && score <= 368) return 4;\n      return 0;\n    }\n\n    function mapExpression(score) {\n      score = Number(score);\n\n      if (score >= 16 && score <= 20) return 10;\n      if (score >= 14 && score <= 15) return 9;\n      if (score >= 12 && score <= 13) return 8;\n      if (score >= 10 && score <= 11) return 7;\n      if (score >= 7 && score <= 9) return 6;\n      if (score === 6) return 5;\n      if (score >= 4 && score <= 5) return 4;\n      return 0;\n    }\n\n    return {\n      reading: mapReading(reading),\n      writing: mapExpression(writing),\n      listening: mapListening(listening),\n      speaking: mapExpression(speaking)\n    };\n  }\n\n  function getLanguageLevels(prefix, test, tefDateElement) {\n    const reading = $(prefix + \"R\").value;\n    const writing = $(prefix + \"W\").value;\n    const listening = $(prefix + \"L\").value;\n    const speaking = $(prefix + \"S\").value;\n\n    if (test === \"ielts\") {\n      return clbFromIELTS(reading, writing, listening, speaking);\n    }\n\n    if (test === \"celpip\") {\n      return clbFromCELPIP(reading, writing, listening, speaking);\n    }\n\n    if (test === \"pte\") {\n      return clbFromPTE(reading, writing, listening, speaking);\n    }\n\n    if (test === \"tef\") {\n      const isAfter = tefDateElement &&\n        tefDateElement.value === \"after\";\n\n      return nclcFromTEF(\n        reading,\n        writing,\n        listening,\n        speaking,\n        isAfter\n      );\n    }\n\n    if (test === \"tcf\") {\n      return nclcFromTCF(reading, writing, listening, speaking);\n    }\n\n    return {\n      reading: 0,\n      writing: 0,\n      listening: 0,\n      speaking: 0\n    };\n  }\n\n  function educationTransferBand(level) {\n    if (\n      level === \"less_than_secondary\" ||\n      level === \"secondary\"\n    ) {\n      return \"secondary_or_less\";\n    }\n\n    if (\n      level === \"one_year\" ||\n      level === \"two_year\" ||\n      level === \"bachelor_or_3plus\"\n    ) {\n      return \"single_postsecondary\";\n    }\n\n    return \"advanced\";\n  }\n\n  function educationWithLanguagePoints(education, firstLanguage) {\n    const band = educationTransferBand(education);\n\n    if (band === \"secondary_or_less\") {\n      return 0;\n    }\n\n    if (allAtLeast(firstLanguage, 9)) {\n      return band === \"single_postsecondary\" ? 25 : 50;\n    }\n\n    if (allAtLeast(firstLanguage, 7)) {\n      return band === \"single_postsecondary\" ? 13 : 25;\n    }\n\n    return 0;\n  }\n\n  function educationWithCanadianWorkPoints(education, canadianWork) {\n    const band = educationTransferBand(education);\n    const years = Number(canadianWork || 0);\n\n    if (band === \"secondary_or_less\") {\n      return 0;\n    }\n\n    if (years >= 2) {\n      return band === \"single_postsecondary\" ? 25 : 50;\n    }\n\n    if (years >= 1) {\n      return band === \"single_postsecondary\" ? 13 : 25;\n    }\n\n    return 0;\n  }\n\n  function foreignWorkBand(years) {\n    years = Number(years || 0);\n\n    if (years <= 0) {\n      return 0;\n    }\n\n    if (years === 1 || years === 2) {\n      return 1;\n    }\n\n    return 2;\n  }\n\n  function foreignWorkWithLanguagePoints(foreignWork, firstLanguage) {\n    const band = foreignWorkBand(foreignWork);\n\n    if (band === 0 || !allAtLeast(firstLanguage, 7)) {\n      return 0;\n    }\n\n    if (allAtLeast(firstLanguage, 9)) {\n      return band === 1 ? 25 : 50;\n    }\n\n    return band === 1 ? 13 : 25;\n  }\n\n  function foreignWorkWithCanadianWorkPoints(foreignWork, canadianWork) {\n    const band = foreignWorkBand(foreignWork);\n    const canadianYears = Number(canadianWork || 0);\n\n    if (band === 0) {\n      return 0;\n    }\n\n    if (canadianYears >= 2) {\n      return band === 1 ? 25 : 50;\n    }\n\n    if (canadianYears >= 1) {\n      return band === 1 ? 13 : 25;\n    }\n\n    return 0;\n  }\n\n  function tradeCertificatePoints(hasCertificate, firstLanguage) {\n    if (!hasCertificate) {\n      return 0;\n    }\n\n    if (allAtLeast(firstLanguage, 7)) {\n      return 50;\n    }\n\n    if (allAtLeast(firstLanguage, 5)) {\n      return 25;\n    }\n\n    return 0;\n  }\n\n  function additionalPoints(data) {\n    const details = {\n      sibling: data.sibling ? 15 : 0,\n      french: 0,\n      canadianEducation:\n        CANADIAN_EDUCATION_POINTS[data.canadianEducation] || 0,\n      nomination: data.nomination ? 600 : 0\n    };\n\n    if (data.french && allAtLeast(data.french, 7)) {\n      if (!data.english || allAtMost(data.english, 4)) {\n        details.french = 25;\n      } else if (allAtLeast(data.english, 5)) {\n        details.french = 50;\n      }\n    }\n\n    details.total =\n      details.sibling +\n      details.french +\n      details.canadianEducation +\n      details.nomination;\n\n    return details;\n  }\n\n  function languageScoresAreComplete(prefix) {\n    return (\n      $(prefix + \"R\").value !== \"\" &&\n      $(prefix + \"W\").value !== \"\" &&\n      $(prefix + \"L\").value !== \"\" &&\n      $(prefix + \"S\").value !== \"\"\n    );\n  }\n\n  function basicFieldsAreComplete() {\n    return (\n      $(\"marital\").value !== \"\" &&\n      $(\"age\").value !== \"\" &&\n      $(\"edu\").value !== \"\" &&\n      $(\"cwe\").value !== \"\" &&\n      $(\"fwe\").value !== \"\" &&\n      $(\"lang1Test\").value !== \"\" &&\n      languageScoresAreComplete(\"lang1\") &&\n      $(\"canEdu\").value !== \"\"\n    );\n  }\n\n  function toggleConditionalSections() {\n    const spouseAccompanying =\n      $(\"marital\").value === \"married_accompanying\";\n\n    $(\"spouseWrap\").hidden = !spouseAccompanying;\n\n    const hasSecondLanguage = $(\"hasLang2\").checked;\n    $(\"lang2Wrap\").hidden = !hasSecondLanguage;\n\n    const firstTest = $(\"lang1Test\").value;\n    $(\"tefDateWrap\").hidden = firstTest !== \"tef\";\n\n    const secondTest = $(\"lang2Test\").value;\n    $(\"tefDateWrap2\").hidden =\n      !hasSecondLanguage || secondTest !== \"tef\";\n  }\n\n  function calculateCRS() {\n    toggleConditionalSections();\n\n    if (!basicFieldsAreComplete()) {\n      $(\"bfScore\").textContent = \"0\";\n\n      $(\"bfScoreHint\").textContent =\n        \"Complete all required fields to calculate your score\";\n\n      $(\"bfBreakdown\").innerHTML =\n        '<div class=\"bf-crs__hint\">' +\n        \"Not enough information has been entered yet.\" +\n        \"<\/div>\";\n\n      return null;\n    }\n\n    const maritalStatus = $(\"marital\").value;\n    const spouseAccompanying =\n      maritalStatus === \"married_accompanying\";\n\n    const age = numericValue($(\"age\"));\n    const education = $(\"edu\").value;\n    const canadianWork = numericValue($(\"cwe\"));\n    const foreignWork = numericValue($(\"fwe\"));\n    const hasTradeCertificate = $(\"tradeCert\").checked;\n\n    const firstTest = $(\"lang1Test\").value;\n\n    const firstLanguage = getLanguageLevels(\n      \"lang1\",\n      firstTest,\n      $(\"tefAfter\")\n    );\n\n    const hasSecondLanguage = $(\"hasLang2\").checked;\n    const secondTest = hasSecondLanguage\n      ? $(\"lang2Test\").value\n      : \"\";\n\n    let secondLanguage = null;\n\n    if (\n      hasSecondLanguage &&\n      secondTest &&\n      languageScoresAreComplete(\"lang2\")\n    ) {\n      secondLanguage = getLanguageLevels(\n        \"lang2\",\n        secondTest,\n        $(\"tefAfter2\")\n      );\n    }\n\n    let english = null;\n    let french = null;\n\n    if ([\"ielts\", \"celpip\", \"pte\"].includes(firstTest)) {\n      english = firstLanguage;\n    }\n\n    if ([\"tef\", \"tcf\"].includes(firstTest)) {\n      french = firstLanguage;\n    }\n\n    if (secondLanguage) {\n      if ([\"ielts\", \"celpip\", \"pte\"].includes(secondTest)) {\n        english = secondLanguage;\n      }\n\n      if ([\"tef\", \"tcf\"].includes(secondTest)) {\n        french = secondLanguage;\n      }\n    }\n\n    const ageScore = agePoints(age, spouseAccompanying);\n\n    const educationScore = educationPoints(\n      education,\n      spouseAccompanying\n    );\n\n    const canadianWorkScore = canadianWorkPoints(\n      canadianWork,\n      spouseAccompanying\n    );\n\n    const firstLanguageScore = ABILITIES.reduce(\n      function (total, ability) {\n        return total + firstLanguagePointsPerAbility(\n          firstLanguage[ability],\n          spouseAccompanying\n        );\n      },\n      0\n    );\n\n    let secondLanguageScore = 0;\n\n    if (secondLanguage) {\n      secondLanguageScore = ABILITIES.reduce(\n        function (total, ability) {\n          return total + secondLanguagePointsPerAbility(\n            secondLanguage[ability]\n          );\n        },\n        0\n      );\n\n      secondLanguageScore = Math.min(\n        secondLanguageScore,\n        spouseAccompanying ? 22 : 24\n      );\n    }\n\n    const languageScore =\n      firstLanguageScore + secondLanguageScore;\n\n    const coreTotal =\n      ageScore +\n      educationScore +\n      canadianWorkScore +\n      languageScore;\n\n    let spouseEducationScore = 0;\n    let spouseLanguageScore = 0;\n    let spouseCanadianWorkScore = 0;\n\n    if (spouseAccompanying) {\n      const spouseEducation = $(\"spEdu\").value;\n      const spouseCanadianWork = numericValue($(\"spCwe\"));\n\n      const spouseLevels = {\n        reading: numericValue($(\"spR\")),\n        writing: numericValue($(\"spW\")),\n        listening: numericValue($(\"spL\")),\n        speaking: numericValue($(\"spS\"))\n      };\n\n      spouseEducationScore =\n        SPOUSE_EDUCATION[spouseEducation] || 0;\n\n      spouseLanguageScore = Math.min(\n        20,\n        ABILITIES.reduce(function (total, ability) {\n          return total + spouseLanguagePointsPerAbility(\n            spouseLevels[ability]\n          );\n        }, 0)\n      );\n\n      spouseCanadianWorkScore =\n        SPOUSE_CANADIAN_WORK[\n          Math.max(0, Math.min(5, spouseCanadianWork))\n        ] || 0;\n    }\n\n    const spouseTotal =\n      spouseEducationScore +\n      spouseLanguageScore +\n      spouseCanadianWorkScore;\n\n    const educationLanguageTransfer =\n      educationWithLanguagePoints(\n        education,\n        firstLanguage\n      );\n\n    const educationCanadianWorkTransfer =\n      educationWithCanadianWorkPoints(\n        education,\n        canadianWork\n      );\n\n    \/*\n     * The two education combinations are added together,\n     * then capped at 50.\n     *\/\n    const educationTransferTotal = Math.min(\n      50,\n      educationLanguageTransfer +\n      educationCanadianWorkTransfer\n    );\n\n    const foreignLanguageTransfer =\n      foreignWorkWithLanguagePoints(\n        foreignWork,\n        firstLanguage\n      );\n\n    const foreignCanadianWorkTransfer =\n      foreignWorkWithCanadianWorkPoints(\n        foreignWork,\n        canadianWork\n      );\n\n    \/*\n     * The two foreign-work combinations are added together,\n     * then capped at 50.\n     *\/\n    const foreignWorkTransferTotal = Math.min(\n      50,\n      foreignLanguageTransfer +\n      foreignCanadianWorkTransfer\n    );\n\n    const tradeTransferTotal = tradeCertificatePoints(\n      hasTradeCertificate,\n      firstLanguage\n    );\n\n    const transferabilityTotal = Math.min(\n      100,\n      educationTransferTotal +\n      foreignWorkTransferTotal +\n      tradeTransferTotal\n    );\n\n    const additional = additionalPoints({\n      sibling: $(\"sib\").checked,\n      french: french,\n      english: english,\n      canadianEducation: $(\"canEdu\").value,\n      nomination: $(\"pnp\").checked\n    });\n\n    const total =\n      coreTotal +\n      spouseTotal +\n      transferabilityTotal +\n      additional.total;\n\n    const result = {\n      total: total,\n\n      core: {\n        age: ageScore,\n        education: educationScore,\n        firstLanguage: firstLanguageScore,\n        secondLanguage: secondLanguageScore,\n        language: languageScore,\n        canadianWork: canadianWorkScore,\n        total: coreTotal\n      },\n\n      spouse: {\n        education: spouseEducationScore,\n        language: spouseLanguageScore,\n        canadianWork: spouseCanadianWorkScore,\n        total: spouseTotal\n      },\n\n      transferability: {\n        educationLanguage:\n          educationLanguageTransfer,\n        educationCanadianWork:\n          educationCanadianWorkTransfer,\n        educationTotal:\n          educationTransferTotal,\n        foreignLanguage:\n          foreignLanguageTransfer,\n        foreignCanadianWork:\n          foreignCanadianWorkTransfer,\n        foreignTotal:\n          foreignWorkTransferTotal,\n        trade:\n          tradeTransferTotal,\n        total:\n          transferabilityTotal\n      },\n\n      additional: additional,\n\n      levels: {\n        first: firstLanguage,\n        second: secondLanguage\n      }\n    };\n\n    $(\"bfScore\").textContent = String(total);\n    $(\"bfScoreHint\").textContent = \"Live calculation is active\";\n\n    renderBreakdown(result);\n\n    return result;\n  }\n\n  function scoreRow(label, value, totalRow) {\n    return (\n      '<div class=\"row' +\n      (totalRow ? \" bf-total-row\" : \"\") +\n      '\">' +\n      \"<div>\" +\n      label +\n      \"<\/div>\" +\n      \"<div>\" +\n      value +\n      \"<\/div>\" +\n      \"<\/div>\"\n    );\n  }\n\n  function renderBreakdown(result) {\n    const spouseAccompanying =\n      $(\"marital\").value === \"married_accompanying\";\n\n    let html = \"\";\n\n    html += \"<h4>A) Core \/ Human Capital Factors<\/h4>\";\n    html += scoreRow(\"Age\", result.core.age);\n    html += scoreRow(\"Education\", result.core.education);\n    html += scoreRow(\n      \"First official language\",\n      result.core.firstLanguage\n    );\n    html += scoreRow(\n      \"Second official language\",\n      result.core.secondLanguage\n    );\n    html += scoreRow(\n      \"Canadian work experience\",\n      result.core.canadianWork\n    );\n    html += scoreRow(\n      \"<strong>Section A total<\/strong>\",\n      \"<strong>\" + result.core.total + \"<\/strong>\",\n      true\n    );\n\n    if (spouseAccompanying) {\n      html += \"<h4>B) Spouse or Partner Factors<\/h4>\";\n      html += scoreRow(\n        \"Spouse education\",\n        result.spouse.education\n      );\n      html += scoreRow(\n        \"Spouse language\",\n        result.spouse.language\n      );\n      html += scoreRow(\n        \"Spouse Canadian work experience\",\n        result.spouse.canadianWork\n      );\n      html += scoreRow(\n        \"<strong>Section B total<\/strong>\",\n        \"<strong>\" + result.spouse.total + \"<\/strong>\",\n        true\n      );\n    }\n\n    html += \"<h4>C) Skill Transferability Factors<\/h4>\";\n    html += scoreRow(\n      \"Education + language\",\n      result.transferability.educationLanguage\n    );\n    html += scoreRow(\n      \"Education + Canadian work\",\n      result.transferability.educationCanadianWork\n    );\n    html += scoreRow(\n      \"Education combinations \u2014 capped at 50\",\n      result.transferability.educationTotal\n    );\n    html += scoreRow(\n      \"Foreign work + language\",\n      result.transferability.foreignLanguage\n    );\n    html += scoreRow(\n      \"Foreign work + Canadian work\",\n      result.transferability.foreignCanadianWork\n    );\n    html += scoreRow(\n      \"Foreign-work combinations \u2014 capped at 50\",\n      result.transferability.foreignTotal\n    );\n    html += scoreRow(\n      \"Certificate of qualification\",\n      result.transferability.trade\n    );\n    html += scoreRow(\n      \"<strong>Section C total \u2014 maximum 100<\/strong>\",\n      \"<strong>\" + result.transferability.total + \"<\/strong>\",\n      true\n    );\n\n    html += \"<h4>D) Additional Points<\/h4>\";\n    html += scoreRow(\n      \"Brother or sister in Canada\",\n      result.additional.sibling\n    );\n    html += scoreRow(\n      \"French-language bonus\",\n      result.additional.french\n    );\n    html += scoreRow(\n      \"Canadian education\",\n      result.additional.canadianEducation\n    );\n    html += scoreRow(\n      \"Provincial or territorial nomination\",\n      result.additional.nomination\n    );\n    html += scoreRow(\n      \"<strong>Section D total<\/strong>\",\n      \"<strong>\" + result.additional.total + \"<\/strong>\",\n      true\n    );\n\n    html += \"<h4>Total CRS Score<\/h4>\";\n    html += scoreRow(\n      \"<strong>Estimated CRS score<\/strong>\",\n      \"<strong>\" + result.total + \"<\/strong>\",\n      true\n    );\n\n    $(\"bfBreakdown\").innerHTML = html;\n  }\n\n  function yesNo(value) {\n    return value ? \"Yes\" : \"No\";\n  }\n\n  function formatBenchmarks(levels) {\n    if (!levels) {\n      return \"Not provided\";\n    }\n\n    return (\n      \"Reading \" + levels.reading +\n      \", Writing \" + levels.writing +\n      \", Listening \" + levels.listening +\n      \", Speaking \" + levels.speaking\n    );\n  }\n\n  function buildWhatsAppMessage(result) {\n    const maritalValue = $(\"marital\").value;\n    const spouseAccompanying =\n      maritalValue === \"married_accompanying\";\n\n    const firstTest = $(\"lang1Test\").value;\n    const secondTest = $(\"hasLang2\").checked\n      ? $(\"lang2Test\").value\n      : \"\";\n\n    const lines = [\n      \"CRS ASSESSMENT \u2014 BORHANIFAR IMMIGRATION\",\n      \"\",\n      \"Estimated CRS score: \" + result.total,\n      \"\",\n      \"APPLICANT INFORMATION\",\n      \"Marital status: \" +\n        (LABELS.marital[maritalValue] || selectedText($(\"marital\"))),\n      \"Age: \" + $(\"age\").value,\n      \"Education: \" +\n        (LABELS.education[$(\"edu\").value] || selectedText($(\"edu\"))),\n      \"Canadian work experience: \" + selectedText($(\"cwe\")),\n      \"Foreign work experience: \" + selectedText($(\"fwe\")),\n      \"Canadian trades certificate of qualification: \" +\n        yesNo($(\"tradeCert\").checked),\n      \"\",\n      \"LANGUAGE RESULTS\",\n      \"First official-language test: \" +\n        (LABELS.tests[firstTest] || selectedText($(\"lang1Test\"))),\n      \"Entered scores \u2014 Reading: \" + $(\"lang1R\").value +\n        \", Writing: \" + $(\"lang1W\").value +\n        \", Listening: \" + $(\"lang1L\").value +\n        \", Speaking: \" + $(\"lang1S\").value,\n      \"Converted CLB\/NCLC \u2014 \" +\n        formatBenchmarks(result.levels.first)\n    ];\n\n    if ($(\"hasLang2\").checked && secondTest) {\n      lines.push(\n        \"Second official-language test: \" +\n          (LABELS.tests[secondTest] || selectedText($(\"lang2Test\"))),\n        \"Entered scores \u2014 Reading: \" + $(\"lang2R\").value +\n          \", Writing: \" + $(\"lang2W\").value +\n          \", Listening: \" + $(\"lang2L\").value +\n          \", Speaking: \" + $(\"lang2S\").value,\n        \"Converted CLB\/NCLC \u2014 \" +\n          formatBenchmarks(result.levels.second)\n      );\n    } else {\n      lines.push(\"Second official language: Not provided\");\n    }\n\n    if (spouseAccompanying) {\n      lines.push(\n        \"\",\n        \"ACCOMPANYING SPOUSE \/ PARTNER\",\n        \"Education: \" + selectedText($(\"spEdu\")),\n        \"Canadian work experience: \" + selectedText($(\"spCwe\")),\n        \"Language benchmarks \u2014 Reading: \" +\n          ($(\"spR\").value || \"0\") +\n          \", Writing: \" + ($(\"spW\").value || \"0\") +\n          \", Listening: \" + ($(\"spL\").value || \"0\") +\n          \", Speaking: \" + ($(\"spS\").value || \"0\")\n      );\n    }\n\n    lines.push(\n      \"\",\n      \"ADDITIONAL FACTORS\",\n      \"Sibling in Canada: \" + yesNo($(\"sib\").checked),\n      \"Canadian education: \" +\n        (LABELS.canadianEducation[$(\"canEdu\").value] ||\n          selectedText($(\"canEdu\"))),\n      \"Provincial or territorial nomination: \" +\n        yesNo($(\"pnp\").checked),\n      \"\",\n      \"CRS POINT BREAKDOWN\",\n      \"A) Core \/ human capital: \" + result.core.total,\n      \"B) Spouse or partner: \" + result.spouse.total,\n      \"C) Skill transferability: \" +\n        result.transferability.total,\n      \"D) Additional points: \" + result.additional.total,\n      \"\",\n      \"TOTAL CRS SCORE: \" + result.total,\n      \"\",\n      \"I completed this preliminary CRS assessment on borhanifar.com and would like further information.\",\n      \"\",\n      \"This calculator result is an estimate and does not confirm eligibility for Express Entry or an invitation to apply.\"\n    );\n\n    return lines.join(\"n\");\n  }\n\n  function openWhatsApp() {\n    const status = $(\"whatsappMsg\");\n    const result = calculateCRS();\n\n    if (!result) {\n      status.textContent =\n        \"Please complete all required fields before opening WhatsApp.\";\n\n      const firstIncomplete = ROOT.querySelector(\n        'select:invalid, input:invalid'\n      );\n\n      if (firstIncomplete) {\n        firstIncomplete.focus();\n      }\n\n      return;\n    }\n\n    if (\n      $(\"hasLang2\").checked &&\n      (\n        $(\"lang2Test\").value === \"\" ||\n        !languageScoresAreComplete(\"lang2\")\n      )\n    ) {\n      status.textContent =\n        \"Please complete all second-language fields or turn off the second-language option.\";\n\n      return;\n    }\n\n    if (\n      $(\"marital\").value === \"married_accompanying\" &&\n      $(\"spEdu\").value === \"\"\n    ) {\n      status.textContent =\n        \"Please select the accompanying spouse\u2019s education.\";\n\n      $(\"spEdu\").focus();\n      return;\n    }\n\n    const message = buildWhatsAppMessage(result);\n\n    const whatsappURL =\n      \"https:\/\/wa.me\/\" +\n      WHATSAPP_NUMBER +\n      \"?text=\" +\n      encodeURIComponent(message);\n\n    status.textContent = \"Opening WhatsApp\u2026\";\n\n    const newWindow = window.open(\n      whatsappURL,\n      \"_blank\",\n      \"noopener,noreferrer\"\n    );\n\n    if (!newWindow) {\n      window.location.href = whatsappURL;\n    }\n\n    window.setTimeout(function () {\n      status.textContent =\n        \"WhatsApp opened. Review the prepared assessment and press Send.\";\n    }, 700);\n  }\n\n  function wireEvents() {\n    ROOT.querySelectorAll(\"input, select\").forEach(function (field) {\n      field.addEventListener(\"input\", calculateCRS);\n      field.addEventListener(\"change\", calculateCRS);\n    });\n\n    $(\"btnWhatsApp\").addEventListener(\"click\", openWhatsApp);\n  }\n\n  wireEvents();\n  toggleConditionalSections();\n  calculateCRS();\n})();\n<\/script><\/div>\n\t\t\t<\/div><div class=\"et_pb_module et_d4_element et_pb_accordion et_pb_accordion_0\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t<\/div><div class=\"et_pb_with_border et_d4_element et_pb_row et_pb_row_2  et_pb_css_mix_blend_mode et_block_row\">\n\t\t\t\t<div class=\"et_d4_element et_pb_column_4_4 et_pb_column et_pb_column_2  et_pb_css_mix_blend_mode et-last-child et_block_column\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_module et_d4_element et_pb_text et_pb_text_1  et_pb_text_align_left et_pb_bg_layout_light\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_text_inner\"><h2><span class=\"ez-toc-section\" id=\"express-entry-rounds-of-invitations-latest-rounds\"><\/span>Express Entry Rounds of invitations: Latest rounds<span class=\"ez-toc-section-end\"><\/span><\/h2><\/div>\n\t\t\t<\/div><div class=\"et_pb_module et_d4_element et_pb_code et_pb_code_1\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_code_inner\"><section id=\"ee-draws-table\" dir=\"ltr\" style=\"margin: 30px 0;\" aria-label=\"Canada Express Entry draws table\">\n <style>\n    .ee-fa-wrap{\n      max-width:100%;\n      margin:0 auto;\n      font-family:inherit;\n      color:#2f2f2f;\n    }\n\n    .ee-fa-head{margin-bottom:16px;}\n\n    .ee-fa-head h3{\n      margin:0 0 8px;\n      font-size:28px;\n      line-height:1.7;\n      color:#1f2937;\n    }\n\n    .ee-fa-head p{\n      margin:0;\n      font-size:16px;\n      line-height:2;\n      color:#4b5563;\n    }\n\n    .ee-fa-meta{\n      display:flex;\n      flex-wrap:wrap;\n      gap:10px;\n      margin-top:12px;\n      align-items:center;\n    }\n\n    .ee-fa-badge{\n      background:#f8fafc;\n      border:1px solid #d1d5db;\n      border-radius:10px;\n      padding:8px 12px;\n      font-size:16px;\n      color:#374151;\n    }\n\n    .ee-fa-refresh{\n      height:40px;\n      border:1px solid #2563eb;\n      background:#2563eb;\n      color:#fff;\n      border-radius:8px;\n      padding:0 14px;\n      font-size:16px;\n      font-family:inherit;\n      cursor:pointer;\n    }\n\n    .ee-fa-refresh:disabled{\n      opacity:.6;\n      cursor:not-allowed;\n    }\n\n    .ee-fa-controls{\n      display:flex;\n      justify-content:space-between;\n      align-items:center;\n      flex-wrap:wrap;\n      gap:14px;\n      margin:18px 0 14px;\n    }\n\n    .ee-fa-search,\n    .ee-fa-length{\n      display:flex;\n      align-items:center;\n      gap:10px;\n      flex-wrap:wrap;\n    }\n\n    .ee-fa-label{\n      font-size:16px;\n      font-weight:500;\n      color:#1f2937;\n    }\n\n    .ee-fa-input{\n      width:260px;\n      max-width:100%;\n      height:42px;\n      border:1px solid #9ca3af;\n      border-radius:8px;\n      padding:0 12px;\n      font-size:16px;\n      font-family:inherit;\n      background:#fff;\n      outline:none;\n    }\n\n    .ee-fa-input:focus,\n    .ee-fa-select:focus{\n      border-color:#2563eb;\n      box-shadow:0 0 0 3px rgba(37,99,235,.12);\n    }\n\n    .ee-fa-select{\n      height:42px;\n      border:1px solid #9ca3af;\n      border-radius:8px;\n      padding:0 10px;\n      font-size:16px;\n      font-family:inherit;\n      background:#fff;\n      outline:none;\n    }\n\n    .ee-fa-info{\n      font-size:16px;\n      color:#4b5563;\n    }\n\n    .ee-fa-table-wrap{\n      overflow-x:auto;\n      border:1px solid #e5e7eb;\n      border-radius:14px;\n      background:#fff;\n    }\n\n    .ee-fa-table{\n      width:100%;\n      border-collapse:collapse;\n      table-layout:auto;\n    }\n\n    .ee-fa-table th,\n    .ee-fa-table td{\n      padding:6px 12px;\n      text-align:left;\n      vertical-align:top;\n      border-bottom:1px solid #e5e7eb;\n      font-size:15px;\n      line-height:1.6;\n    }\n\n    .ee-fa-table th{\n      background:#f9fafb;\n      color:#1f2937;\n      font-size:14px;\n      font-weight:600;\n      white-space:normal;\n    }\n\n    .ee-fa-table tr:last-child td{border-bottom:none;}\n\n    .ee-fa-table a{\n      color:#1f4a83;\n      text-decoration:underline;\n    }\n\n    .ee-fa-sort{\n      display:inline-flex;\n      flex-direction:column;\n      justify-content:center;\n      align-items:center;\n      width:22px;\n      height:22px;\n      margin-left:6px;\n      border:1px solid #cbd5e1;\n      background:#f3f4f6;\n      border-radius:4px;\n      font-size:10px;\n      line-height:10px;\n      cursor:pointer;\n      color:#6b7280;\n      vertical-align:middle;\n      user-select:none;\n    }\n\n    .ee-fa-sort.active{\n      color:#111827;\n      border-color:#94a3b8;\n      background:#e5e7eb;\n    }\n\n    .ee-fa-loading,\n    .ee-fa-empty,\n    .ee-fa-error{\n      padding:22px 12px;\n      text-align:center;\n      font-size:16px;\n      color:#4b5563;\n    }\n\n    .ee-fa-error{color:#b91c1c;}\n\n    .ee-fa-pagination{\n      display:flex;\n      justify-content:center;\n      align-items:center;\n      flex-wrap:wrap;\n      gap:8px;\n      margin-top:16px;\n    }\n\n    .ee-fa-page{\n      min-width:42px;\n      height:42px;\n      padding:0 12px;\n      border:1px solid #d1d5db;\n      background:#fff;\n      border-radius:8px;\n      cursor:pointer;\n      font-size:15px;\n      font-family:inherit;\n      color:#1f2937;\n    }\n\n    .ee-fa-page.active{\n      background:#2563eb;\n      border-color:#2563eb;\n      color:#fff;\n    }\n\n    .ee-fa-page:disabled{\n      opacity:.5;\n      cursor:not-allowed;\n    }\n\n    @media (max-width:768px){\n      .ee-fa-head h3{font-size:23px;}\n      .ee-fa-head p{font-size:15px;}\n      .ee-fa-label{font-size:16px;}\n      .ee-fa-input{width:100%;}\n      .ee-fa-search{width:100%;}\n      .ee-fa-table{min-width:760px;}\n      .ee-fa-table th,\n      .ee-fa-table td{\n        font-size:15px;\n        padding:12px 10px;\n      }\n    }\n  <\/style>\n\n\n\n<div class=\"ee-fa-wrap\">\n\n\n<div class=\"ee-fa-head\">\n\n\n<h3>Canada Express Entry Draws Table<\/h3>\n\n\n\n This table lets you search and sort the latest Canada Express Entry draws, from draw number 1 on January 31, 2015 to today, by date, draw type, number of invitations, and minimum CRS score.\n\n\n\n\n\n\n<div class=\"ee-fa-meta\">\n\n\n<div id=\"ee-fa-updated\" class=\"ee-fa-badge\">Last table update: Loading...<\/div>\n\n\n <button id=\"ee-fa-refresh-btn\" class=\"ee-fa-refresh\" type=\"button\">Refresh Data<\/button>\n<\/div>\n\n\n<\/div>\n\n\n\n\n\n<div class=\"ee-fa-controls\">\n\n\n<div class=\"ee-fa-search\">\n <label class=\"ee-fa-label\" for=\"ee-fa-search-input\">Search the table<\/label>\n <input id=\"ee-fa-search-input\" class=\"ee-fa-input\" type=\"text\" placeholder=\"Example: Canadian Experience or 2026\" \/>\n\n\n<div id=\"ee-fa-info\" class=\"ee-fa-info\">Loading data...<\/div>\n\n\n<\/div>\n\n\n\n\n\n<div class=\"ee-fa-length\">\n <label class=\"ee-fa-label\" for=\"ee-fa-length-select\">Show entries<\/label>\n<select id=\"ee-fa-length-select\" class=\"ee-fa-select\">\n\n\n<option selected=\"selected\" value=\"10\">10<\/option>\n\n\n<option value=\"25\">25<\/option>\n\n\n<option value=\"50\">50<\/option>\n\n\n<option value=\"100\">100<\/option>\n\n\n<\/select>\n<\/div>\n\n\n<\/div>\n\n\n\n\n\n<div class=\"ee-fa-table-wrap\">\n\n\n<table class=\"ee-fa-table\">\n\n\n<thead>\n\n\n<tr>\n\n\n<th>\n Draw\n <button class=\"ee-fa-sort active\" type=\"button\" data-key=\"drawNumber\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n Date\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawDate\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n Draw Type\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawName\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n ITAs Issued\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawSize\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n\n\n<th>\n Minimum CRS\n <button class=\"ee-fa-sort\" type=\"button\" data-key=\"drawCRS\">\u25b2\n\u25bc<\/button>\n<\/th>\n\n\n<\/tr>\n\n\n<\/thead>\n\n\n\n\n<tbody id=\"ee-fa-tbody\">\n\n\n<tr>\n\n<td class=\"ee-fa-loading\" colspan=\"5\">Loading data...<\/td>\n\n<\/tr>\n\n\n<\/tbody>\n\n\n<\/table>\n\n\n<\/div>\n\n\n\n\n\n<div id=\"ee-fa-pagination\" class=\"ee-fa-pagination\"><\/div>\n\n\n<\/div>\n\n\n\n <script>\n    (function(){\n      const JSON_URL = \"https:\/\/www.canada.ca\/content\/dam\/ircc\/documents\/json\/ee_rounds_123_en.json\";\n      const CACHE_KEY = \"ee_draws_cache_v7_en\";\n\n      const tbody = document.getElementById(\"ee-fa-tbody\");\n      const searchInput = document.getElementById(\"ee-fa-search-input\");\n      const lengthSelect = document.getElementById(\"ee-fa-length-select\");\n      const infoBox = document.getElementById(\"ee-fa-info\");\n      const paginationBox = document.getElementById(\"ee-fa-pagination\");\n      const updatedBox = document.getElementById(\"ee-fa-updated\");\n      const refreshBtn = document.getElementById(\"ee-fa-refresh-btn\");\n      const sortButtons = document.querySelectorAll(\".ee-fa-sort\");\n\n      let allRows = [];\n      let filteredRows = [];\n      let currentPage = 1;\n      let pageLength = 10;\n      let sortKey = \"drawNumber\";\n      let sortDir = \"desc\";\n\n      const seedRows = [\n        { drawNumberURL:'<a href=\"\/en\/immigration-refugees-citizenship\/corporate\/mandate\/policies-operational-instructions-agreements\/ministerial-instructions\/express-entry-rounds\/invitations-408.html\">408<\/a>', drawDateFull:\"April 2, 2026\", drawDate:\"02-04-2026\", drawName:\"Trades Occupations, 2026-Version 3\", drawSize:\"3,000\", drawCRS:\"477\" },\n        { drawNumberURL:'<a href=\"\/en\/immigration-refugees-citizenship\/corporate\/mandate\/policies-operational-instructions-agreements\/ministerial-instructions\/express-entry-rounds\/invitations-407.html\">407<\/a>', drawDateFull:\"March 31, 2026\", drawDate:\"31-03-2026\", drawName:\"Canadian Experience Class\", drawSize:\"2,250\", drawCRS:\"509\" },\n        { drawNumberURL:'<a href=\"\/en\/immigration-refugees-citizenship\/corporate\/mandate\/policies-operational-instructions-agreements\/ministerial-instructions\/express-entry-rounds\/invitations-406.html\">406<\/a>', drawDateFull:\"March 30, 2026\", drawDate:\"30-03-2026\", drawName:\"Provincial Nominee Program\", drawSize:\"356\", drawCRS:\"802\" }\n      ];\n\n      function drawTypeLabel(text){\n        if (!text) return \"\";\n        const direct = {\n          \"Provincial Nominee Program\":\"Provincial Nominee Program\",\n          \"Provincial Nominee Class\":\"Provincial Nominee Program\",\n          \"Canadian Experience Class\":\"Canadian Experience Class\",\n          \"French-Language proficiency 2026-Version 2\":\"French Language Proficiency 2026 - Version 2\",\n          \"French language proficiency (Version 1)\":\"French Language Proficiency - Version 1\",\n          \"Trades Occupations, 2026-Version 3\":\"Trades Occupations 2026 - Version 3\",\n          \"Senior managers with Canadian Work Experience, 2026-Version 1\":\"Senior Managers with Canadian Work Experience 2026 - Version 1\",\n          \"Healthcare and Social Services Occupations, 2026-Version 3\":\"Healthcare and Social Services Occupations 2026 - Version 3\",\n          \"Healthcare and social services occupations (Version 2)\":\"Healthcare and Social Services Occupations - Version 2\",\n          \"Healthcare and social services occupations (Version 1)\":\"Healthcare and Social Services Occupations - Version 1\",\n          \"Physicians with Canadian Work Experience, 2026-Version 1\":\"Physicians with Canadian Work Experience 2026 - Version 1\",\n          \"No program specified\":\"No Program Specified\",\n          \"Federal Skilled Trades\":\"Federal Skilled Trades\"\n        };\n        if (direct[text]) return direct[text];\n\n        return String(text)\n          .replace(\/Healthcare and social services occupations\/gi, \"Healthcare and Social Services Occupations\")\n          .replace(\/French-Language proficiency\/gi, \"French Language Proficiency\")\n          .replace(\/French language proficiency\/gi, \"French Language Proficiency\")\n          .replace(\/Trades Occupations\/gi, \"Trades Occupations\")\n          .replace(\/Senior managers with Canadian Work Experience\/gi, \"Senior Managers with Canadian Work Experience\")\n          .replace(\/\\\\\\\\\\\\\\\\s+\/g, \" \")\n          .trim();\n      }\n\n      function numberFormat(value){\n        const n = parseInt(String(value).replace(\/,\/g, \"\").trim(), 10);\n        if (isNaN(n)) return value;\n        return n.toLocaleString(\"en-US\");\n      }\n\n      function dateFormat(dateText){\n        if (!dateText) return \"\";\n        const parsed = Date.parse(String(dateText).trim());\n        if (isNaN(parsed)) return dateText;\n        return new Date(parsed).toLocaleDateString(\"en-CA\", {\n          year: \"numeric\",\n          month: \"long\",\n          day: \"numeric\"\n        });\n      }\n\n      function dateTimeFormat(ts){\n        const d = new Date(ts);\n        return d.toLocaleString(\"en-CA\", {\n          year: \"numeric\",\n          month: \"2-digit\",\n          day: \"2-digit\",\n          hour: \"2-digit\",\n          minute: \"2-digit\",\n          hour12: false\n        });\n      }\n\n      function drawNumberData(drawNumberURL){\n        const wrapper = document.createElement(\"div\");\n        wrapper.innerHTML = drawNumberURL || \"\";\n        const a = wrapper.querySelector(\"a\");\n        if (!a) return { text: \"\", href: \"#\" };\n        const href = a.getAttribute(\"href\") || \"#\";\n        return {\n          text: a.textContent.trim(),\n          href: href.startsWith(\"http\") ? href : \"https:\/\/www.canada.ca\" + href\n        };\n      }\n\n      function getDrawNumberInt(row){\n        const num = drawNumberData(row.drawNumberURL).text;\n        return parseInt(String(num).replace(\/,\/g, \"\").trim(), 10) || 0;\n      }\n\n      function parseDrawDate(row){\n        const raw = String(row.drawDate || \"\").trim();\n\n        let m = raw.match(\/^(\\\\\\\\\\\\\\\\d{2})-(\\\\\\\\\\\\\\\\d{2})-(\\\\\\\\\\\\\\\\d{4})$\/);\n        if (m) return new Date(Number(m[3]), Number(m[2]) - 1, Number(m[1])).getTime();\n\n        m = raw.match(\/^(\\\\\\\\\\\\\\\\d{4})-(\\\\\\\\\\\\\\\\d{2})-(\\\\\\\\\\\\\\\\d{2})$\/);\n        if (m) return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])).getTime();\n\n        const parsed = Date.parse(String(row.drawDateFull || \"\").trim());\n        return isNaN(parsed) ? 0 : parsed;\n      }\n\n      function sortValue(row, key){\n        if (key === \"drawDate\") return parseDrawDate(row);\n        if (key === \"drawNumber\") return getDrawNumberInt(row);\n        if (key === \"drawSize\" || key === \"drawCRS\") {\n          return parseInt(String(row[key]).replace(\/,\/g, \"\").trim(), 10) || 0;\n        }\n        return String(row[key] || \"\").toLowerCase();\n      }\n\n      function sortRows(rows){\n        rows.sort((a,b)=>{\n          const av = sortValue(a, sortKey);\n          const bv = sortValue(b, sortKey);\n          if (av < bv) return sortDir === \"asc\" ? -1 : 1;\n          if (av > bv) return sortDir === \"asc\" ? 1 : -1;\n          return 0;\n        });\n      }\n\n      function saveCache(rows){\n        try{\n          localStorage.setItem(CACHE_KEY, JSON.stringify({\n            fetchedAt: Date.now(),\n            rows\n          }));\n        } catch(e){}\n      }\n\n      function loadCache(){\n        try{\n          const raw = localStorage.getItem(CACHE_KEY);\n          if (!raw) return null;\n          return JSON.parse(raw);\n        } catch(e){\n          return null;\n        }\n      }\n\n      function clearCache(){\n        try{\n          localStorage.removeItem(CACHE_KEY);\n        } catch(e){}\n      }\n\n      function updateMeta(){\n        const cache = loadCache();\n        if (cache && cache.fetchedAt) {\n          updatedBox.textContent = `Last table update: ${dateTimeFormat(cache.fetchedAt)}`;\n        } else {\n          updatedBox.textContent = \"\";\n        }\n      }\n\n      function applyFilter(){\n        const q = searchInput.value.trim().toLowerCase();\n\n        filteredRows = allRows.filter(row => {\n          const num = drawNumberData(row.drawNumberURL);\n          const haystack = [\n            num.text,\n            row.drawDateFull,\n            row.drawName,\n            drawTypeLabel(row.drawName),\n            row.drawSize,\n            row.drawCRS\n          ].join(\" \").toLowerCase();\n\n          return haystack.includes(q);\n        });\n\n        sortRows(filteredRows);\n        currentPage = 1;\n        render();\n      }\n\n      function renderInfo(total, start, end){\n        infoBox.textContent = `Showing ${start} to ${end} of ${total} entries`;\n      }\n\n      function renderTable(){\n        if (!filteredRows.length) {\n          tbody.innerHTML = `<tr><td colspan=\"5\" class=\"ee-fa-empty\">No results found.<\/td><\/tr>`;\n          renderInfo(0,0,0);\n          paginationBox.innerHTML = \"\";\n          return;\n        }\n\n        const startIndex = (currentPage - 1) * pageLength;\n        const endIndex = Math.min(startIndex + pageLength, filteredRows.length);\n        const pageRows = filteredRows.slice(startIndex, endIndex);\n\n        tbody.innerHTML = pageRows.map(row => {\n          const num = drawNumberData(row.drawNumberURL);\n          return `\n            <tr>\n              <td><a href=\"${num.href}\" target=\"_blank\" rel=\"noopener\">${num.text}<\/a><\/td>\n              <td>${dateFormat(row.drawDateFull)}<\/td>\n              <td>${drawTypeLabel(row.drawName)}<\/td>\n              <td>${numberFormat(row.drawSize)}<\/td>\n              <td>${numberFormat(row.drawCRS)}<\/td>\n            <\/tr>\n          `;\n        }).join(\"\");\n\n        renderInfo(filteredRows.length, startIndex + 1, endIndex);\n      }\n\n      function renderPagination(){\n        const totalPages = Math.ceil(filteredRows.length \/ pageLength);\n        paginationBox.innerHTML = \"\";\n        if (totalPages <= 1) return;\n\n        function addBtn(label, page, active = false, disabled = false){\n          const btn = document.createElement(\"button\");\n          btn.className = \"ee-fa-page\" + (active ? \" active\" : \"\");\n          btn.textContent = label;\n          btn.disabled = disabled;\n          if (!disabled) {\n            btn.addEventListener(\"click\", () => {\n              currentPage = page;\n              render();\n            });\n          }\n          paginationBox.appendChild(btn);\n        }\n\n        addBtn(\"Previous\", Math.max(1, currentPage - 1), false, currentPage === 1);\n\n        const total = Math.ceil(filteredRows.length \/ pageLength);\n        for (let i = 1; i <= total; i++) {\n          if (i <= 3 || i > total - 3 || Math.abs(i - currentPage) <= 1) {\n            addBtn(String(i), i, i === currentPage, false);\n          } else if (\n            (i === 4 && currentPage > 5) ||\n            (i === total - 3 && currentPage < total - 4)\n          ) {\n            addBtn(\"\u2026\", 1, false, true);\n          }\n        }\n\n        addBtn(\"Next\", Math.min(total, currentPage + 1), false, currentPage === total);\n      }\n\n      function render(){\n        renderTable();\n        renderPagination();\n      }\n\n      function hydrate(rows){\n        allRows = rows.slice();\n        filteredRows = rows.slice();\n\n        sortKey = \"drawNumber\";\n        sortDir = \"desc\";\n\n        sortRows(filteredRows);\n        currentPage = 1;\n\n        sortButtons.forEach(b => b.classList.remove(\"active\"));\n        const drawBtn = document.querySelector('.ee-fa-sort[data-key=\"drawNumber\"]');\n        if (drawBtn) drawBtn.classList.add(\"active\");\n\n        render();\n        updateMeta();\n      }\n\n      function fetchFreshData(forceRefresh = false){\n        refreshBtn.disabled = true;\n        refreshBtn.textContent = \"Refreshing...\";\n\n        const url = forceRefresh ? `${JSON_URL}?t=${Date.now()}` : JSON_URL;\n\n        fetch(url, { cache: \"no-store\" })\n          .then(res => {\n            if (!res.ok) throw new Error(\"Fetch failed\");\n            return res.json();\n          })\n          .then(data => {\n            const rows = Array.isArray(data.rounds) ? data.rounds : [];\n            if (!rows.length) throw new Error(\"Empty data\");\n\n            saveCache(rows);\n            hydrate(rows);\n          })\n          .catch(() => {\n            if (!allRows.length) {\n              tbody.innerHTML = `<tr><td colspan=\"5\" class=\"ee-fa-error\">Failed to load data.<\/td><\/tr>`;\n            }\n          })\n          .finally(() => {\n            refreshBtn.disabled = false;\n            refreshBtn.textContent = \"Refresh Data\";\n          });\n      }\n\n      sortButtons.forEach(btn => {\n        btn.addEventListener(\"click\", () => {\n          const key = btn.getAttribute(\"data-key\");\n          if (sortKey === key) {\n            sortDir = sortDir === \"asc\" ? \"desc\" : \"asc\";\n          } else {\n            sortKey = key;\n            sortDir = (key === \"drawNumber\" || key === \"drawDate\") ? \"desc\" : \"asc\";\n          }\n\n          sortButtons.forEach(b => b.classList.remove(\"active\"));\n          btn.classList.add(\"active\");\n\n          sortRows(filteredRows);\n          currentPage = 1;\n          render();\n        });\n      });\n\n      searchInput.addEventListener(\"input\", applyFilter);\n\n      lengthSelect.addEventListener(\"change\", () => {\n        pageLength = parseInt(lengthSelect.value, 10);\n        currentPage = 1;\n        render();\n      });\n\n      refreshBtn.addEventListener(\"click\", () => {\n        clearCache();\n        fetchFreshData(true);\n      });\n\n      hydrate(seedRows);\n\n      const cached = loadCache();\n      if (cached && Array.isArray(cached.rows) && cached.rows.length) {\n        hydrate(cached.rows);\n      }\n\n      fetchFreshData(false);\n    })();\n  <\/script>\n<\/section>\n<\/div>\n\t\t\t<\/div><div class=\"et_pb_module et_d4_element et_pb_code et_pb_code_2\">\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"et_pb_code_inner\"><style>\n.ee-fa-head,\n.ee-fa-head * {\n  text-align: left !important;\n  direction: left !important;\n}\n<\/style><\/div>\n\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":297774,"parent":297655,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-297775","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/297775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/comments?post=297775"}],"version-history":[{"count":20,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/297775\/revisions"}],"predecessor-version":[{"id":304229,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/297775\/revisions\/304229"}],"up":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/pages\/297655"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/media\/297774"}],"wp:attachment":[{"href":"https:\/\/borhanifar.com\/en\/wp-json\/wp\/v2\/media?parent=297775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}