{"id":684,"date":"2026-01-13T11:14:31","date_gmt":"2026-01-13T11:14:31","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=684"},"modified":"2026-01-13T14:50:07","modified_gmt":"2026-01-13T14:50:07","slug":"ielts-reading-test-5","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/ielts-reading-test-5\/","title":{"rendered":"IELTs- Reading &#8211; Test 5"},"content":{"rendered":"\n<!-- \u2705 IELTS READING \u2013 TEST 5 (WP-SAFE SINGLE BLOCK) -->\n<div id=\"icte-reading-test5\">\n\n  <!-- \u2705 TOP GREEN MENU -->\n  <nav class=\"icte-menu\" aria-label=\"ICTE Reading menu\">\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-overview\/\">Overview<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-1\/\">Test 1<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-2\/\">Test 2<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-3\/\">Test 3<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-4\/\">Test 4<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-5\/\" class=\"is-current\">Test 5<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-listening-overview\/\">Listening<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-speaking-overview\/\">Speaking<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-writing-overview\/\">Writing<\/a>\n  <\/nav>\n\n  <!-- \u2705 GLOBAL CONTROLS -->\n  <section class=\"icte-ielts icte-ielts--top\" aria-label=\"Global controls\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">IELTS Reading \u2013 Test 5 (Questions 1\u201340)<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Complete all questions. Click <strong>Check Answers<\/strong> to see your score.\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Voice controls\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Read Aloud (optional)<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--danger\" type=\"button\" data-action=\"stop-audio\">\u23f9 Stop<\/button>\n          <span class=\"icte-loader\" data-el=\"synthesis-loader\" aria-hidden=\"true\"><\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__row\" style=\"align-items:flex-start;\">\n        <div class=\"icte-ielts__control\" style=\"flex:1; min-width:240px;\">\n          <label><strong>Voice<\/strong> (Narrator)<\/label>\n          <select data-el=\"voice-a\" aria-label=\"Select narrator voice\">\n            <option value=\"\">Loading voices&#8230;<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"icte-ielts__score\" data-el=\"overallScoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__btnRow\">\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-p1\">Go to Passage 1<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-p2\">Go to Passage 2<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-p3\">Go to Passage 3<\/button>\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       PASSAGE 1\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"p1\" data-section=\"p1\" aria-label=\"Reading Passage 1\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Reading Passage 1<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Passage: <strong>The Coconut Palm<\/strong>\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Passage 1 text\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Reading Passage 1<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-passage\">Hide Passage<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__reading\" data-el=\"passage-area\"><\/div>\n\n<div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight icte-ielts__btnRow--tools\">\n  <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"read-aloud\">\ud83d\udd0a Read Aloud (Passage 1)<\/button>\n\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"summary\">Summary<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"main-ideas\">Main ideas<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"keywords\">Keywords<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n<\/div>\n    <\/section>\n<section class=\"icte-ielts__panel\" aria-label=\"Helper tools\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Helper Tools<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          \n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\"><\/div>\n    <\/section>\n    \n    <section class=\"icte-ielts__panel\" aria-label=\"Questions Passage 1\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 1\u201313<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <div class=\"icte-ielts__score\" data-el=\"scoreBox\"><\/div>\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset-section\">Reset<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__qs\" data-el=\"questions-area\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"check-section\">\u2705 Check Answers (1\u201313)<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show-section\">\ud83d\udc41 Show Answers<\/button>\n      <\/div>\n    <\/section>\n\n    \n  <\/section>\n\n  <!-- =========================\n       PASSAGE 2\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"p2\" data-section=\"p2\" aria-label=\"Reading Passage 2\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Reading Passage 2<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Passage: <strong>How baby talk gives infant brains a boost<\/strong>\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Passage 2 text\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Reading Passage 2<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-passage\">Hide Passage<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__reading\" data-el=\"passage-area\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight icte-ielts__btnRow--tools\">\n  <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"read-aloud\">\ud83d\udd0a Read Aloud (Passage 2)<\/button>\n\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"summary\">Summary<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"main-ideas\">Main ideas<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"keywords\">Keywords<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n<\/div>\n    <\/section>\n<section class=\"icte-ielts__panel\" aria-label=\"Helper tools\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Helper Tools<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          \n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\"><\/div>\n    <\/section>\n    <section class=\"icte-ielts__panel\" aria-label=\"Questions Passage 2\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 14\u201326<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <div class=\"icte-ielts__score\" data-el=\"scoreBox\"><\/div>\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset-section\">Reset<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__qs\" data-el=\"questions-area\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"check-section\">\u2705 Check Answers (14\u201326)<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show-section\">\ud83d\udc41 Show Answers<\/button>\n      <\/div>\n    <\/section>\n\n    \n  <\/section>\n\n  <!-- =========================\n       PASSAGE 3\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"p3\" data-section=\"p3\" aria-label=\"Reading Passage 3\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Reading Passage 3<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Passage: <strong>Whatever happened to the Harappan Civilisation?<\/strong>\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Passage 3 text\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Reading Passage 3<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-passage\">Hide Passage<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__reading\" data-el=\"passage-area\"><\/div>\n\n<div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight icte-ielts__btnRow--tools\">\n  <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"read-aloud\">\ud83d\udd0a Read Aloud (Passage 3)<\/button>\n\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"summary\">Summary<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"main-ideas\">Main ideas<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"keywords\">Keywords<\/button>\n  <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n<\/div>\n    <\/section>\n <section class=\"icte-ielts__panel\" aria-label=\"Helper tools\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Helper Tools<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          \n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\"><\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Questions Passage 3\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 27\u201340<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <div class=\"icte-ielts__score\" data-el=\"scoreBox\"><\/div>\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset-section\">Reset<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__qs\" data-el=\"questions-area\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"check-section\">\u2705 Check Answers (27\u201340)<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show-section\">\ud83d\udc41 Show Answers<\/button>\n      <\/div>\n    <\/section>\n\n   \n  <\/section>\n\n  <!-- \u2705 STYLES (scoped) -->\n  <style>\n    #icte-reading-test5, #icte-reading-test5 *{ box-sizing:border-box; }\n    #icte-reading-test5{ width:100%; max-width:100%; margin:0; font-family:Arial,sans-serif; color:#0f172a; line-height:1.7; }\n\n    #icte-reading-test5 .icte-menu{\n      width:100%; max-width:100%;\n      display:flex; flex-wrap:wrap; gap:.5rem; justify-content:center; align-items:center;\n      padding:.75rem .9rem; margin:0 0 1rem 0;\n      background:#16a34a; border-radius:14px; box-shadow:0 2px 8px rgba(0,0,0,.10);\n    }\n    #icte-reading-test5 .icte-menu a{\n      display:inline-block; text-decoration:none; font-weight:900; font-size:.95rem; color:#fff;\n      padding:.55rem .85rem; border-radius:999px; border:1px solid rgba(255,255,255,.35);\n      background:rgba(255,255,255,.12);\n    }\n    #icte-reading-test5 .icte-menu a.is-current{ background:#fff; color:#16a34a; border-color:#fff; }\n    @media (max-width:600px){\n      #icte-reading-test5 .icte-menu{ justify-content:flex-start; }\n      #icte-reading-test5 .icte-menu a{ width:100%; text-align:center; }\n    }\n\n    #icte-reading-test5 .icte-ielts{ width:100%; margin:1rem 0; }\n    #icte-reading-test5 .icte-ielts__intro{\n      padding:.9rem 1rem; border:1px solid rgba(0,0,0,.10); border-radius:14px;\n      background:rgba(255,255,255,.7); margin-bottom:1rem;\n    }\n    #icte-reading-test5 .icte-ielts__title{ margin:0 0 .35rem; font-size:1.2rem; font-weight:900; }\n    #icte-reading-test5 .icte-ielts__sub{ margin:0; opacity:.85; }\n\n    #icte-reading-test5 .icte-ielts__panel{\n      border:1px solid rgba(0,0,0,.10); border-radius:14px; background:rgba(255,255,255,.85);\n      overflow:hidden; margin-bottom:1rem;\n    }\n    #icte-reading-test5 .icte-ielts__panelHead{\n      display:flex; align-items:center; justify-content:space-between; gap:.75rem;\n      padding:.85rem 1rem; border-bottom:1px solid rgba(0,0,0,.08); background:rgba(0,0,0,.03);\n      flex-wrap:wrap;\n    }\n    #icte-reading-test5 .icte-ielts__h3{ margin:0; font-size:1.03rem; font-weight:900; }\n    #icte-reading-test5 .icte-ielts__headRight{ display:flex; gap:.55rem; align-items:center; flex-wrap:wrap; }\n\n    #icte-reading-test5 .icte-ielts__reading{\n      padding:.95rem 1rem 1.05rem;\n      line-height:1.75;\n      max-height:520px;\n      overflow:auto;\n      white-space:pre-wrap;\n      background:rgba(255,255,255,.65);\n    }\n\n    #icte-reading-test5 .icte-ielts__row{\n      display:flex; justify-content:space-between; gap:.75rem;\n      padding:.85rem 1rem .25rem;\n      flex-wrap:wrap;\n    }\n    #icte-reading-test5 .icte-ielts__control label{ display:block; margin-bottom:.35rem; }\n    #icte-reading-test5 select{\n      width:100%; max-width:520px; padding:.6rem .7rem; border-radius:12px;\n      border:1px solid rgba(0,0,0,.18); background:#fff; font:inherit;\n    }\n\n    #icte-reading-test5 .icte-ielts__score{\n      font-weight:900; font-size:.95rem; opacity:.9; white-space:nowrap;\n      margin-top:.25rem;\n    }\n\n    #icte-reading-test5 .icte-ielts__btnRow{\n      padding:.75rem 1rem 1rem; display:flex; gap:.6rem; flex-wrap:wrap; align-items:center;\n    }\n    #icte-reading-test5 .icte-ielts__btnRow--tight{ padding-top:0; }\n\n    #icte-reading-test5 .icte-btn{\n      appearance:none; border:1px solid transparent; border-radius:12px;\n      padding:.65rem .85rem; font-weight:900; cursor:pointer; font:inherit;\n      transition: transform .12s ease, filter .12s ease;\n    }\n    #icte-reading-test5 .icte-btn:hover{ transform: translateY(-1px); filter: brightness(1.03); }\n    #icte-reading-test5 .icte-btn:active{ transform: translateY(0px) scale(0.99); }\n    #icte-reading-test5 .icte-btn:disabled{ opacity:.55; cursor:not-allowed; }\n\n    #icte-reading-test5 .icte-btn--info{ background:#0ea5e9; color:#fff; }\n    #icte-reading-test5 .icte-btn--danger{ background:#dc2626; color:#fff; }\n    #icte-reading-test5 .icte-btn--dark{ background:#334155; color:#fff; }\n    #icte-reading-test5 .icte-btn--ghost{ background:transparent; border-color:rgba(0,0,0,.20); color:inherit; }\n\n    #icte-reading-test5 .icte-loader{\n      width:18px; height:18px; border-radius:999px;\n      border:3px solid rgba(0,0,0,.15); border-top-color:#0ea5e9;\n      display:none; animation: icteSpin 1s linear infinite;\n    }\n    @keyframes icteSpin{ to{ transform: rotate(360deg); } }\n\n    #icte-reading-test5 .icte-ielts__helper{\n      padding:.95rem 1rem 1.05rem;\n      line-height:1.7;\n      overflow-wrap:anywhere;\n      word-break:break-word;\n      background:rgba(255,255,255,.65);\n    }\n    #icte-reading-test5 .icte-ielts__helper ul{ margin:.4rem 0 0 1.1rem; }\n    #icte-reading-test5 .icte-ielts__helper li{ margin:.35rem 0; }\n    #icte-reading-test5 .icte-ielts__helper .tag{\n      display:inline-block; padding:.15rem .5rem; border-radius:999px;\n      border:1px solid rgba(0,0,0,.12); background:rgba(255,255,255,.7);\n      font-weight:900; font-size:.85rem; margin-right:.4rem;\n    }\n\n    \/* \u2705 QUESTIONS UI *\/\n    #icte-reading-test5 .icte-ielts__qs{ padding:1rem; }\n    #icte-reading-test5 .q{\n      border:1px solid rgba(0,0,0,.10);\n      border-radius:12px;\n      padding:.75rem .85rem;\n      margin:.6rem 0;\n      background:rgba(255,255,255,.70);\n    }\n    #icte-reading-test5 .q__top{ display:flex; gap:.6rem; align-items:flex-start; flex-wrap:wrap; }\n    #icte-reading-test5 .q__num{\n      font-weight:900; background:rgba(14,165,233,.12);\n      border:1px solid rgba(14,165,233,.35);\n      padding:.15rem .5rem; border-radius:999px; white-space:nowrap;\n    }\n    #icte-reading-test5 .q__prompt{ flex:1; min-width:220px; }\n    #icte-reading-test5 .q__answerRow{ margin-top:.55rem; display:flex; gap:.6rem; flex-wrap:wrap; align-items:center; }\n    #icte-reading-test5 .q input[type=\"text\"]{\n      width:min(520px, 100%);\n      padding:.6rem .7rem; border-radius:12px;\n      border:1px solid rgba(0,0,0,.18);\n      background:#fff; font:inherit;\n    }\n    #icte-reading-test5 .q select{\n      width:min(520px, 100%);\n      padding:.6rem .7rem; border-radius:12px;\n      border:1px solid rgba(0,0,0,.18);\n      background:#fff; font:inherit;\n    }\n    #icte-reading-test5 .q__result{\n      font-weight:900; padding:.15rem .55rem; border-radius:999px;\n      border:1px solid rgba(0,0,0,.10);\n      background:rgba(0,0,0,.03);\n    }\n    #icte-reading-test5 .q.correct{ border-color: rgba(34,197,94,.45); background: rgba(34,197,94,.08); }\n    #icte-reading-test5 .q.incorrect{ border-color: rgba(239,68,68,.45); background: rgba(239,68,68,.08); }\n    #icte-reading-test5 .q .ansKey{\n      display:none;\n      padding:.2rem .55rem; border-radius:999px;\n      border:1px solid rgba(0,0,0,.12);\n      background:rgba(255,255,255,.85);\n      font-weight:900;\n    }\n    #icte-reading-test5 .q.show-ans .ansKey{ display:inline-block; }\n  <\/style>\n\n  <!-- \u2705 SCRIPT (voice + passage render + helper tools + questions + marking) -->\n  <script>\n    (function(){\n      const root = document.getElementById(\"icte-reading-test5\");\n      if (!root) return;\n\n      const $ = (sel, base=root) => base.querySelector(sel);\n\n      function showLoader(show){\n        const el = $('[data-el=\"synthesis-loader\"]');\n        if (el) el.style.display = show ? \"inline-block\" : \"none\";\n      }\n\n      const speechOk = (\"speechSynthesis\" in window);\n      let voicesAll = [];\n      let usableVoices = [];\n      let voiceA = null;\n      let playRunId = 0;\n\n      function stopSpeaking(){\n        if (!speechOk) return;\n        playRunId++;\n        window.speechSynthesis.cancel();\n        showLoader(false);\n      }\n\n      function say(text, voice, opts){\n        const myRun = playRunId;\n        const options = opts || {};\n        return new Promise((resolve) => {\n          if (!speechOk) return resolve();\n\n          const u = new SpeechSynthesisUtterance(String(text || \"\"));\n          u.lang  = options.lang  || (voice && voice.lang) || \"en-US\";\n          u.rate  = (typeof options.rate === \"number\") ? options.rate : 1.0;\n          u.pitch = (typeof options.pitch === \"number\") ? options.pitch : 1.0;\n          if (voice) u.voice = voice;\n\n          let done = false;\n          const finish = () => {\n            if (done) return;\n            done = true;\n            clearInterval(timer);\n            u.onend = null;\n            u.onerror = null;\n            resolve();\n          };\n\n          u.onend = finish;\n          u.onerror = finish;\n\n          const timer = setInterval(() => {\n            if (done) return;\n            if (playRunId !== myRun) return finish();\n            const speaking = window.speechSynthesis.speaking;\n            const pending  = window.speechSynthesis.pending;\n            if (!speaking && !pending) finish();\n          }, 120);\n\n          window.speechSynthesis.speak(u);\n        });\n      }\n\n      function populateVoices(){\n        if (!speechOk) return;\n        voicesAll = window.speechSynthesis.getVoices() || [];\n\n        const googleEnUSUK = voicesAll.filter(v => {\n          const name = (v.name || \"\").toLowerCase();\n          const lang = (v.lang || \"\").toLowerCase();\n          const isGoogle = name.includes(\"google\");\n          const isUSorUK = (lang === \"en-us\" || lang === \"en-gb\");\n          return isGoogle && isUSorUK;\n        });\n\n        usableVoices = googleEnUSUK.length ? googleEnUSUK : voicesAll;\n\n        const selA = $('[data-el=\"voice-a\"]');\n        if (!selA) return;\n\n        selA.innerHTML = \"\";\n        usableVoices.forEach((v, idx) => {\n          const o = document.createElement(\"option\");\n          o.value = String(idx);\n          o.textContent = `${v.name} (${v.lang})`;\n          selA.appendChild(o);\n        });\n\n        voiceA = usableVoices[0] || null;\n        if (voiceA) selA.value = \"0\";\n\n        selA.onchange = () => {\n          voiceA = usableVoices[Number(selA.value)] || usableVoices[0] || null;\n        };\n      }\n\n      function loadVoices(){\n        if (!speechOk) return;\n        const got = window.speechSynthesis.getVoices();\n        if (got && got.length) populateVoices();\n        else window.speechSynthesis.onvoiceschanged = populateVoices;\n      }\n\n      function togglePassage(sectionEl){\n        const area = $('[data-el=\"passage-area\"]', sectionEl);\n        const btn  = sectionEl.querySelector('button[data-action=\"toggle-passage\"]');\n        if (!area || !btn) return;\n        const isHidden = (area.style.display === \"none\");\n        area.style.display = isHidden ? \"block\" : \"none\";\n        btn.textContent = isHidden ? \"Hide Passage\" : \"Show Passage\";\n        if (isHidden) area.scrollIntoView({ behavior:\"smooth\", block:\"start\" });\n      }\n\n      function setHelper(sectionEl, builder){\n        const area = $('[data-el=\"helper-area\"]', sectionEl);\n        if (!area) return;\n        area.innerHTML = \"\";\n        builder(area);\n        area.scrollIntoView({ behavior:\"smooth\", block:\"start\" });\n      }\n\n      function clearSupport(sectionEl){\n        const area = $('[data-el=\"helper-area\"]', sectionEl);\n        if (area) area.innerHTML = 'Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.';\n      }\n\n      \/\/ ----------------------------\n      \/\/ \u2705 Normalization for answers\n      \/\/ ----------------------------\n      function norm(s){\n        return String(s || \"\")\n          .toLowerCase()\n          .trim()\n          .replace(\/[\u2019']\/g,\"'\")\n          .replace(\/-\/g,\" \")\n          .replace(\/[^\\w\\s]\/g,\"\")\n          .replace(\/\\s+\/g,\" \");\n      }\n\n      \/\/ ----------------------------\n      \/\/ \u2705 DATA: Passages + Helpers\n      \/\/ ----------------------------\n      const sections = {\n        p1: {\n          title: \"The Coconut Palm\",\n          passage: `READING PASSAGE 1\nThe Coconut Palm\n\nFor millennia, the coconut has been central to the lives of Polynesian and Asian peoples. In the western world, on the other hand, coconuts have always been exotic and unusual, sometimes rare. The Italian merchant traveller Marco Polo apparently saw coconuts in South Asia in the late 13th century, and among the mid-14th-century travel writings of Sir John Mandeville there is mention of 'great Notes of Ynde' (great Nuts of India). Today, images of palm-fringed tropical beaches are clich\u00e9s in the west to sell holidays, chocolate bars, fizzy drinks and even romance. Typically, we envisage coconuts as brown cannonballs that, when opened, provide sweet white flesh. But we see only part of the fruit and none of the plant from which they come.\n\nThe coconut palm has a smooth, slender, grey trunk, up to 30 metres tall. This is an important source of timber for building houses, and is increasingly being used as a replacement for endangered hardwoods in the furniture construction industry. The trunk is surmounted by a rosette of leaves, each of which may be up to six metres long. The leaves have hard veins in their centres which, in many parts of the world, are used as brushes after the green part of the leaf has been stripped away. Immature coconut flowers are tightly clustered together among the leaves at the top of the trunk. The flower stems may be tapped for their sap to produce a drink, and the sap can also be reduced by boiling to produce a type of sugar used for cooking.\n\nCoconut palms produce as many as seventy fruits per year, weighing more than a kilogram each. The wall of the fruit has three layers: a waterproof outer layer, a fibrous middle layer and a hard, inner layer. The thick fibrous middle layer produces coconut fibre, 'coir', which has numerous uses and is particularly important in manufacturing ropes. The woody innermost layer, the shell, with its three prominent 'eyes', surrounds the seed. An important product obtained from the shell is charcoal, which is widely used in various industries as well as in the home as a cooking fuel. When broken in half, the shells are also used as bowls in many parts of Asia.\n\nInside the shell are the nutrients (endosperm) needed by the developing seed. Initially, the endosperm is a sweetish liquid, coconut water, which is enjoyed as a drink, but also provides the hormones which encourage other plants to grow more rapidly and produce higher yields. As the fruit matures, the coconut water gradually solidifies to form the brilliant white, fat-rich, edible flesh or meat. Dried coconut flesh, 'copra', is made into coconut oil and coconut milk, which are widely used in cooking in different parts of the world, as well as in cosmetics. A derivative of coconut fat, glycerine, acquired strategic importance in a quite different sphere, as Alfred Nobel introduced the world to his nitroglycerine-based invention: dynamite.\n\nTheir biology would appear to make coconuts the great maritime voyagers and coastal colonizers of the plant world. The large, energy-rich fruits are able to float in water and tolerate salt, but cannot remain viable indefinitely: studies suggest after about 110 days at sea they are no longer able to germinate. Literally cast onto desert island shores, with little more than sand to grow in and exposed to the full glare of the tropical sun, coconut seeds are able to germinate and root. The air pocket in the seed, created as the endosperm solidifies, protects the embryo. In addition, the fibrous fruit wall that helped it to float during the voyage stores moisture that can be taken up by the roots of the coconut seedling as it starts to grow.\n\nThere have been centuries of academic debate over the origins of the coconut. There were no coconut palms in West Africa, the Caribbean or the east coast of the Americas before the voyages of the European explorers Vasco da Gama and Columbus in the late 15th and early 16th centuries. 16th century trade and human migration patterns reveal that Arab traders and European sailors are likely to have moved coconuts from South and Southeast Asia to Africa and then across the Atlantic to the east coast of America. But the origin of coconuts discovered along the west coast of America by 16th century sailors has been the subject of centuries of discussion. Two diametrically opposed origins have been proposed: that they came from Asia, or that they were native to America. Both suggestions have problems. In Asia, there is a large degree of coconut diversity and evidence of millennia of human use \u2014 but there are no relatives growing in the wild. In America, there are close coconut relatives, but no evidence that coconuts are indigenous. These problems have led to the intriguing suggestion that coconuts originated on coral islands in the Pacific and were dispersed from there.`,\n          summary: \"The passage describes the coconut palm\u2019s structure and many uses, explains how coconuts disperse by sea, and outlines debates about where coconuts originally came from.\",\n          mainIdeas: [\n            { tag:\"Uses\", text:\"Coconut palms provide timber, fibres (coir), fuel (charcoal), food\/drink (water, flesh, oil), and other products.\" },\n            { tag:\"Dispersal\", text:\"Coconuts can float and tolerate salt, but only remain viable for germination for a limited time at sea.\" },\n            { tag:\"Origins\", text:\"Evidence supports multiple hypotheses (Asia vs America vs Pacific islands), but each has unresolved problems.\" }\n          ],\n          keywords: [\n            { term:\"coir\", def:\"fibrous material from the coconut husk used for ropes and other products\" },\n            { term:\"endosperm\", def:\"nutritive tissue inside the seed; initially liquid (coconut water) then solid flesh\" },\n            { term:\"copra\", def:\"dried coconut flesh used to make oil and milk\" },\n            { term:\"viable\", def:\"able to live, develop, or germinate successfully\" },\n            { term:\"dispersed\", def:\"spread from one place to another (e.g., by sea travel)\" }\n          ]\n        },\n\n        p2: {\n          title: \"How baby talk gives infant brains a boost\",\n          passage: `READING PASSAGE 2\nHow baby talk gives infant brains a boost\n\nA The typical way of talking to a baby \u2014 high-pitched, exaggerated and repetitious \u2014 is a source of fascination for linguists who hope to understand how 'baby talk' impacts on learning. Most babies start developing their hearing while still in the womb, prompting some hopeful parents to play classical music to their pregnant bellies. Some research even suggests that infants are listening to adult speech as early as 10 weeks before being born, gathering the basic building blocks of their family's native tongue.\n\nB Early language exposure seems to have benefits to the brain \u2014 for instance, studies suggest that babies raised in bilingual homes are better at learning how to mentally prioritize information. So how does the sweet if sometimes absurd sound of infant-directed speech influence a baby's development? Here are some recent studies that explore the science behind baby talk.\n\nC Fathers don't use baby talk as often or in the same ways as mothers and that's perfectly OK, according to a new study. Mark VanDam of Washington State University at Spokane and colleagues equipped parents with recording devices and speech-recognition software to study the way they interacted with their youngsters during a normal day. 'We found that moms do exactly what you'd expect and what's been described many times over,' VanDam explains. 'But we found that dads aren't doing the same thing. Dads didn't raise their pitch or fundamental frequency when they talked to kids.' Their role may be rooted in what is called the bridge hypothesis, which dates back to 1975. It suggests that fathers use less familial language to provide their children with a bridge to the kind of speech they'll hear in public. 'The idea is that a kid gets to practice a certain kind of speech with mom and another kind of speech with dad, so the kid then has a wider repertoire of kinds of speech to practice,' says VanDam.\n\nD Scientists from the University of Washington and the University of Connecticut collected thousands of 30-second conversations between parents and their babies, fitting 26 children with audio-recording vests that captured language and sound during a typical eight-hour day. The study found that the more baby talk parents used, the more their youngsters began to babble. And when researchers saw the same babies at age two, they found that frequent baby talk had dramatically boosted vocabulary, regardless of socioeconomic status. 'Those children who listened to a lot of baby talk were talking more than the babies that listened to more adult talk or standard speech,' says Nairan Ramirez-Esparza of the University of Connecticut. 'We also found that it really matters whether you use baby talk in a one-on-one context,' she adds. 'The more parents use baby talk one-on-one, the more babies babble, and the more they babble, the more words they produce later in life.'\n\nE Another study suggests that parents might want to pair their youngsters up so they can babble more with their own kind. Researchers from McGill University and Universit\u00e9 du Qu\u00e9bec \u00e0 Montr\u00e9al found that babies seem to like listening to each other rather than to adults \u2014 which may be why baby talk is such a universal tool among parents. They played repeating vowel sounds made by a special synthesizing device that mimicked sounds made by either an adult woman or another baby. This way, only the impact of the auditory cues was observed. The team then measured how long each type of sound held the infants' attention. They found that the 'infant' sounds held babies' attention nearly 40 percent longer. The baby noises also induced more reactions in the listening infants, like smiling or lip moving, which approximates sound making. The team theorizes that this attraction to other infant sounds could help launch the learning process that leads to speech.\n\nF In a study published in Proceedings of the National Academy of Sciences, a total of 57 babies from two slightly different age groups \u2014 seven months and eleven and a half months \u2014 were played a number of syllables from both their native language (English) and a non-native tongue (Spanish). The infants were placed in a brain-activation scanner that recorded activity in a brain region known to guide the motor movements that produce speech. The results suggest that listening to baby talk prompts infant brains to start practicing their language skills. 'Finding activation in motor areas of the brain when infants are simply listening is significant, because it means the baby brain is engaged in trying to talk back right from the start...' says co-author Patricia Kuhl. Another interesting finding was that while the seven-month-olds responded to all speech sounds regardless of language, the brains of the older infants worked harder at the motor activations of non-native sounds compared to native sounds.`,\n          summary: \"The passage reviews studies showing infant-directed speech supports babbling, vocabulary growth, attention, and brain activity linked to learning speech; fathers may contribute differently via the \u2018bridge hypothesis\u2019.\",\n          mainIdeas: [\n            { tag:\"Early input\", text:\"Infants are exposed to speech before birth; early language input relates to later cognitive\/language benefits.\" },\n            { tag:\"Baby talk effects\", text:\"More one-on-one baby talk correlates with more babbling and larger vocabulary later.\" },\n            { tag:\"Different roles\", text:\"Fathers may use less \u2018baby talk\u2019 to bridge children toward public\/adult speech patterns.\" },\n            { tag:\"Brain evidence\", text:\"Neuroimaging suggests listening activates motor regions involved in producing speech.\" }\n          ],\n          keywords: [\n            { term:\"infant-directed speech\", def:\"speech style used with babies (higher pitch, exaggerated, repetitive)\" },\n            { term:\"babble\", def:\"early speech-like sounds produced by infants\" },\n            { term:\"bridge hypothesis\", def:\"idea that fathers provide exposure to more public\/adult-like speech\" },\n            { term:\"socioeconomic status\", def:\"social and economic position (income\/education etc.)\" },\n            { term:\"motor activations\", def:\"brain activity related to movement control (here, speech production)\" }\n          ]\n        },\n\n        p3: {\n          title: \"Whatever happened to the Harappan Civilisation?\",\n          passage: `READING PASSAGE 3\nWhatever happened to the Harappan Civilisation?\nNew research sheds light on the disappearance of an ancient society\n\nA The Harappan Civilisation of ancient Pakistan and India flourished 5,000 years ago, but a thousand years later their cities were abandoned. The Harappan Civilisation was a sophisticated Bronze Age society who built 'megacities' and traded internationally in luxury craft products, and yet seemed to have left almost no depictions of themselves.\n\nB 'There is plenty of archaeological evidence to tell us about the rise of the Harappan Civilisation, but relatively little about its fall,' explains archaeologist Dr Cameron Petrie of the University of Cambridge. As populations increased, cities were built that had great baths, craft workshops, palaces and halls laid out in distinct sectors. Houses were arranged in blocks, with wide main streets and narrow alleyways, and many had their own wells and drainage systems. Then around 2100 BC, a transformation began. Streets went uncleaned, buildings started to be abandoned, and ritual structures fell out of use.\n\nC Some have claimed that major glacier-fed rivers changed their course, dramatically affecting the water supply and agriculture; or that the cities could not cope with an increasing population; or that climate change caused an environmental change that affected food and water provision. 'It is unlikely that there was a single cause for the decline of the civilisation,' said Petrie.\n\nD A research team led by Petrie, together with Dr Ravindanath Singh, found early in their investigations that many archaeological sites were not where they were supposed to be. They found inaccuracies in the published geographic locations of ancient settlements ranging from several hundred metres to many kilometres. Over the course of several seasons of fieldwork, they carried out new surveys, finding an astonishing 198 settlement sites that were previously unknown.\n\nE Research published by Dr Yama Dixit and Professor David Hodell has provided the first definitive evidence for climate change affecting the plains of north-western India. The researchers gathered shells of Melanoides tuberculata snails from the sediments of an ancient lake and used geochemical analysis to trace climate history. They observed an abrupt change about 4,100 years ago, when evaporation from the lake exceeded rainfall, indicative of a drought.\n\nF It has long been thought that other great Bronze Age civilisations also declined at a similar time. Singh explains that it is essential to obtain more climate data from areas close to the two great cities at Mohenjodaro and Harappa.\n\nG Petrie and Singh's team is now examining archaeological records and trying to understand details of how people led their lives five millennia ago. They are analysing grains cultivated at the time to see if they were grown under extreme water stress and looking at whether types of pottery were distinctive to specific regions.\n\nH Petrie believes that archaeologists are in a unique position to investigate how past societies responded to environmental change. By investigating responses to environmental pressures, we can learn to be more proactive in issues such as water supply management and preserving cultural heritage in the future.`,\n          summary: \"The passage explains that the Harappan civilisation declined for multiple reasons, with new surveys and climate evidence (drought) helping researchers reassess settlement patterns and environmental pressures.\",\n          mainIdeas: [\n            { tag:\"Rise & decline\", text:\"Cities expanded with strong infrastructure, then signs of breakdown appeared around 2100 BC.\" },\n            { tag:\"Multiple causes\", text:\"Researchers argue decline likely resulted from combined pressures (rivers, population, climate).\" },\n            { tag:\"New fieldwork\", text:\"Correcting site locations and discovering many new settlements changes the evidence base.\" },\n            { tag:\"Climate evidence\", text:\"Geochemical data from lake sediments indicates drought conditions about 4,100 years ago.\" }\n          ],\n          keywords: [\n            { term:\"Harappan\", def:\"relating to the Indus Valley civilisation in ancient Pakistan\/India\" },\n            { term:\"megacities\", def:\"very large urban centres\" },\n            { term:\"geochemical analysis\", def:\"chemical testing of materials to reconstruct past environmental conditions\" },\n            { term:\"evaporation\", def:\"process of liquid water turning into vapor; used as drought indicator here\" },\n            { term:\"water stress\", def:\"conditions where plants\/crops lack sufficient water\" }\n          ]\n        }\n      };\n\n      \/\/ ----------------------------\n      \/\/ \u2705 QUESTIONS + ANSWERS (1\u201340)\n      \/\/ Source: your uploaded PDFs\n      \/\/ ----------------------------\n      const Q = {\n        p1: [\n          { num: 1, type:\"text\", prompt:\"Part: trunk - up to 30 metres timber for houses and the making of ________.\", accept:[\"furniture\"] },\n          { num: 2, type:\"text\", prompt:\"Flowers: at the top of the trunk, stems provide used as a drink or a source of ________.\", accept:[\"sugar\"] },\n          { num: 3, type:\"text\", prompt:\"Fruits: coir fibres are used for ________, etc.\", accept:[\"ropes\",\"rope\"] },\n          { num: 4, type:\"text\", prompt:\"inner layer: the shell is a source of ________.\", accept:[\"charcoal\"] },\n          { num: 5, type:\"text\", prompt:\" when halved, shells are used as ________.\", accept:[\"bowls\",\"bowl\"] },\n          { num: 6, type:\"text\", prompt:\"a drink: coconut water is a source of ________ for other plants.\", accept:[\"hormones\",\"hormone\"] },\n          { num: 7, type:\"text\", prompt:\"coconut flesh: oil and milk for cooking and ________.\", accept:[\"cosmetics\",\"cosmetic\"] },\n          { num: 8, type:\"text\", prompt:\"glycerine is an ingredient in ________.\", accept:[\"dynamite\"] },\n\n          { num: 9, type:\"tfng\", prompt:\"Coconut seeds need shade in order to germinate.\", answer:\"FALSE\" },\n          { num:10, type:\"tfng\", prompt:\"Coconuts were probably transported to Asia from America in the 16th century.\", answer:\"FALSE\" },\n          { num:11, type:\"tfng\", prompt:\"The coconuts found on the west coast of America were a different type from those found on the east coast.\", answer:\"NOT GIVEN\" },\n          { num:12, type:\"tfng\", prompt:\"All the coconuts found in Asia are cultivated varieties.\", answer:\"TRUE\" },\n          { num:13, type:\"tfng\", prompt:\"Coconuts are cultivated in different ways in America and the Pacific.\", answer:\"NOT GIVEN\" }\n        ],\n\n        p2: [\n          { num:14, type:\"abc\", prompt:\"Match the finding: The importance of adults giving babies individual attention when talking to them.\", options:[\"A\",\"B\",\"C\"], answer:\"B\" },\n          { num:15, type:\"abc\", prompt:\"Match the finding: The connection between what babies hear and their own efforts to create speech.\", options:[\"A\",\"B\",\"C\"], answer:\"C\" },\n          { num:16, type:\"abc\", prompt:\"Match the finding: The advantage for the baby of having two parents each speaking in a different way.\", options:[\"A\",\"B\",\"C\"], answer:\"A\" },\n          { num:17, type:\"abc\", prompt:\"Match the finding: The connection between the amount of baby talk babies hear and how much vocalising they do themselves.\", options:[\"A\",\"B\",\"C\"], answer:\"B\" },\n\n          { num:18, type:\"text\", prompt:\"Complete the summary: Researchers used ________ together with speech-recognition software.\", accept:[\"recording devices\",\"recording device\"] },\n          { num:19, type:\"text\", prompt:\"Complete the summary: ...the researchers found that ________ tended not to modify their pitch...\", accept:[\"fathers\",\"dads\",\"fathers dads\",\"fathers\/dads\"] },\n          { num:20, type:\"text\", prompt:\"Complete the summary: This is linked to an idea known as the ________.\", accept:[\"bridge hypothesis\"] },\n          { num:21, type:\"text\", prompt:\"Complete the summary: ...a wider ________ of types of speech...\", accept:[\"repertoire\"] },\n          { num:22, type:\"text\", prompt:\"Complete the summary: ...babies were equipped with special ________.\", accept:[\n            \"audio recording vests\",\"audio recording vest\",\"audiorecording vests\",\"audiorecording vest\",\n            \"audio recording\",\"recording vests\",\"recording vest\",\"vests\",\"vest\"\n          ]},\n          { num:23, type:\"text\", prompt:\"Complete the summary: ...they had a much larger ________ than those who had not.\", accept:[\"vocabulary\"] },\n\n          { num:24, type:\"af\", prompt:\"Which paragraph contains: A reference to a change which occurs in babies\u2019 brain activity before the end of their first year.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\"], answer:\"F\" },\n          { num:25, type:\"af\", prompt:\"Which paragraph contains: An example of what some parents do for their baby\u2019s benefit before birth.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\"], answer:\"A\" },\n          { num:26, type:\"af\", prompt:\"Which paragraph contains: A mention of babies\u2019 preference for the sounds that other babies make.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\"], answer:\"E\" }\n        ],\n\n        p3: [\n          { num:27, type:\"ah\", prompt:\"Which paragraph contains: Proposed explanations for the decline of the Harappan Civilisation.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\"], answer:\"C\" },\n          { num:28, type:\"ah\", prompt:\"Which paragraph contains: Reference to a present-day application of some archaeological research findings.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\"], answer:\"H\" },\n          { num:29, type:\"ah\", prompt:\"Which paragraph contains: A difference between the Harappan Civilisation and another culture of the same period.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\"], answer:\"A\" },\n          { num:30, type:\"ah\", prompt:\"Which paragraph contains: A description of some features of Harappan urban design.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\"], answer:\"B\" },\n          { num:31, type:\"ah\", prompt:\"Which paragraph contains: Reference to the discovery of errors made by previous archaeologists.\", options:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\"], answer:\"D\" },\n\n          { num:32, type:\"text\", prompt:\"Complete the summary: ...collecting the ________ of snails...\", accept:[\"shells\",\"shell\"] },\n          { num:33, type:\"text\", prompt:\"Complete the summary: ...from the sediments of an ancient ________.\", accept:[\"lake\"] },\n          { num:34, type:\"text\", prompt:\"Complete the summary: ...less ________ than evaporation...\", accept:[\"rainfall\"] },\n          { num:35, type:\"text\", prompt:\"Complete the summary: ...look at ________ from five millennia ago...\", accept:[\"grains\",\"grain\"] },\n          { num:36, type:\"text\", prompt:\"Complete the summary: ...including ________...\", accept:[\"pottery\"] },\n\n          { num:37, type:\"abcd\", prompt:\"Match statement: Finding further information about changes to environmental conditions in the region is vital.\", options:[\"A\",\"B\",\"C\",\"D\"], answer:\"B\" },\n          { num:38, type:\"abcd\", prompt:\"Match statement: Examining previous patterns of behaviour may have long-term benefits.\", options:[\"A\",\"B\",\"C\",\"D\"], answer:\"A\" },\n          { num:39, type:\"abcd\", prompt:\"Match statement: Rough calculations indicate the approximate length of a period of water shortage.\", options:[\"A\",\"B\",\"C\",\"D\"], answer:\"D\" },\n          { num:40, type:\"abcd\", prompt:\"Match statement: Information about the decline of the Harappan Civilisation has been lacking.\", options:[\"A\",\"B\",\"C\",\"D\"], answer:\"A\" }\n        ]\n      };\n\n      \/\/ ----------------------------\n      \/\/ \u2705 RENDER QUESTIONS\n      \/\/ ----------------------------\n      function renderQuestions(sectionKey){\n        const secEl = root.querySelector('[data-section=\"'+sectionKey+'\"]');\n        if (!secEl) return;\n        const area = $('[data-el=\"questions-area\"]', secEl);\n        if (!area) return;\n\n        area.innerHTML = \"\";\n        (Q[sectionKey] || []).forEach(item => {\n          const q = document.createElement(\"div\");\n          q.className = \"q\";\n          q.setAttribute(\"data-qnum\", String(item.num));\n\n          const top = document.createElement(\"div\");\n          top.className = \"q__top\";\n\n          const num = document.createElement(\"div\");\n          num.className = \"q__num\";\n          num.textContent = \"Q\" + item.num;\n\n          const prompt = document.createElement(\"div\");\n          prompt.className = \"q__prompt\";\n          prompt.textContent = item.prompt;\n\n          top.appendChild(num);\n          top.appendChild(prompt);\n          q.appendChild(top);\n\n          const row = document.createElement(\"div\");\n          row.className = \"q__answerRow\";\n\n          let input;\n          if (item.type === \"text\"){\n            input = document.createElement(\"input\");\n            input.type = \"text\";\n            input.placeholder = \"Type your answer\";\n            input.setAttribute(\"data-qinput\", String(item.num));\n          } else if (item.type === \"tfng\"){\n            input = document.createElement(\"select\");\n            input.setAttribute(\"data-qinput\", String(item.num));\n            [\"\",\"TRUE\",\"FALSE\",\"NOT GIVEN\"].forEach(v=>{\n              const o=document.createElement(\"option\");\n              o.value=v; o.textContent = v ? v : \"Select TRUE \/ FALSE \/ NOT GIVEN\";\n              input.appendChild(o);\n            });\n          } else {\n            \/\/ A\/B\/C\/D\/E\/F\/H etc\n            input = document.createElement(\"select\");\n            input.setAttribute(\"data-qinput\", String(item.num));\n            const first = document.createElement(\"option\");\n            first.value = \"\";\n            first.textContent = \"Select a letter\";\n            input.appendChild(first);\n\n            (item.options || []).forEach(v=>{\n              const o=document.createElement(\"option\");\n              o.value=v; o.textContent=v;\n              input.appendChild(o);\n            });\n          }\n\n          const res = document.createElement(\"span\");\n          res.className = \"q__result\";\n          res.textContent = \"Not checked\";\n\n          const key = document.createElement(\"span\");\n          key.className = \"ansKey\";\n          const correctDisplay = item.answer ? item.answer : (item.accept ? item.accept[0] : \"\");\n          key.textContent = \"Answer: \" + correctDisplay;\n\n          row.appendChild(input);\n          row.appendChild(res);\n          row.appendChild(key);\n\n          q.appendChild(row);\n          area.appendChild(q);\n        });\n      }\n\n      function getCorrect(item){\n        if (item.type === \"text\"){\n          const acc = (item.accept || []).map(norm).filter(Boolean);\n          return { type:\"text\", acceptNorm: acc, display: (item.accept && item.accept[0]) ? item.accept[0] : \"\" };\n        }\n        return { type:\"select\", answer: String(item.answer || \"\").trim(), display: String(item.answer || \"\").trim() };\n      }\n\n      function checkSection(sectionKey){\n        const secEl = root.querySelector('[data-section=\"'+sectionKey+'\"]');\n        if (!secEl) return;\n\n        let correct = 0;\n        let total = 0;\n\n        (Q[sectionKey] || []).forEach(item => {\n          total++;\n          const qEl = secEl.querySelector('.q[data-qnum=\"'+item.num+'\"]');\n          const inp = secEl.querySelector('[data-qinput=\"'+item.num+'\"]');\n          const res = qEl ? qEl.querySelector(\".q__result\") : null;\n          if (!qEl || !inp || !res) return;\n\n          qEl.classList.remove(\"correct\",\"incorrect\");\n          const c = getCorrect(item);\n\n          let ok = false;\n          if (c.type === \"text\"){\n            const user = norm(inp.value);\n            ok = c.acceptNorm.includes(user);\n          } else {\n            ok = String(inp.value || \"\").trim().toUpperCase() === c.answer.toUpperCase();\n          }\n\n          if (ok){\n            correct++;\n            qEl.classList.add(\"correct\");\n            res.textContent = \"Correct \u2705\";\n          } else {\n            qEl.classList.add(\"incorrect\");\n            res.textContent = \"Incorrect \u274c\";\n          }\n        });\n\n        const box = $('[data-el=\"scoreBox\"]', secEl);\n        if (box) box.textContent = `Score: ${correct}\/${total}`;\n\n        updateOverallScore();\n      }\n\n      function showAnswers(sectionKey, show){\n        const secEl = root.querySelector('[data-section=\"'+sectionKey+'\"]');\n        if (!secEl) return;\n        secEl.querySelectorAll(\".q\").forEach(qEl=>{\n          if (show) qEl.classList.add(\"show-ans\");\n          else qEl.classList.remove(\"show-ans\");\n        });\n      }\n\n      function resetSection(sectionKey){\n        const secEl = root.querySelector('[data-section=\"'+sectionKey+'\"]');\n        if (!secEl) return;\n\n        (Q[sectionKey] || []).forEach(item => {\n          const inp = secEl.querySelector('[data-qinput=\"'+item.num+'\"]');\n          const qEl = secEl.querySelector('.q[data-qnum=\"'+item.num+'\"]');\n          if (inp){\n            if (inp.tagName === \"SELECT\") inp.value = \"\";\n            else inp.value = \"\";\n          }\n          if (qEl){\n            qEl.classList.remove(\"correct\",\"incorrect\",\"show-ans\");\n            const res = qEl.querySelector(\".q__result\");\n            if (res) res.textContent = \"Not checked\";\n          }\n        });\n\n        const box = $('[data-el=\"scoreBox\"]', secEl);\n        if (box) box.textContent = \"\";\n        updateOverallScore();\n      }\n\n      function updateOverallScore(){\n        const box = $('[data-el=\"overallScoreBox\"]');\n        if (!box) return;\n\n        let total = 0;\n        let got = 0;\n\n        [\"p1\",\"p2\",\"p3\"].forEach(k=>{\n          (Q[k] || []).forEach(item=>{\n            total++;\n            const secEl = root.querySelector('[data-section=\"'+k+'\"]');\n            if (!secEl) return;\n            const inp = secEl.querySelector('[data-qinput=\"'+item.num+'\"]');\n            if (!inp) return;\n            const c = getCorrect(item);\n\n            let ok = false;\n            if (c.type === \"text\"){\n              ok = c.acceptNorm.includes(norm(inp.value));\n            } else {\n              ok = String(inp.value || \"\").trim().toUpperCase() === c.answer.toUpperCase();\n            }\n            if (ok) got++;\n          });\n        });\n\n        box.textContent = `Overall (auto): ${got}\/${total}`;\n      }\n\n      async function readAloud(sectionKey){\n        const sec = sections[sectionKey];\n        if (!sec) return;\n        if (!speechOk) return;\n\n        stopSpeaking();\n        showLoader(true);\n\n        const myRun = ++playRunId;\n\n        await say(\"Now read the passage.\", voiceA || null, { lang:\"en-US\" });\n        if (playRunId !== myRun) { showLoader(false); return; }\n\n        const text = String(sec.passage || \"\").replace(\/\\s+\/g,\" \").trim();\n        const chunks = [];\n        const max = 850;\n        for (let i=0; i<text.length; i+=max) chunks.push(text.slice(i, i+max));\n\n        for (const ch of chunks){\n          if (playRunId !== myRun) { showLoader(false); return; }\n          await say(ch, voiceA || null, { lang:\"en-US\", rate:1.0, pitch:1.0 });\n        }\n\n        showLoader(false);\n      }\n\n      function showSummary(sectionKey){\n        const secEl = root.querySelector('[data-section=\"'+sectionKey+'\"]');\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Summary\";\n          p.appendChild(tag);\n          p.append(\" \" + (sec.summary || \"\"));\n          area.appendChild(p);\n        });\n\n        if (speechOk){\n          stopSpeaking();\n          showLoader(true);\n          say(\"Summary. \" + (sec.summary || \"\"), voiceA || null, { lang:\"en-US\" })\n            .then(()=>showLoader(false));\n        }\n      }\n\n      function showMainIdeas(sectionKey){\n        const secEl = root.querySelector('[data-section=\"'+sectionKey+'\"]');\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Main ideas\";\n          p.appendChild(tag);\n          p.append(\" Key points:\");\n          area.appendChild(p);\n\n          const ul = document.createElement(\"ul\");\n          (sec.mainIdeas || []).forEach(i => {\n            const li = document.createElement(\"li\");\n            const t = document.createElement(\"span\");\n            t.className = \"tag\";\n            t.textContent = i.tag || \"Point\";\n            li.appendChild(t);\n            li.append(i.text || \"\");\n            ul.appendChild(li);\n          });\n          area.appendChild(ul);\n        });\n      }\n\n      function showKeywords(sectionKey){\n        const secEl = root.querySelector('[data-section=\"'+sectionKey+'\"]');\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Keywords\";\n          p.appendChild(tag);\n          p.append(\" Key vocabulary for this passage:\");\n          area.appendChild(p);\n\n          const ul = document.createElement(\"ul\");\n          (sec.keywords || []).forEach(k => {\n            const li = document.createElement(\"li\");\n            li.innerHTML = \"<strong>\" + (k.term || \"\") + \"<\/strong>: \" + (k.def || \"\");\n            ul.appendChild(li);\n          });\n          area.appendChild(ul);\n        });\n      }\n\n      function renderPassages(){\n        [\"p1\",\"p2\",\"p3\"].forEach(k => {\n          const secEl = root.querySelector('[data-section=\"'+k+'\"]');\n          if (!secEl) return;\n          const area = $('[data-el=\"passage-area\"]', secEl);\n          if (area) area.textContent = sections[k].passage || \"\";\n          clearSupport(secEl);\n        });\n      }\n\n      function wire(){\n        root.addEventListener(\"click\", (e) => {\n          const btn = e.target.closest(\"button[data-action]\");\n          if (!btn) return;\n\n          const action = btn.getAttribute(\"data-action\");\n          const secEl = btn.closest(\"[data-section]\");\n          const sectionKey = secEl ? secEl.getAttribute(\"data-section\") : null;\n\n          if (action === \"stop-audio\") return stopSpeaking();\n          if (action === \"scroll-p1\") return document.getElementById(\"p1\")?.scrollIntoView({behavior:\"smooth\"});\n          if (action === \"scroll-p2\") return document.getElementById(\"p2\")?.scrollIntoView({behavior:\"smooth\"});\n          if (action === \"scroll-p3\") return document.getElementById(\"p3\")?.scrollIntoView({behavior:\"smooth\"});\n\n          if (!sectionKey) return;\n\n          if (action === \"toggle-passage\") return togglePassage(secEl);\n          if (action === \"read-aloud\") return readAloud(sectionKey);\n          if (action === \"summary\") return showSummary(sectionKey);\n          if (action === \"main-ideas\") return showMainIdeas(sectionKey);\n          if (action === \"keywords\") return showKeywords(sectionKey);\n          if (action === \"clear-support\") return clearSupport(secEl);\n\n          if (action === \"check-section\") return checkSection(sectionKey);\n          if (action === \"show-section\") {\n            const anyShowing = secEl.querySelector(\".q.show-ans\");\n            return showAnswers(sectionKey, !anyShowing);\n          }\n          if (action === \"reset-section\") return resetSection(sectionKey);\n        });\n\n        root.addEventListener(\"input\", (e) => {\n          const target = e.target;\n          if (!target) return;\n          if (target.matches('[data-qinput]')) updateOverallScore();\n        });\n      }\n\n      function init(){\n        loadVoices();\n        renderPassages();\n\n        \/\/ render questions for all sections\n        [\"p1\",\"p2\",\"p3\"].forEach(k=>{\n          renderQuestions(k);\n          const secEl = root.querySelector('[data-section=\"'+k+'\"]');\n          const area = $('[data-el=\"passage-area\"]', secEl);\n          const btn  = secEl.querySelector('button[data-action=\"toggle-passage\"]');\n          if (area) area.style.display = \"block\";\n          if (btn) btn.textContent = \"Hide Passage\";\n          clearSupport(secEl);\n        });\n\n        wire();\n        updateOverallScore();\n      }\n\n      if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n      else init();\n    })();\n  <\/script>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Overview Test 1 Test 2 Test 3 Test 4 Test 5 Listening Speaking Writing IELTS Reading \u2013 Test 5 (Questions<\/p>\n","protected":false},"author":1,"featured_media":671,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[25,26,35],"tags":[],"class_list":["post-684","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ielts","category-reading","category-test-5"],"_links":{"self":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/comments?post=684"}],"version-history":[{"count":6,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/684\/revisions"}],"predecessor-version":[{"id":690,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/684\/revisions\/690"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/671"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}