{"id":4594,"date":"2026-06-24T00:50:07","date_gmt":"2026-06-24T00:50:07","guid":{"rendered":"https:\/\/allenglish4u.com\/cambridge-flyers-1-test-1-listening\/"},"modified":"2026-07-05T02:44:03","modified_gmt":"2026-07-05T02:44:03","slug":"cambridge-flyers-1-test-1-listening","status":"publish","type":"page","link":"https:\/\/allenglish4u.com\/vi\/cambridge-flyers-1-test-1-listening\/","title":{"rendered":"Cambridge Flyers 1 Test 1 Listening"},"content":{"rendered":"\n<!--\n================================================================\nAE4U &#183; YLE STARTERS LISTENING &#8212; TEMPLATE\n4 parts &#183; 20 questions &#183; ~20 mins\nPart 1: Pair \/ Draw lines (SVG)\nPart 2: Listen and write a name or a number (input blanks)\nPart 3: Listen and tick the box (MCQ 3 picture options)\nPart 4: Listen and colour (SVG colour palette)\n\nINPUT placeholders to replace per test (search-and-replace):\n  {{TEST_NUM}}        e.g. 1\n  {{TEST_TITLE}}      e.g. \"Flyers 1 &#8212; Test 1\"\n  {{YT_VIDEO_ID}}     e.g. \"PKs0mV9yCkw\"\n  {{YT_PLAYLIST}}     optional list= param (or empty)\n  {{P1_IMG_URL}}      scene image URL for Part 1 (with example line)\n  {{P1_NAMES}}        array of {n, name, ans} &#8212; 5 questions + example\n  {{P1_TARGETS}}      array of {key, label, x, y} &#8212; items in scene (anchor points in %)\n  {{P2_INTRO}}        intro line for Part 2 (e.g. \"Listen to Sam talking...\")\n  {{P2_EXAMPLES}}     example rows (e.g. name=Sam, age=10)\n  {{P2_QUESTIONS}}    array of {n, label, prefix?, suffix?, accepted[], display}\n  {{P3_INTRO}}        intro line for Part 3 (e.g. \"What's Bill doing? Example: B\")\n  {{P3_EXAMPLE_IMG}}  example row image (or split A\/B\/C)\n  {{P3_QUESTIONS}}    array of {n, q, opts:[{letter,img,alt}], ans}\n  {{P4_INTRO}}        intro line for Part 4 (e.g. scene description)\n  {{P4_SVG}}          inline SVG of scene with <g data-region=\"key\"> regions\n  {{P4_ITEMS}}        array of {n, instruction, region, colour}\n  {{P4_COLOURS}}      palette array of colours (default: 8 YLE colours)\n  {{TRANSCRIPT_P1}}..{{TRANSCRIPT_P4}}  transcript text per part\n================================================================\n-->\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400%3B500%3B600%3B700%3B800&family=Fraunces:opsz,wght@9..144,700&display=swap');\n\n.entry-content,.wp-block-post-content,.is-layout-constrained{max-width:none !important;width:auto !important;margin-left:0 !important;margin-right:0 !important;padding-left:0 !important;padding-right:0 !important;}\n.wp-block-post-title{display:none !important;}\n\n:root{\n  --accent-1:#10B981; --accent-2:#0EA5E9; --purple:#8B5CF6;\n  --gold:#FBBF24; --green:#10B981; --red:#EF4444;\n  --light-1:#ECFEFF; --light-2:#F0F9FF; --white:#FFFFFF;\n  --text:#0F172A; --muted:#475569; --subtle:#64748B; --border:#E2E8F0;\n  --dark-1:#0C1322;\n  --r-10:10px; --r-16:16px; --r-22:22px;\n  --sh-card:0 2px 8px rgba(0,0,0,.06); --sh-lg:0 12px 40px rgba(0,0,0,.12);\n}\n*{margin:0;padding:0;box-sizing:border-box}\nhtml{scroll-behavior:smooth}\nbody{font-family:'Plus Jakarta Sans',system-ui,sans-serif;color:var(--text);background:var(--light-2);-webkit-font-smoothing:antialiased;overflow-x:hidden}\n.serif{font-family:'Fraunces',Georgia,serif;font-weight:700;letter-spacing:-.01em}\n.wrap{max-width:1080px;margin:0 auto;padding:0 24px}\na{color:inherit;text-decoration:none}\nbutton{font-family:inherit;cursor:pointer;border:none;background:none}\n\n.header{position:fixed;top:0;left:0;right:0;z-index:100;transition:background .28s ease;border-bottom:1px solid transparent}\n.header.solid{background:rgba(255,255,255,.92);backdrop-filter:saturate(180%) blur(16px);border-bottom:1px solid var(--border)}\n.header-inner{display:flex;align-items:center;gap:28px;height:72px;max-width:1200px;margin:0 auto;padding:0 24px}\n.brand{display:flex;align-items:center;gap:11px;flex-shrink:0}\n.brand img{width:40px;height:40px;border-radius:11px;object-fit:cover;box-shadow:var(--sh-card)}\n.brand-name{font-weight:800;font-size:18px;color:#fff;transition:color .28s ease}\n.header.solid .brand-name{color:var(--text)}\n.nav{display:flex;align-items:center;gap:4px;margin-left:8px}\n.nav a{padding:9px 13px;font-size:14.5px;font-weight:600;color:rgba(255,255,255,.82);border-radius:var(--r-10);transition:all .16s ease}\n.nav a:hover{color:#fff;background:rgba(255,255,255,.08)}\n.header.solid .nav a{color:var(--muted)}\n.header.solid .nav a:hover{color:var(--text);background:var(--light-1)}\n.header-right{margin-left:auto;display:flex;align-items:center;gap:10px}\n.btn-back{display:inline-flex;align-items:center;gap:7px;padding:9px 16px;border-radius:999px;font-weight:700;font-size:14px;background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.22)}\n.header.solid .btn-back{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\n.hamburger{display:none;width:40px;height:40px;border-radius:50%;color:#fff;align-items:center;justify-content:center}\n.header.solid .hamburger{color:var(--text)}\n\n.hero{position:relative;min-height:300px;padding:110px 0 40px;background:linear-gradient(135deg,#10B981 0%,#0EA5E9 55%,#1E3A8A 100%);color:#fff;overflow:hidden}\n.hero::before{content:\"\";position:absolute;inset:0;background-image:radial-gradient(circle at 20% 30%,rgba(255,255,255,.15) 0%,transparent 50%),radial-gradient(circle at 80% 70%,rgba(255,255,255,.10) 0%,transparent 50%);pointer-events:none}\n.hero .wrap{position:relative;z-index:1}\n.kicker{display:inline-block;font-size:12px;letter-spacing:.18em;text-transform:uppercase;font-weight:700;opacity:.92;margin-bottom:14px}\n.hero h1{font-size:clamp(32px,5vw,48px);line-height:1.05;margin-bottom:14px}\n.hero h1 span{font-style:italic;color:var(--gold)}\n.hero p.sub{font-size:16px;line-height:1.6;max-width:680px;opacity:.95;margin-bottom:18px}\n.hero-meta{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:20px}\n.meta-pill{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;background:rgba(255,255,255,.18);backdrop-filter:blur(6px);border:1px solid rgba(255,255,255,.24);font-size:13px;font-weight:600}\n.meta-pill .dot{width:6px;height:6px;border-radius:50%;background:var(--gold)}\n\n.player-bar{position:sticky;top:72px;z-index:50;background:#0F172A;color:#fff;box-shadow:0 4px 16px rgba(0,0,0,.2)}\n.player-inner{display:grid;grid-template-columns:340px 1fr;gap:20px;align-items:center;padding:14px 24px;max-width:1200px;margin:0 auto}\n.player-vid{aspect-ratio:16\/9;background:#000;border-radius:10px;overflow:hidden;width:340px;min-height:191px}\n.player-vid iframe{width:100%;height:100%;border:0;display:block}\n.player-controls h4{font-family:'Fraunces',serif;font-size:18px;margin-bottom:4px}\n.player-controls .pc-sub{font-size:13px;opacity:.75;margin-bottom:12px}\n.part-jumps{display:flex;flex-wrap:wrap;gap:8px}\n.jump-btn{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:999px;background:rgba(255,255,255,.1);color:#fff;font-weight:600;font-size:13px;border:1px solid rgba(255,255,255,.2);transition:all .15s ease;cursor:pointer}\n.jump-btn:hover{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));border-color:transparent;transform:translateY(-1px)}\n.jump-btn .jt{font-weight:800;color:var(--gold);font-size:12px}\n.jump-btn.active{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));border-color:transparent}\n.player-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}\n.player-actions .ctrl-btn{display:inline-flex;align-items:center;gap:5px;padding:7px 12px;border-radius:8px;background:rgba(255,255,255,.08);color:#fff;font-size:12px;font-weight:600;border:1px solid rgba(255,255,255,.14);cursor:pointer}\n.player-actions .ctrl-btn:hover{background:rgba(255,255,255,.18)}\n\n.mini-prog{position:sticky;top:262px;z-index:40;background:rgba(255,255,255,.95);backdrop-filter:blur(10px);border-bottom:1px solid var(--border);padding:8px 0}\n.mini-prog-inner{display:flex;align-items:center;gap:14px}\n.mini-prog-bar{flex:1;height:6px;background:var(--light-1);border-radius:999px;overflow:hidden}\n.mini-prog-fill{height:100%;background:linear-gradient(90deg,var(--accent-1),var(--accent-2));border-radius:999px;transition:width .3s ease;width:0}\n.mini-prog-label{font-size:12px;color:var(--muted);font-weight:700;min-width:120px}\n.mini-prog-score{font-weight:800;color:var(--accent-1);font-size:14px;min-width:80px}\n\n.part-section{padding:48px 0;border-bottom:1px solid var(--border)}\n.part-section:nth-of-type(even){background:#fff}\n.part-head{display:flex;align-items:flex-start;gap:18px;margin-bottom:24px}\n.part-num{flex-shrink:0;width:60px;height:60px;border-radius:18px;background:linear-gradient(135deg,var(--accent-1),var(--accent-2));color:#fff;display:grid;place-items:center;font-family:'Fraunces',serif;font-weight:700;font-size:26px;box-shadow:0 8px 22px rgba(6,182,212,.3)}\n.part-head-text h2{font-size:26px;line-height:1.15;margin-bottom:6px}\n.part-head-text .qrange{display:inline-block;font-size:12.5px;font-weight:700;color:var(--accent-1);background:var(--light-1);padding:4px 10px;border-radius:999px;letter-spacing:.04em;margin-bottom:8px}\n.part-head-text p{color:var(--muted);font-size:15px;line-height:1.55;max-width:740px}\n.part-actions{display:flex;gap:10px;margin:0 0 16px 78px;flex-wrap:wrap}\n.act-pill{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;background:#fff;border:1.5px solid var(--border);font-weight:600;font-size:13px;color:var(--text);cursor:pointer;transition:all .15s ease}\n.act-pill:hover{border-color:var(--accent-1);color:var(--accent-1)}\n\n\/* Common Q-item (used Part 3) *\/\n.q-list{display:flex;flex-direction:column;gap:18px;margin-top:8px}\n.q-item{background:#fff;border:1px solid var(--border);border-radius:16px;padding:18px 20px;display:flex;flex-direction:column;gap:12px;transition:all .2s ease;scroll-margin-top:330px}\n.q-item.correct{border-color:var(--green);box-shadow:0 0 0 3px rgba(16,185,129,.12)}\n.q-item.wrong{border-color:var(--red);box-shadow:0 0 0 3px rgba(239,68,68,.12)}\n.q-item.revealed{background:linear-gradient(180deg,#FEF3C7 0%,#FFFBF5 100%);border-color:var(--gold)}\n.q-text{font-size:15.5px;line-height:1.55;color:var(--text);display:flex;gap:10px;align-items:flex-start}\n.q-text b.qn{color:var(--accent-1);font-weight:800;min-width:30px}\n.feedback{font-size:13px;font-weight:600;display:none;padding:8px 12px;border-radius:8px;margin-top:4px}\n.q-item.answered .feedback,.q-item.revealed .feedback{display:block}\n.q-item.correct .feedback{background:rgba(16,185,129,.12);color:#065F46}\n.q-item.wrong .feedback{background:rgba(239,68,68,.10);color:#991B1B}\n.q-item.revealed .feedback{background:#FEF3C7;color:#7B5B00;border-left:3px solid var(--gold);padding-left:10px}\n.q-bottom{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}\n.show-ans-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 13px;border-radius:999px;background:#FEF3C7;color:#7B5B00;font-weight:700;font-size:12px;border:1px solid #E8D88E;cursor:pointer;transition:all .15s ease}\n.show-ans-btn:hover{background:#FDE68A;transform:translateY(-1px)}\n\n\/* Part 3 &#8212; picture MCQ (3 boxes) *\/\n.pic-mcq{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:8px}\n.pic-opt{position:relative;border:2px solid var(--border);border-radius:14px;background:#fff;padding:8px;cursor:pointer;transition:all .15s ease;text-align:center}\n.pic-opt:hover{border-color:var(--accent-1);transform:translateY(-2px)}\n.pic-opt img{width:100%;height:auto;border-radius:8px;display:block;aspect-ratio:1\/1;object-fit:cover;background:#F8FAFC}\n.pic-opt .pic-letter{display:inline-flex;align-items:center;gap:6px;margin-top:8px;font-weight:700;color:var(--text);font-size:14px}\n.pic-opt .pic-letter b{display:grid;place-items:center;width:24px;height:24px;border-radius:6px;background:var(--light-1);color:var(--accent-1);font-size:13px;border:1px solid var(--border)}\n.pic-opt .pic-tick{width:18px;height:18px;border-radius:5px;border:2px solid var(--border);display:inline-grid;place-items:center;font-size:12px;color:transparent;background:#fff}\n.pic-opt.selected{border-color:var(--accent-1);background:linear-gradient(180deg,#fff,var(--light-1))}\n.pic-opt.selected .pic-tick{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\n.pic-opt.correct-opt{border-color:var(--green) !important;background:rgba(16,185,129,.08) !important}\n.pic-opt.correct-opt .pic-tick{background:var(--green) !important;color:#fff !important;border-color:transparent !important}\n.pic-opt.wrong-opt{border-color:var(--red) !important;background:rgba(239,68,68,.08) !important}\n\n\/* Example row (smaller, opacity .7) *\/\n.ex-row{display:flex;gap:8px;align-items:center;background:var(--light-1);border:1.5px dashed var(--gold);border-radius:12px;padding:8px 12px;margin-bottom:10px;font-size:13px;font-weight:600;color:#7B5B00}\n.ex-row .ex-tag{background:var(--gold);color:#fff;padding:2px 8px;border-radius:6px;font-size:11px;letter-spacing:.06em}\n\n\/* Input blanks (Part 2) *\/\n.input-blank{display:inline-block;min-width:140px;border:none;border-bottom:2px dashed var(--accent-1);background:transparent;font-family:inherit;font-size:15.5px;color:var(--text);font-weight:600;padding:2px 8px;margin:0 4px;text-align:center;outline:none}\n.input-blank:focus{border-bottom-style:solid;background:var(--light-1)}\n.input-blank.correct{border-bottom-color:var(--green);color:#065F46;background:rgba(16,185,129,.10)}\n.input-blank.wrong{border-bottom-color:var(--red);color:#991B1B;background:rgba(239,68,68,.08)}\n.input-blank.revealed{border-bottom-color:var(--gold);background:#FEF3C7;color:#7B5B00}\n\n.form-card{background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:22px;margin-top:14px;max-width:640px}\n.form-card h4{font-family:'Fraunces',serif;font-size:18px;color:var(--accent-2);margin-bottom:6px;border-bottom:2px solid var(--accent-1);padding-bottom:8px;display:inline-block;width:100%;text-align:center}\n.form-row{display:flex;gap:12px;align-items:center;margin-top:12px;flex-wrap:wrap}\n.form-row label{flex:0 0 240px;font-weight:600;color:var(--text);font-size:14.5px}\n.form-row .input-blank{flex:1;min-width:180px;text-align:left;font-size:14.5px}\n.form-row .show-ans-btn{flex-shrink:0;margin-left:auto}\n.form-row.example{opacity:.7}\n.form-row.example .ex-tag{background:var(--gold);color:#fff;padding:2px 8px;border-radius:6px;font-size:11px;letter-spacing:.06em;margin-left:6px}\n\n\/* PART 1 &#8212; Pair \/ Draw Lines *\/\n.pair-wrap{position:relative;background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:14px;margin-top:14px;display:grid;grid-template-columns:200px 1fr;gap:18px;align-items:stretch;min-height:520px}\n.pair-names{display:flex;flex-direction:column;gap:10px;padding-right:6px;border-right:1px dashed var(--border)}\n.pair-name{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 12px;background:#F8FAFC;border:2px solid var(--border);border-radius:10px;cursor:pointer;font-weight:700;color:var(--text);transition:all .15s ease;user-select:none}\n.pair-name:hover{border-color:var(--accent-1);background:var(--light-1)}\n.pair-name.selected{border-color:var(--accent-1);background:linear-gradient(100deg,rgba(6,182,212,.12),rgba(14,165,233,.12));box-shadow:0 0 0 3px rgba(6,182,212,.18)}\n.pair-name.example{opacity:.55;cursor:default;border-style:dashed}\n.pair-name.example:hover{border-color:var(--gold);background:#FEF3C7}\n.pair-name.matched{border-color:var(--green);background:rgba(16,185,129,.08)}\n.pair-name .pn-dot{width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid currentColor;flex-shrink:0}\n.pair-name .pn-num{font-size:13px;color:var(--accent-1);background:var(--light-1);width:22px;height:22px;border-radius:6px;display:grid;place-items:center;border:1px solid var(--border);flex-shrink:0}\n.pair-scene{position:relative;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:#FAFBFC}\n.pair-scene img{width:100%;height:auto;display:block}\n.pair-targets,.pair-lines{position:absolute;inset:0;pointer-events:none}\n.pair-targets .tgt{position:absolute;width:32px;height:32px;border-radius:50%;background:rgba(6,182,212,.2);border:2px solid var(--accent-1);transform:translate(-50%,-50%);pointer-events:auto;cursor:pointer;transition:all .15s ease}\n.pair-targets .tgt:hover{background:rgba(6,182,212,.5);transform:translate(-50%,-50%) scale(1.15)}\n.pair-targets .tgt.example{background:rgba(251,191,36,.3);border-color:var(--gold);cursor:default}\n.pair-targets .tgt.matched{background:rgba(16,185,129,.45);border-color:var(--green)}\n.pair-targets .tgt .tlabel{position:absolute;left:50%;top:100%;transform:translate(-50%,4px);background:#0F172A;color:#fff;font-size:10px;padding:2px 6px;border-radius:4px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s ease}\n.pair-targets .tgt:hover .tlabel{opacity:1}\n.pair-lines{z-index:2}\n.pair-hint{font-size:12.5px;color:var(--muted);text-align:center;margin-top:10px;background:var(--light-1);border:1px solid var(--border);border-radius:8px;padding:8px 12px}\n.pair-bottom-actions{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;justify-content:flex-end}\n@media (max-width:720px){\n  .pair-wrap{grid-template-columns:1fr;min-height:auto}\n  .pair-names{border-right:none;border-bottom:1px dashed var(--border);padding-right:0;padding-bottom:10px}\n}\n\n\n.match-letter{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#fff;border:1.5px solid var(--border);border-radius:12px;font-size:14px;font-weight:600;color:var(--text)}\n.match-letter b{color:var(--accent-1);background:var(--light-1);width:26px;height:26px;border-radius:8px;display:grid;place-items:center;flex-shrink:0;font-weight:800}\n.q-opts{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}\n.opt{display:inline-flex;align-items:center;gap:7px;padding:10px 16px;border-radius:12px;background:#F8FAFF;border:1.5px solid var(--border);font-weight:600;font-size:14px;color:var(--text);cursor:pointer;transition:all .15s ease;user-select:none}\n.opt input{display:none}\n.opt .opt-letter{font-weight:800;color:var(--accent-1);background:#fff;width:22px;height:22px;border-radius:6px;display:grid;place-items:center;font-size:12.5px;border:1px solid var(--border);flex-shrink:0}\n.opt.selected{background:linear-gradient(100deg,rgba(16,185,129,.12),rgba(14,165,233,.12));border-color:var(--accent-1)}\n.opt.selected .opt-letter{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\n.opt.correct-opt{background:rgba(16,185,129,.12) !important;border-color:var(--green) !important}\n.opt.correct-opt .opt-letter{background:var(--green) !important;color:#fff !important;border-color:transparent !important}\n.opt.wrong-opt{background:rgba(239,68,68,.10) !important;border-color:var(--red) !important}\n\n\/* PART 4 &#8212; Colour palette + SVG scene *\/\n.colour-wrap{background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:14px;margin-top:14px}\n.colour-palette{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;padding:10px;background:var(--light-1);border-radius:10px;margin-bottom:12px}\n.swatch{width:42px;height:42px;border-radius:50%;border:3px solid #fff;box-shadow:0 0 0 2px var(--border);cursor:pointer;transition:all .15s ease;position:relative}\n.swatch:hover{transform:translateY(-2px)}\n.swatch.selected{box-shadow:0 0 0 3px var(--accent-1),0 6px 16px rgba(6,182,212,.4);transform:scale(1.1)}\n.swatch.eraser{background:repeating-conic-gradient(#fff 0% 25%,#E2E8F0 25% 50%) 50% \/ 16px 16px}\n.swatch .sw-label{position:absolute;left:50%;top:100%;transform:translate(-50%,4px);font-size:11px;font-weight:700;color:var(--muted);white-space:nowrap;text-transform:capitalize}\n.colour-scene{position:relative;text-align:center;background:#FAFBFC;border-radius:10px;padding:14px;border:1px solid var(--border)}\n.colour-scene svg{max-width:100%;height:auto}\n.colour-scene svg [data-region]{cursor:pointer;transition:fill .15s ease;stroke:#0F172A;stroke-width:1.5}\n.colour-scene svg [data-region]:hover{filter:brightness(0.9)}\n.colour-scene svg [data-region][data-locked=\"1\"]{cursor:not-allowed}\n.colour-instructions{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;margin-top:14px}\n.col-ins{display:flex;align-items:center;gap:10px;padding:10px 14px;background:#fff;border:1.5px solid var(--border);border-radius:12px;font-size:13.5px;color:var(--text);font-weight:600}\n.col-ins.example{opacity:.7;border-style:dashed;background:#FEF3C7;border-color:var(--gold)}\n.col-ins .ci-num{display:grid;place-items:center;width:26px;height:26px;border-radius:8px;background:var(--light-1);color:var(--accent-1);font-weight:800;font-size:13px;border:1px solid var(--border);flex-shrink:0}\n.col-ins .ci-dot{width:18px;height:18px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 2px var(--border);flex-shrink:0;margin-left:auto}\n.col-ins.correct{border-color:var(--green);background:rgba(16,185,129,.06)}\n.col-ins.wrong{border-color:var(--red);background:rgba(239,68,68,.06)}\n.col-ins.revealed{background:#FEF3C7;border-color:var(--gold);color:#7B5B00}\n\n\/* Transcript *\/\n.transcript-card{margin-top:18px;background:#FAFBFC;border:1.5px solid var(--border);border-radius:14px;padding:0;overflow:hidden;max-width:840px}\n.transcript-card.collapsed .ts-body{display:none}\n.transcript-card .ts-head{display:flex;justify-content:space-between;align-items:center;padding:12px 18px;background:#fff;cursor:pointer;font-weight:700;font-size:14px;color:var(--accent-2);border-bottom:1px solid var(--border)}\n.transcript-card.collapsed .ts-head{border-bottom:none}\n.transcript-card .ts-head .chev{transition:transform .2s ease}\n.transcript-card.collapsed .ts-head .chev{transform:rotate(-90deg)}\n.transcript-card .ts-body{padding:16px 22px;font-size:14.5px;line-height:1.75;color:var(--text);max-height:380px;overflow-y:auto;background:#FAFBFC;font-family:'Courier New',monospace}\n.transcript-card .ts-body b{color:var(--accent-2);font-family:'Plus Jakarta Sans',sans-serif}\n.transcript-card .ts-body i{color:var(--muted);font-size:12.5px}\n\n\/* Notes pad *\/\n.notes-pad{background:#FEF9E7;border:1.5px solid var(--gold);border-radius:14px;padding:14px 18px;margin-top:14px;max-width:640px}\n.notes-pad label{display:block;font-weight:700;font-size:13px;color:#7B5B00;margin-bottom:6px;text-transform:uppercase;letter-spacing:.05em}\n.notes-pad textarea{width:100%;min-height:80px;padding:10px;font-family:inherit;font-size:14px;line-height:1.5;border:1px solid #E8D88E;border-radius:8px;background:rgba(255,255,255,.7);color:var(--text);outline:none;resize:vertical}\n.notes-pad textarea:focus{border-color:var(--accent-1);background:#fff}\n\n\/* Submit panel *\/\n.submit-panel{margin:40px auto 24px;background:linear-gradient(135deg,#10B981 0%,#0EA5E9 100%);color:#fff;padding:30px;border-radius:22px;text-align:center;max-width:720px;box-shadow:0 16px 50px rgba(6,182,212,.3)}\n.submit-panel h3{font-family:'Fraunces',serif;font-size:24px;margin-bottom:8px}\n.submit-panel p.intro{opacity:.95;margin-bottom:18px;font-size:14.5px}\n.submit-panel .sp-buttons{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}\n.btn-submit-big{display:inline-flex;align-items:center;gap:8px;padding:14px 28px;border-radius:999px;background:#fff;color:var(--accent-2);font-weight:800;font-size:16px;box-shadow:0 8px 24px rgba(0,0,0,.2);cursor:pointer;transition:transform .15s ease}\n.btn-submit-big:hover{transform:translateY(-2px)}\n.btn-reset-big{padding:14px 24px;border-radius:999px;background:rgba(255,255,255,.18);color:#fff;font-weight:700;font-size:14.5px;border:1px solid rgba(255,255,255,.4);cursor:pointer}\n.btn-reset-big:hover{background:rgba(255,255,255,.3)}\n\n.results-banner{display:none;margin:24px auto;padding:30px;border-radius:22px;background:#fff;color:var(--text);text-align:center;max-width:720px;box-shadow:var(--sh-lg);border:2px solid var(--accent-1)}\n.results-banner.show{display:block}\n.results-banner h3{font-size:28px;font-family:'Fraunces',serif;margin-bottom:8px;color:var(--accent-2)}\n.results-banner .score-big{font-size:60px;font-weight:800;line-height:1;margin:14px 0;font-family:'Fraunces',serif;background:linear-gradient(100deg,var(--accent-1),var(--accent-2));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}\n.results-banner p{font-size:15px;color:var(--muted)}\n.score-parts{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:16px;background:var(--light-1);padding:12px;border-radius:12px}\n.score-parts .sp-item{text-align:center;font-size:12px;font-weight:600;color:var(--text)}\n.score-parts .sp-item b{display:block;font-size:18px;font-family:'Fraunces',serif;margin-bottom:2px;color:var(--accent-1)}\n\n.footer{background:var(--dark-1);color:#9CA3AF;padding:36px 0;text-align:center;font-size:13.5px}\n.footer a{color:var(--gold);font-weight:600}\n\n@media (max-width:880px){\n  .nav{display:none}\n  .hamburger{display:flex}\n  .player-inner{grid-template-columns:1fr;padding:12px 18px}\n  .player-vid{width:100%;min-height:0}\n  .hero{padding:110px 0 30px}\n  .part-actions{margin-left:0}\n  .form-row label{flex:1 1 100%}\n  .form-row .input-blank{width:100%}\n  .mini-prog{top:auto;position:relative}\n  .part-head{flex-direction:column;gap:10px}\n  .part-num{width:50px;height:50px;font-size:22px}\n  .pic-mcq{grid-template-columns:1fr 1fr 1fr;gap:8px}\n}\n\n.drawer{position:fixed;inset:0;background:rgba(15,23,42,.65);z-index:200;display:none;align-items:flex-start;justify-content:flex-end}\n.drawer.open{display:flex}\n.drawer-panel{width:280px;background:#fff;height:100%;padding:24px;display:flex;flex-direction:column;gap:8px}\n.drawer-panel a{padding:12px 14px;border-radius:10px;font-weight:600;color:var(--text)}\n.drawer-panel a:hover{background:var(--light-1)}\n.drawer-close{align-self:flex-end;width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:var(--muted)}\n<\/style>\n\n<header class=\"header\" id=\"hdr\">\n  <div class=\"header-inner\">\n    <a href=\"https:\/\/allenglish4u.com\" class=\"brand\">\n      <img decoding=\"async\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/04\/Transparent-background-MacBook-Pro-cua-Hang.png\" alt=\"AE4U\">\n      <span class=\"brand-name\">All English 4U<\/span>\n    <\/a>\n    <nav class=\"nav\">\n      <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\" class=\"active\">Cambridge<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\n      <\/nav>\n    <div class=\"header-right\">\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\" class=\"btn-back\">\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\"><path d=\"M19 12H5M11 18l-6-6 6-6\"\/><\/svg>\n        Back\n      <\/a>\n      <button class=\"hamburger\" id=\"hamb\" aria-label=\"Menu\">\n        <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\"><path d=\"M3 6h18M3 12h18M3 18h18\"\/><\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n<\/header>\n\n<div class=\"drawer\" id=\"drawer\">\n  <div class=\"drawer-panel\">\n    <button class=\"drawer-close\" id=\"drawerClose\" aria-label=\"Close\">\n      <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"\/><\/svg>\n    <\/button>\n    <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">Cambridge<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\n    <\/div>\n<\/div>\n\n<section class=\"hero\">\n  <div class=\"wrap\">\n    <span class=\"kicker\">Cambridge YLE &#183; Flyers<\/span>\n    <h1 class=\"serif\">Flyers 1 &mdash; Test 1 <span>Listening<\/span><\/h1>\n    <p class=\"sub\">Listen to 5 parts with 25 questions. Use YouTube audio, jump to each part, take notes. Each question has its own <b>Show Answer<\/b> button &mdash; submit panel is at the <b>bottom<\/b>.<\/p>\n    <div class=\"hero-meta\">\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>~20 minutes<\/span>\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>5 Parts &middot; 25 Questions<\/span>\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>Auto-grade + Show Answer<\/span>\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>Pair &middot; Write &middot; Tick &middot; Write &middot; Colour<\/span>\n    <\/div>\n  <\/div>\n<\/section>\n\n<div class=\"player-bar\" id=\"playerBar\">\n  <div class=\"player-inner\">\n    <div class=\"player-vid\">\n      <iframe id=\"ytPlayer\" src=\"https:\/\/www.youtube.com\/embed\/hbZUSTyzn14?enablejsapi=1&#038;rel=0\" title=\"YLE Flyers Listening\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n    <\/div>\n    <div class=\"player-controls\">\n      <h4>&#127911; Audio &mdash; Flyers 1 Test 1 Listening<\/h4>\n      <div class=\"pc-sub\">Click a part to jump in audio. Submit panel is at the bottom of this page.<\/div>\n      <div class=\"part-jumps\">\n        <button class=\"jump-btn\" data-time=\"0\" data-part=\"intro\"><span class=\"jt\">0:00<\/span> Intro<\/button>\n        <button class=\"jump-btn\" data-time=\"30\" data-part=\"1\"><span class=\"jt\">0:30<\/span> Part 1<\/button>\n        <button class=\"jump-btn\" data-time=\"300\" data-part=\"2\"><span class=\"jt\">5:00<\/span> Part 2<\/button>\n        <button class=\"jump-btn\" data-time=\"540\" data-part=\"3\"><span class=\"jt\">9:00<\/span> Part 3<\/button>\n        <button class=\"jump-btn\" data-time=\"780\" data-part=\"4\"><span class=\"jt\">13:00<\/span> Part 4<\/button>\n      <\/div>\n      <div class=\"player-actions\">\n        <button class=\"ctrl-btn\" id=\"btnPause\">&#9208; Pause<\/button>\n        <button class=\"ctrl-btn\" id=\"btnPlay\">&#9654; Play<\/button>\n        <button class=\"ctrl-btn\" id=\"btnRewind\">&#9194; -10s<\/button>\n        <button class=\"ctrl-btn\" id=\"btnSlower\">&#128034; Slower<\/button>\n        <button class=\"ctrl-btn\" id=\"btnNormal\">&#9889; Normal<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"mini-prog\" id=\"miniProg\">\n  <div class=\"wrap mini-prog-inner\">\n    <div class=\"mini-prog-score\">Score <span id=\"scoreNow\">0<\/span>\/25<\/div>\n    <div class=\"mini-prog-bar\"><div class=\"mini-prog-fill\" id=\"progFill\"><\/div><\/div>\n    <div class=\"mini-prog-label\"><span id=\"answeredCount\">0<\/span> of 25 answered<\/div>\n  <\/div>\n<\/div>\n\n<!-- ============ PART 1 &#8212; Pair \/ Draw Lines ============ -->\n<section class=\"part-section\" id=\"part1\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">1<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 1&#8211;5 &#183; Pair \/ Draw lines<\/span>\n        <h2 class=\"serif\">Listen and draw lines<\/h2>\n        <p>Listen and draw lines between names and items in the picture. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"30\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 1<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts1\">&#128220; Transcript<\/button>\n      <button class=\"act-pill\" id=\"p1Clear\">&#129529; Clear my lines<\/button>\n    <\/div>\n\n    <div class=\"pair-wrap\" id=\"pairWrap\">\n      <div class=\"pair-names\" id=\"pairNames\"><\/div>\n      <div class=\"pair-scene\" id=\"pairScene\">\n        <img decoding=\"async\" id=\"pairImg\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/06\/f1t1-p1-scene-1.jpg\" alt=\"Part 1 scene\" draggable=\"false\" onerror=\"this.src='data:image\/svg+xml;utf8,'+encodeURIComponent('<svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; viewBox=&quot;0 0 600 600&quot;><rect width=&quot;600&quot; height=&quot;600&quot; fill=&quot;%23F8FAFC&quot;\/><text x=&quot;300&quot; y=&quot;300&quot; text-anchor=&quot;middle&quot; font-family=&quot;sans-serif&quot; font-size=&quot;22&quot; fill=&quot;%23475569&quot;>Replace P1_IMG_URL with your scene image<\/text><\/svg>&#8216;)&#8221;>\n        <svg class=\"pair-lines\" id=\"pairLines\" preserveAspectRatio=\"none\"><\/svg>\n        <div class=\"pair-targets\" id=\"pairTargets\"><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"pair-hint\">&#128161; Click a name on the left, then click the matching item in the picture. Click a line again to erase it.<\/div>\n    <div class=\"pair-bottom-actions\">\n      <button class=\"show-ans-btn\" data-show=\"P1ALL\">&#128065; Show All Answers (Part 1)<\/button>\n    <\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts1\">\n      <div class=\"ts-head\" data-toggle=\"ts1\"><span>&#128220; Part 1 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody1\"><p><b>Ex<\/b> David is the dark-skinned boy near the snowman &mdash; he is the example.<\/p><p><b>1<\/b> Helen is the girl near the snowman with the blue scarf.<\/p><p><b>2<\/b> Harry is the boy sitting on the sledge.<\/p><p><b>3<\/b> Emma is the girl throwing a snowball.<\/p><p><b>4<\/b> Sarah is the girl in the red trousers and green jacket.<\/p><p><b>5<\/b> Richard is the boy lying in the snow.<\/p><p><i>(William is not used.)<\/i><\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 2 &#8212; Listen and write ============ -->\n<section class=\"part-section\" id=\"part2\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">2<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 6&#8211;10 &#183; Listen and write<\/span>\n        <h2 class=\"serif\">Listen and write a name or a number<\/h2>\n        <p id=\"p2Intro\">Listen to the conversation about a tennis competition. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"300\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 2<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts2\">&#128220; Transcript<\/button>\n    <\/div>\n\n    <div class=\"form-card\" id=\"p2Form\">\n      <h4>&#128221; Listen and write<\/h4>\n      <div id=\"p2Examples\"><\/div>\n      <div id=\"p2Questions\"><\/div>\n    <\/div>\n\n    <div class=\"notes-pad\">\n      <label>&#9999;&#65039; My notes for Part 2 (not graded)<\/label>\n      <textarea placeholder=\"Take notes while listening...\"><\/textarea>\n    <\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts2\">\n      <div class=\"ts-head\" data-toggle=\"ts2\"><span>&#128220; Part 2 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody2\"><p><b>Example:<\/b> Full name: <b>Betty Barratt<\/b>.<\/p><p><b>6<\/b> Age: <b>10<\/b>.<\/p><p><b>7<\/b> Address: 17 <b>Randall<\/b> Street.<\/p><p><b>8<\/b> Phone number: <b>810 334<\/b>.<\/p><p><b>9<\/b> Years of tennis: <b>4<\/b>.<\/p><p><b>10<\/b> Time preferred: <b>afternoons<\/b>.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<!-- ============ PART 3 &#8212; Multiple matching (Flyers) ============ -->\n<section class=\"part-section\" id=\"part3\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">3<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 11&#8211;15 &#183; Multiple matching<\/span>\n        <h2 class=\"serif\">Match the items<\/h2>\n        <p id=\"p3Intro\">Look at the lettered items A&#8211;H. Listen and write a letter next to each question. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"540\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 3<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts3\">&#128220; Transcript<\/button>\n    <\/div>\n\n    <div class=\"match-grid\" id=\"p3LetterBank\" style=\"display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin:18px 0\"><\/div>\n\n    <div class=\"q-list\" id=\"part3List\"><\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts3\">\n      <div class=\"ts-head\" data-toggle=\"ts3\"><span>&#128220; Part 3 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody3\"><p><b>Example:<\/b> Bill likes <b>chips<\/b>. (D)<\/p><p><b>11<\/b> Mary likes <b>melon<\/b>. (E)<\/p><p><b>12<\/b> Robert likes <b>noodles<\/b>. (G)<\/p><p><b>13<\/b> Alex likes <b>pizza<\/b>. (A)<\/p><p><b>14<\/b> Ben likes <b>chocolate<\/b>. (C)<\/p><p><b>15<\/b> Katy likes <b>biscuits<\/b>. (H)<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n<!-- ============ PART 4 &#8212; Picture MCQ (Flyers) ============ -->\n<section class=\"part-section\" id=\"part4\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">4<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 16&#8211;20 &#183; Listen and tick (&#10003;)<\/span>\n        <h2 class=\"serif\">Listen and tick (&#10003;) the box<\/h2>\n        <p id=\"p4Intro\">Look at the pictures. Listen and tick (&#10003;) the box. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"780\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 4<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts4\">&#128220; Transcript<\/button>\n    <\/div>\n\n    <div class=\"q-list\" id=\"part4List\"><\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts4\">\n      <div class=\"ts-head\" data-toggle=\"ts4\"><span>&#128220; Part 4 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody4\"><p><b>Example:<\/b> What&#8217;s Sue&#8217;s brother&#8217;s job? He&#8217;s a <b>mechanic<\/b>. &rarr; <b>B<\/b><\/p><p><b>16<\/b> Where does her brother work? At a <b>factory<\/b>. &rarr; <b>C<\/b><\/p><p><b>17<\/b> How does he go to work? By <b>motorcycle<\/b>. &rarr; <b>A<\/b><\/p><p><b>18<\/b> When does he start work? At <b>nine o&#8217;clock<\/b> (middle clock). &rarr; <b>B<\/b><\/p><p><b>19<\/b> What does he do for lunch? He eats a <b>sandwich<\/b> on his own. &rarr; <b>A<\/b><\/p><p><b>20<\/b> What did he do before this job? Worked in a <b>building by a river<\/b>. &rarr; <b>C<\/b><\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ PART 5 &#8212; Listen, colour and write ============ -->\n<section class=\"part-section\" id=\"part5\">\n  <div class=\"wrap\">\n    <div class=\"part-head\">\n      <div class=\"part-num\">5<\/div>\n      <div class=\"part-head-text\">\n        <span class=\"qrange\">Questions 21&#8211;25 &#183; Listen, colour and write<\/span>\n        <h2 class=\"serif\">Listen, colour and write<\/h2>\n        <p id=\"p5Intro\">Listen and colour the items \/ write a word or a number. There is one example.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"part-actions\">\n      <button class=\"act-pill\" data-time=\"1000\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 5<\/button>\n      <button class=\"act-pill ts-toggle\" data-target=\"ts5\">&#128220; Transcript<\/button>\n      <button class=\"act-pill\" id=\"p5Clear\">&#129529; Clear my colours<\/button>\n    <\/div>\n\n    <div class=\"colour-wrap\">\n      <div class=\"colour-palette\" id=\"colourPalette\"><\/div>\n      <div class=\"colour-scene\" id=\"colourScene\">\n<svg viewBox=\"0 0 700 500\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"max-width:100%;height:auto;border-radius:10px\" aria-label=\"Ocean scene: dolphin (example), sailboat, fish, octopus\">\n\n  <!-- Sky -->\n  <rect width=\"700\" height=\"248\" fill=\"#D6EFFC\"\/>\n  <!-- Ocean below water -->\n  <rect y=\"248\" width=\"700\" height=\"252\" fill=\"#A8D5EE\"\/>\n\n  <!-- Water surface waves -->\n  <path d=\"M0,242 Q28,232 56,242 Q84,252 112,242 Q140,232 168,242 Q196,252 224,242 Q252,232 280,242 Q308,252 336,242 Q364,232 392,242 Q420,252 448,242 Q476,232 504,242 Q532,252 560,242 Q588,232 616,242 Q644,252 672,242 Q686,237 700,242\"\n        fill=\"none\" stroke=\"#7ECBEC\" stroke-width=\"3\"\/>\n  <path d=\"M0,250 Q28,240 56,250 Q84,260 112,250 Q140,240 168,250 Q196,260 224,250 Q252,240 280,250 Q308,260 336,250 Q364,240 392,250 Q420,260 448,250 Q476,240 504,250 Q532,260 560,250 Q588,240 616,250 Q644,260 672,250 Q686,245 700,250\"\n        fill=\"none\" stroke=\"#5BBBD8\" stroke-width=\"2\"\/>\n\n  <!-- DOLPHIN (example &#8212; will be coloured black by JS on load) -->\n  <g data-region=\"dolphin\">\n    <ellipse cx=\"190\" cy=\"213\" rx=\"74\" ry=\"25\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\" transform=\"rotate(-22,190,213)\"\/>\n    <!-- dorsal fin -->\n    <polygon points=\"213,193 230,172 238,198\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <!-- tail flukes -->\n    <polygon points=\"115,237 100,222 108,242 100,258 115,248\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <!-- snout -->\n    <ellipse cx=\"248\" cy=\"204\" rx=\"16\" ry=\"8\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"1.5\" transform=\"rotate(-15,248,204)\"\/>\n    <!-- eye -->\n    <circle cx=\"232\" cy=\"200\" r=\"5\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"1.5\"\/>\n  <\/g>\n\n  <!-- SAILBOAT -->\n  <g data-region=\"sailboat\">\n    <!-- Hull -->\n    <path d=\"M425,232 Q542,220 668,232 L660,256 L433,256 Z\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <!-- Cabin -->\n    <rect x=\"524\" y=\"216\" width=\"82\" height=\"22\" rx=\"4\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <rect x=\"540\" y=\"220\" width=\"14\" height=\"12\" rx=\"2\" fill=\"#cce8f5\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n    <rect x=\"560\" y=\"220\" width=\"14\" height=\"12\" rx=\"2\" fill=\"#cce8f5\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n    <!-- Mast -->\n    <line x1=\"570\" y1=\"52\" x2=\"570\" y2=\"232\" stroke=\"#0F172A\" stroke-width=\"3\"\/>\n    <!-- Main sail (big) -->\n    <polygon points=\"570,58 668,228 570,228\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <!-- Jib (front sail) -->\n    <polygon points=\"570,78 438,228 570,228\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"1.5\"\/>\n    <!-- Boom -->\n    <line x1=\"570\" y1=\"228\" x2=\"658\" y2=\"240\" stroke=\"#0F172A\" stroke-width=\"1.5\"\/>\n    <!-- Rigging -->\n    <line x1=\"570\" y1=\"52\" x2=\"432\" y2=\"226\" stroke=\"#0F172A\" stroke-width=\"1\" stroke-dasharray=\"5,3\"\/>\n    <line x1=\"570\" y1=\"52\" x2=\"665\" y2=\"226\" stroke=\"#0F172A\" stroke-width=\"1\" stroke-dasharray=\"5,3\"\/>\n  <\/g>\n\n  <!-- Bubbles (decorative) -->\n  <circle cx=\"348\" cy=\"278\" r=\"6\" fill=\"none\" stroke=\"#5BBBD8\" stroke-width=\"1.5\"\/>\n  <circle cx=\"358\" cy=\"298\" r=\"4\" fill=\"none\" stroke=\"#5BBBD8\" stroke-width=\"1.5\"\/>\n  <circle cx=\"445\" cy=\"272\" r=\"5\" fill=\"none\" stroke=\"#5BBBD8\" stroke-width=\"1.5\"\/>\n  <circle cx=\"636\" cy=\"282\" r=\"4\" fill=\"none\" stroke=\"#5BBBD8\" stroke-width=\"1.5\"\/>\n  <circle cx=\"200\" cy=\"295\" r=\"3\" fill=\"none\" stroke=\"#5BBBD8\" stroke-width=\"1.5\"\/>\n\n  <!-- Shark (decorative, no data-region) -->\n  <path d=\"M118,314 Q200,295 278,314 Q258,330 235,334 Q210,330 182,322 Q154,330 130,326 Z\"\n        fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n  <polygon points=\"238,292 260,272 272,298\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n  <polygon points=\"118,314 96,296 104,318 96,338 118,326\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n  <circle cx=\"260\" cy=\"308\" r=\"5\" fill=\"#0F172A\"\/>\n  <path d=\"M260,318 Q248,328 234,326\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"1.5\"\/>\n\n  <!-- OCTOPUS -->\n  <g data-region=\"octopus\">\n    <!-- Mantle\/head -->\n    <ellipse cx=\"100\" cy=\"378\" rx=\"54\" ry=\"50\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <!-- Eyes -->\n    <circle cx=\"84\" cy=\"366\" r=\"9\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <circle cx=\"86\" cy=\"366\" r=\"4\" fill=\"#0F172A\"\/>\n    <circle cx=\"116\" cy=\"366\" r=\"9\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <circle cx=\"118\" cy=\"366\" r=\"4\" fill=\"#0F172A\"\/>\n    <!-- Tentacles (8) -->\n    <path d=\"M52,424 Q30,450 38,480 Q34,492 46,488 Q52,464 62,440\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <path d=\"M66,430 Q52,462 58,492 Q54,504 66,500 Q70,470 74,442\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <path d=\"M84,436 Q80,470 84,500 Q80,512 92,508 Q93,476 90,444\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <path d=\"M104,437 Q104,472 100,502 Q96,514 108,512 Q110,478 108,446\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <path d=\"M124,435 Q128,468 122,498 Q118,510 130,508 Q132,476 130,444\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <path d=\"M142,430 Q154,460 146,490 Q142,502 154,498 Q154,468 148,440\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <path d=\"M50,406 Q28,420 24,450 Q20,462 32,458 Q38,432 48,418\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <path d=\"M152,406 Q176,420 179,450 Q182,462 170,458 Q166,432 156,418\" fill=\"none\" stroke=\"#0F172A\" stroke-width=\"2.5\"\/>\n    <!-- Suckers (decorative dots) -->\n    <circle cx=\"40\" cy=\"462\" r=\"3\" fill=\"#0F172A\"\/>\n    <circle cx=\"37\" cy=\"477\" r=\"3\" fill=\"#0F172A\"\/>\n    <circle cx=\"148\" cy=\"464\" r=\"3\" fill=\"#0F172A\"\/>\n    <circle cx=\"146\" cy=\"479\" r=\"3\" fill=\"#0F172A\"\/>\n  <\/g>\n\n  <!-- Sunken boat\/wreck (decorative, no data-region) -->\n  <path d=\"M448,415 Q458,392 550,386 Q642,380 662,405 L667,465 L443,465 Z\"\n        fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\" opacity=\"0.9\"\/>\n  <!-- Broken mast -->\n  <line x1=\"498\" y1=\"316\" x2=\"486\" y2=\"392\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-dasharray=\"7,4\"\/>\n  <!-- Tattered sail -->\n  <polygon points=\"486,338 486,386 530,362\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"1.5\" opacity=\"0.7\"\/>\n  <!-- Hull planks -->\n  <line x1=\"452\" y1=\"428\" x2=\"660\" y2=\"428\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n  <line x1=\"454\" y1=\"444\" x2=\"662\" y2=\"444\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n  <!-- Porthole -->\n  <circle cx=\"604\" cy=\"412\" r=\"14\" fill=\"#cce8f5\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n  <circle cx=\"604\" cy=\"412\" r=\"7\" fill=\"#a8d5ee\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n\n  <!-- FISH near wreck -->\n  <g data-region=\"fish\">\n    <!-- Fish 1 (swimming right) -->\n    <ellipse cx=\"528\" cy=\"354\" rx=\"32\" ry=\"14\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <polygon points=\"560,354 578,342 578,366\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <circle cx=\"514\" cy=\"350\" r=\"4\" fill=\"#0F172A\"\/>\n    <line x1=\"518\" y1=\"342\" x2=\"518\" y2=\"366\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n    <line x1=\"530\" y1=\"340\" x2=\"530\" y2=\"368\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n    <!-- Fish 2 (swimming right, smaller) -->\n    <ellipse cx=\"602\" cy=\"337\" rx=\"26\" ry=\"11\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <polygon points=\"628,337 643,327 643,347\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <circle cx=\"590\" cy=\"334\" r=\"3\" fill=\"#0F172A\"\/>\n    <line x1=\"594\" y1=\"328\" x2=\"594\" y2=\"347\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n    <!-- Fish 3 (swimming left) -->\n    <ellipse cx=\"558\" cy=\"374\" rx=\"24\" ry=\"10\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <polygon points=\"534,374 520,365 520,383\" fill=\"#fff\" stroke=\"#0F172A\" stroke-width=\"2\"\/>\n    <circle cx=\"570\" cy=\"371\" r=\"3\" fill=\"#0F172A\"\/>\n    <line x1=\"566\" y1=\"366\" x2=\"566\" y2=\"382\" stroke=\"#0F172A\" stroke-width=\"1\"\/>\n  <\/g>\n\n  <!-- Sea grass \/ coral (decorative) -->\n  <path d=\"M222,494 Q227,474 232,494\" fill=\"none\" stroke=\"#10B981\" stroke-width=\"2\"\/>\n  <path d=\"M232,494 Q228,468 238,494\" fill=\"none\" stroke=\"#10B981\" stroke-width=\"2\"\/>\n  <path d=\"M385,494 Q393,470 398,494\" fill=\"none\" stroke=\"#10B981\" stroke-width=\"2\"\/>\n  <path d=\"M398,494 Q390,464 405,494\" fill=\"none\" stroke=\"#10B981\" stroke-width=\"2\"\/>\n\n<\/svg>\n      <\/div>\n      <div class=\"pair-hint\">&#128161; Click a colour, then click an item to fill. Use the form below for write-questions.<\/div>\n      <div class=\"colour-instructions\" id=\"colourInstructions\"><\/div>\n      <div class=\"pair-bottom-actions\">\n        <button class=\"show-ans-btn\" data-show=\"P5ALL\">&#128065; Show All Answers (Part 5)<\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\" id=\"p5Form\">\n      <h4>&#128221; Write words \/ numbers<\/h4>\n      <div id=\"p5Questions\"><\/div>\n    <\/div>\n\n    <div class=\"notes-pad\">\n      <label>&#9999;&#65039; My notes for Part 5 (not graded)<\/label>\n      <textarea placeholder=\"Take notes while listening...\"><\/textarea>\n    <\/div>\n\n    <div class=\"transcript-card collapsed\" id=\"ts5\">\n      <div class=\"ts-head\" data-toggle=\"ts5\"><span>&#128220; Part 5 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\n      <div class=\"ts-body\" id=\"tsBody5\"><p><b>Example:<\/b> Colour the <b>dolphin<\/b> <b>black<\/b>.<\/p><p><b>21<\/b> Colour the <b>sail boat<\/b> <b>red<\/b>.<\/p><p><b>22<\/b> Colour the <b>fish<\/b> near the wreck <b>blue<\/b>.<\/p><p><b>23<\/b> Colour the <b>octopus<\/b> <b>green<\/b>.<\/p><p><b>24<\/b> Draw <b>two birds<\/b> in the sky.<\/p><p><b>25<\/b> Draw a <b>yellow sun<\/b> on the right.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- SUBMIT PANEL -->\n<div class=\"wrap\">\n  <div class=\"submit-panel\">\n    <h3>&#127919; Finished all 25 questions?<\/h3>\n    <p class=\"intro\">Submit to grade your whole test, OR use &#128065; Show Answer per part \/ per question.<\/p>\n    <div class=\"sp-buttons\">\n      <button class=\"btn-submit-big\" id=\"submitBtn\">\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.8\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>\n        Submit &amp; Grade All\n      <\/button>\n      <button class=\"btn-reset-big\" id=\"resetBtn\">&#128260; Reset Test<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"results-banner\" id=\"resultsBanner\">\n    <h3>&#127911; Your Flyers Listening &mdash; Test 1 score<\/h3>\n    <div class=\"score-big\"><span id=\"finalScore\">0<\/span>\/25<\/div>\n    <p id=\"resultsMsg\">Great work!<\/p>\n    <div class=\"score-parts\" id=\"scoreParts\"><\/div>\n  <\/div>\n<\/div>\n\n<footer class=\"footer\">\n  <div class=\"wrap\">\n    <p>&#169; 2026 All English 4U &#183; <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">All Cambridge Tests<\/a> &#183; <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a><\/p>\n  <\/div>\n<\/footer>\n\n<script>eval(atob('CihmdW5jdGlvbigpewovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEFFNFUgWUxFIFNUQVJURVJTIExJU1RFTklORwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiA9PT09PSBEQVRBID09PT09ICovCi8qIFBlci10ZXN0IGRhdGEgXHUyMDE0IEZseWVycyAxIFRlc3QgMSBMaXN0ZW5pbmcgKi8KdmFyIElNRyA9ICdodHRwczovL2FsbGVuZ2xpc2g0dS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDYvJzsKLy8gUGFydCAxOiBkcmF3IGxpbmVzIFx1MjAxNCB3aW50ZXIgc2NlbmUgKEhlbGVuLCBIYXJyeSwgRGF2aWQ9RXgsIEVtbWEsIFNhcmFoLCBSaWNoYXJkOyBXaWxsaWFtPWRpc3RyYWN0b3IpCnZhciBQMV9OQU1FUyA9IFsKICB7bjonRXgnLCBuYW1lOidEYXZpZCcsICAgYW5zOid0YXJnZXRfZGF2aWQnLCAgIGlzRXhhbXBsZTp0cnVlfSwKICB7bjoxLCAgICBuYW1lOidIZWxlbicsICAgYW5zOid0YXJnZXRfaGVsZW4nfSwKICB7bjoyLCAgICBuYW1lOidIYXJyeScsICAgYW5zOid0YXJnZXRfaGFycnknfSwKICB7bjozLCAgICBuYW1lOidFbW1hJywgICAgYW5zOid0YXJnZXRfZW1tYSd9LAogIHtuOjQsICAgIG5hbWU6J1NhcmFoJywgICBhbnM6J3RhcmdldF9zYXJhaCd9LAogIHtuOjUsICAgIG5hbWU6J1JpY2hhcmQnLCBhbnM6J3RhcmdldF9yaWNoYXJkJ30sCiAge246J1x1MjAxMycsIG5hbWU6J1dpbGxpYW0nLCBhbnM6J3RhcmdldF93aWxsaWFtJywgZGlzdHJhY3Rvcjp0cnVlfQpdOwp2YXIgUDFfVEFSR0VUUyA9IFsKICB7a2V5Oid0YXJnZXRfZGF2aWQnLCAgIGxhYmVsOidEYXZpZCBcdTIwMTQgZGFyay1oYWlyZWQsIG5lYXIgc25vd21hbiAoZXhhbXBsZSknLCAgeDo3NSwgeTo0MCwgaXNFeGFtcGxlOnRydWV9LAogIHtrZXk6J3RhcmdldF9oZWxlbicsICAgbGFiZWw6J0hlbGVuIFx1MjAxNCBnaXJsIG5lYXIgc25vd21hbiwgYmx1ZSBzY2FyZicsICAgICAgICAgeDo1MCwgeTo0MX0sCiAge2tleTondGFyZ2V0X2hhcnJ5JywgICBsYWJlbDonSGFycnkgXHUyMDE0IGJveSBzaXR0aW5nIG9uIHNsZWRnZScsICAgICAgICAgICAgICAgICB4OjIyLCB5OjQyfSwKICB7a2V5Oid0YXJnZXRfZW1tYScsICAgIGxhYmVsOidFbW1hIFx1MjAxNCBnaXJsIHRocm93aW5nIHNub3diYWxsJywgICAgICAgICAgICAgICAgIHg6NjAsIHk6NzB9LAogIHtrZXk6J3RhcmdldF9zYXJhaCcsICAgbGFiZWw6J1NhcmFoIFx1MjAxNCByZWQgdHJvdXNlcnMsIGdyZWVuIGphY2tldCcsICAgICAgICAgICAgeDo1MiwgeTo1Mn0sCiAge2tleTondGFyZ2V0X3JpY2hhcmQnLCBsYWJlbDonUmljaGFyZCBcdTIwMTQgYm95IGx5aW5nIGluIHNub3cnLCAgICAgICAgICAgICAgICAgICB4OjUzLCB5OjI0fSwKICB7a2V5Oid0YXJnZXRfd2lsbGlhbScsIGxhYmVsOidXaWxsaWFtIFx1MjAxNCBib3kgYmVpbmcgaGl0IGJ5IHNub3diYWxsJywgICAgICAgICAgIHg6MjUsIHk6Njh9Cl07Ci8vIFBhcnQgMjogVGVubmlzIENvbXBldGl0aW9uIGZvcm0KdmFyIFAyX0VYQU1QTEVTID0gWwogIHtsYWJlbDonRnVsbCBuYW1lOicsIGRpc3BsYXk6J0JldHR5IEJhcnJhdHQnfQpdOwp2YXIgUDJfUVVFU1RJT05TID0gWwogIHtuOjYsICBsYWJlbDonQWdlOicsICAgICAgICAgICAgIGFjY2VwdGVkOlsnMTAnXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTonMTAnfSwKICB7bjo3LCAgbGFiZWw6J0FkZHJlc3M6JywgICAgICAgICBwcmVmaXg6JzE3ICcsIHN1ZmZpeDonIFN0cmVldCcsIGFjY2VwdGVkOlsncmFuZGFsbCddLCAgICAgICAgIGRpc3BsYXk6J1JhbmRhbGwnfSwKICB7bjo4LCAgbGFiZWw6J1Bob25lIG51bWJlcjonLCAgICBhY2NlcHRlZDpbJzgxMCAzMzQnLCc4MTAzMzQnLCc4MTAtMzM0J10sICAgIGRpc3BsYXk6JzgxMCAzMzQnfSwKICB7bjo5LCAgbGFiZWw6J1llYXJzIG9mIHRlbm5pczonLCBhY2NlcHRlZDpbJzQnLCdmb3VyJ10sICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6JzQnfSwKICB7bjoxMCwgbGFiZWw6J1RpbWUgcHJlZmVycmVkOicsICBhY2NlcHRlZDpbJ2FmdGVybm9vbnMnLCdhZnRlcm5vb24nXSwgICAgICAgIGRpc3BsYXk6J2FmdGVybm9vbnMnfQpdOwovLyBQYXJ0IDM6IEEtSCBmb29kIG1hdGNoaW5nCnZhciBQM19MRVRURVJfQkFOSyA9IFsKICB7TDonQScsIGxhYmVsOidwaXp6YSd9LAogIHtMOidCJywgbGFiZWw6J3NhbGFkJ30sCiAge0w6J0MnLCBsYWJlbDonY2hvY29sYXRlJ30sCiAge0w6J0QnLCBsYWJlbDonY2hpcHMnfSwKICB7TDonRScsIGxhYmVsOidtZWxvbid9LAogIHtMOidGJywgbGFiZWw6J2NoZWVzZSd9LAogIHtMOidHJywgbGFiZWw6J25vb2RsZXMnfSwKICB7TDonSCcsIGxhYmVsOidiaXNjdWl0cyd9Cl07CnZhciBQM19FWEFNUExFX01BVENIID0ge246J0V4JywgcGVyc29uOidCaWxsJywgICBhbnM6J0QnLCB3aHk6J2NoaXBzJ307CnZhciBQM19RVUVTVElPTlNfTUFUQ0ggPSBbCiAge246MTEsIHBlcnNvbjonTWFyeScsICAgYW5zOidFJywgd2h5OidtZWxvbid9LAogIHtuOjEyLCBwZXJzb246J1JvYmVydCcsIGFuczonRycsIHdoeTonbm9vZGxlcyd9LAogIHtuOjEzLCBwZXJzb246J0FsZXgnLCAgIGFuczonQScsIHdoeToncGl6emEnfSwKICB7bjoxNCwgcGVyc29uOidCZW4nLCAgICBhbnM6J0MnLCB3aHk6J2Nob2NvbGF0ZSd9LAogIHtuOjE1LCBwZXJzb246J0thdHknLCAgIGFuczonSCcsIHdoeTonYmlzY3VpdHMnfQpdOwovLyBTdGFydGVycy1zdHlsZSBQMyBNQ1EgZGlzYWJsZWQgZm9yIEZseWVycyAoUDMgPSBBLUggbWF0Y2hpbmcgYWJvdmUpCnZhciBQM19FWEFNUExFID0gbnVsbDsKdmFyIFAzX1FVRVNUSU9OUyA9IFtdOwovLyBQYXJ0IDQ6IGNvbG91ciBwYWxldHRlICsgb2NlYW4gU1ZHIHNjZW5lCnZhciBQNF9FWEFNUExFID0ge2luc3RydWN0aW9uOidFeGFtcGxlIFx1MjAxNCBjb2xvdXIgdGhlIGRvbHBoaW4gYmxhY2suJywgcmVnaW9uOidkb2xwaGluJywgY29sb3VyOidibGFjayd9Owp2YXIgUDVfRVhBTVBMRVMgPSBbXTsKdmFyIFA1X0lURU1TX0NPTE9VUiA9IFsKICB7bjoyMSwgaW5zdHJ1Y3Rpb246J0NvbG91ciB0aGUgc2FpbCBib2F0IFJFRC4nLCAgcmVnaW9uOidzYWlsYm9hdCcsIGNvbG91cjoncmVkJ30sCiAge246MjIsIGluc3RydWN0aW9uOidDb2xvdXIgdGhlIGZpc2ggQkxVRS4nLCAgICAgIHJlZ2lvbjonZmlzaCcsICAgICBjb2xvdXI6J2JsdWUnfSwKICB7bjoyMywgaW5zdHJ1Y3Rpb246J0NvbG91ciB0aGUgb2N0b3B1cyBHUkVFTi4nLCAgcmVnaW9uOidvY3RvcHVzJywgIGNvbG91cjonZ3JlZW4nfQpdOwp2YXIgUDVfUVVFU1RJT05TID0gWwogIHtuOjI0LCBsYWJlbDonRHJhdyB0d28gYmlyZHMgaW4gdGhlIHNreS4nLCAgICAgIGFjY2VwdGVkOlsndHdvIGJpcmRzJywnYmlyZHMnLCdiaXJkJywnZHJldyBiaXJkcycsJ2RyZXcgMiBiaXJkcyddLCBkaXNwbGF5Oid0d28gYmlyZHMnfSwKICB7bjoyNSwgbGFiZWw6J0RyYXcgYSB5ZWxsb3cgc3VuIG9uIHRoZSByaWdodC4nLCBhY2NlcHRlZDpbJ3llbGxvdyBzdW4nLCdzdW4nLCdkcmV3IHN1biddLCAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Oid5ZWxsb3cgc3VuJ30KXTsKdmFyIFA0X0lURU1TID0gUDVfSVRFTVNfQ09MT1VSOwovLyBGbHllcnMgUGFydCA0OiBwaWN0dXJlIE1DUSA1IHF1ZXN0aW9ucyB4IDMgb3B0aW9ucwp2YXIgUDRfRVhBTVBMRV9QSUMgPSB7CiAgcToiV2hhdFx1MjAxOXMgU3VlXHUyMDE5cyBicm90aGVyXHUyMDE5cyBqb2I\/IiwKICBvcHRzOlsKICAgIHtsZXR0ZXI6J0EnLCBpbWc6SU1HKydmMXQxLXA0LWV4LWEuanBnJ30sCiAgICB7bGV0dGVyOidCJywgaW1nOklNRysnZjF0MS1wNC1leC1iLmpwZycsIGlzQW5zd2VyOnRydWV9LAogICAge2xldHRlcjonQycsIGltZzpJTUcrJ2YxdDEtcDQtZXgtYy5qcGcnfQogIF0sCiAgYW5zOidCJwp9Owp2YXIgUDRfUVVFU1RJT05TX1BJQyA9IFsKICB7bjoxNiwgcTonV2hlcmUgZG9lcyBoZXIgYnJvdGhlciB3b3JrPycsCiAgIG9wdHM6W3tsZXR0ZXI6J0EnLGltZzpJTUcrJ2YxdDEtcDQtcTE2LWEuanBnJ30se2xldHRlcjonQicsaW1nOklNRysnZjF0MS1wNC1xMTYtYi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydmMXQxLXA0LXExNi1jLmpwZycsaXNBbnN3ZXI6dHJ1ZX1dLAogICBhbnM6J0MnfSwKICB7bjoxNywgcTonSG93IGRvZXMgaGUgZ28gdG8gd29yaz8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmMXQxLXA0LXExNy1hLmpwZycsaXNBbnN3ZXI6dHJ1ZX0se2xldHRlcjonQicsaW1nOklNRysnZjF0MS1wNC1xMTctYi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydmMXQxLXA0LXExNy1jLmpwZyd9XSwKICAgYW5zOidBJ30sCiAge246MTgsIHE6J1doZW4gZG9lcyBoZSBzdGFydCB3b3JrPycsCiAgIG9wdHM6W3tsZXR0ZXI6J0EnLGltZzpJTUcrJ2YxdDEtcDQtcTE4LWEuanBnJ30se2xldHRlcjonQicsaW1nOklNRysnZjF0MS1wNC1xMTgtYi5qcGcnLGlzQW5zd2VyOnRydWV9LHtsZXR0ZXI6J0MnLGltZzpJTUcrJ2YxdDEtcDQtcTE4LWMuanBnJ31dLAogICBhbnM6J0InfSwKICB7bjoxOSwgcTonV2hhdCBkb2VzIGhlIGRvIGZvciBsdW5jaD8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmMXQxLXA0LXExOS1hLmpwZycsaXNBbnN3ZXI6dHJ1ZX0se2xldHRlcjonQicsaW1nOklNRysnZjF0MS1wNC1xMTktYi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydmMXQxLXA0LXExOS1jLmpwZyd9XSwKICAgYW5zOidBJ30sCiAge246MjAsIHE6J1doYXQgZGlkIGhlIGRvIGJlZm9yZSB0aGlzIGpvYj8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmMXQxLXA0LXEyMC1hLmpwZyd9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ2YxdDEtcDQtcTIwLWIuanBnJ30se2xldHRlcjonQycsaW1nOklNRysnZjF0MS1wNC1xMjAtYy5qcGcnLGlzQW5zd2VyOnRydWV9XSwKICAgYW5zOidDJ30KXTsKdmFyIFA0X0NPTE9VUlMgPSBbCiAge2tleToncmVkJywgICAgaGV4OicjRUY0NDQ0J30sCiAge2tleTonYmx1ZScsICAgaGV4OicjM0I4MkY2J30sCiAge2tleTonZ3JlZW4nLCAgaGV4OicjMTBCOTgxJ30sCiAge2tleToneWVsbG93JywgaGV4OicjRkFDQzE1J30sCiAge2tleTonb3JhbmdlJywgaGV4OicjRjk3MzE2J30sCiAge2tleToncHVycGxlJywgaGV4OicjOEI1Q0Y2J30sCiAge2tleToncGluaycsICAgaGV4OicjRUM0ODk5J30sCiAge2tleTonYnJvd24nLCAgaGV4OicjOTI0MDBFJ30sCiAge2tleTonYmxhY2snLCAgaGV4OicjMEYxNzJBJ30KXTsKdmFyIFRPVEFMPTI1OwoKLyogPT09PT0gVVRJTElUSUVTID09PT09ICovCmZ1bmN0aW9uIGVzYyhzKXtyZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD4iJ10vZyxmdW5jdGlvbihjKXtyZXR1cm57JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JywiJyI6JyYjMzk7J31bY119KX0KZnVuY3Rpb24gJCQoc2VsLGN0eCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKChjdHh8fGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHNlbCkpfQpmdW5jdGlvbiAkKHNlbCxjdHgpe3JldHVybiAoY3R4fHxkb2N1bWVudCkucXVlcnlTZWxlY3RvcihzZWwpfQoKLyogPT09PT0gSEVBREVSICsgRFJBV0VSID09PT09ICovCnZhciBoZHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hkcicpOwpmdW5jdGlvbiBzZXRTb2xpZCgpe2lmKHdpbmRvdy5zY3JvbGxZPjQwKWhkci5jbGFzc0xpc3QuYWRkKCdzb2xpZCcpO2Vsc2UgaGRyLmNsYXNzTGlzdC5yZW1vdmUoJ3NvbGlkJyl9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHNldFNvbGlkLHtwYXNzaXZlOnRydWV9KTtzZXRTb2xpZCgpOwp2YXIgaGFtYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGFtYicpLGRyYXdlcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2VyJyksZENsb3NlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmF3ZXJDbG9zZScpOwppZihoYW1iKWhhbWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7ZHJhd2VyLmNsYXNzTGlzdC5hZGQoJ29wZW4nKX0pOwppZihkQ2xvc2UpZENsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe2RyYXdlci5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyl9KTsKaWYoZHJhd2VyKWRyYXdlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7aWYoZS50YXJnZXQ9PT1kcmF3ZXIpZHJhd2VyLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKX0pOwoKLyogPT09PT0gWU9VVFVCRSA9PT09PSAqLwp2YXIgeXRSZWFkeT1mYWxzZSwgeXRQbGF5ZXI9bnVsbDsKdmFyIHRhZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsgdGFnLnNyYz0naHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7CmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGFnKTsKd2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5PWZ1bmN0aW9uKCl7CiAgeXRQbGF5ZXI9bmV3IFlULlBsYXllcigneXRQbGF5ZXInLHtldmVudHM6e29uUmVhZHk6ZnVuY3Rpb24oKXt5dFJlYWR5PXRydWV9fX0pOwp9OwpmdW5jdGlvbiB5dFNlZWsoc2VjKXsKICBpZih5dFJlYWR5KXsgeXRQbGF5ZXIuc2Vla1RvKHNlYywgdHJ1ZSk7IHl0UGxheWVyLnBsYXlWaWRlbygpOyB9CiAgZWxzZXsgdmFyIGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3l0UGxheWVyJyk7IGYuc3JjPWYuc3JjLnNwbGl0KCc\/JylbMF0rJz9lbmFibGVqc2FwaT0xJnJlbD0wJmF1dG9wbGF5PTEmc3RhcnQ9JytzZWM7IH0KfQpmdW5jdGlvbiB5dFBhdXNlKCl7IGlmKHl0UmVhZHkpeXRQbGF5ZXIucGF1c2VWaWRlbygpOyB9CmZ1bmN0aW9uIHl0UGxheSgpeyBpZih5dFJlYWR5KXl0UGxheWVyLnBsYXlWaWRlbygpOyB9CmZ1bmN0aW9uIHl0UmV3aW5kKCl7IGlmKHl0UmVhZHkpeyB2YXIgdD15dFBsYXllci5nZXRDdXJyZW50VGltZSgpOyB5dFBsYXllci5zZWVrVG8oTWF0aC5tYXgoMCx0LTEwKSx0cnVlKTsgfSB9CmZ1bmN0aW9uIHl0UmF0ZShyKXsgaWYoeXRSZWFkeSl5dFBsYXllci5zZXRQbGF5YmFja1JhdGUocik7IH0KCiQkKCcuanVtcC1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGIpewogIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICB2YXIgdD1wYXJzZUludChiLmRhdGFzZXQudGltZSk7CiAgICB5dFNlZWsodCk7CiAgICAkJCgnLmp1bXAtYnRuJykuZm9yRWFjaChmdW5jdGlvbih4KXt4LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpfSk7CiAgICBiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgaWYoYi5kYXRhc2V0LnBhcnQgJiYgYi5kYXRhc2V0LnBhcnQhPT0naW50cm8nKXsKICAgICAgdmFyIHNlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFydCcrYi5kYXRhc2V0LnBhcnQpOwogICAgICBpZihzZWMpc2VjLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjonc21vb3RoJyxibG9jazonc3RhcnQnfSk7CiAgICB9CiAgfSk7Cn0pOwokJCgnLmFjdC1waWxsW2RhdGEtdGltZV0nKS5mb3JFYWNoKGZ1bmN0aW9uKGIpewogIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IHl0U2VlayhwYXJzZUludChiLmRhdGFzZXQudGltZSkpOyB9KTsKfSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5QYXVzZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx5dFBhdXNlKTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blBsYXknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycseXRQbGF5KTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blJld2luZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx5dFJld2luZCk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5TbG93ZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXt5dFJhdGUoMC43NSl9KTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bk5vcm1hbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3l0UmF0ZSgxKX0pOwoKJCQoJy50cy10b2dnbGUsIC50cy1oZWFkJykuZm9yRWFjaChmdW5jdGlvbihiKXsKICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgdmFyIHRhcmdldD1iLmRhdGFzZXQudGFyZ2V0fHxiLmRhdGFzZXQudG9nZ2xlOwogICAgaWYoIXRhcmdldCl7IHZhciBjYXJkPWIuY2xvc2VzdCgnLnRyYW5zY3JpcHQtY2FyZCcpOyBpZihjYXJkKXRhcmdldD1jYXJkLmlkOyB9CiAgICB2YXIgY2FyZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQpOwogICAgaWYoY2FyZCljYXJkLmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpOwogIH0pOwp9KTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQQVJUIDEgXHUyMDE0IERSQVcgTElORVMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCnZhciBQMV91c2VyTWF0Y2hlcyA9IHt9OyAvLyB7IG5hbWVOOiB0Z3RLZXkgfQp2YXIgUDFfc2VsZWN0ZWROYW1lID0gbnVsbDsKdmFyIHBhaXJOYW1lc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXJOYW1lcycpOwp2YXIgcGFpclRhcmdldHNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyVGFyZ2V0cycpOwp2YXIgcGFpckxpbmVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpckxpbmVzJyk7CnZhciBwYWlySW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXJJbWcnKTsKdmFyIHBhaXJTY2VuZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyU2NlbmUnKTsKCmZ1bmN0aW9uIHJlbmRlclAxTmFtZXMoKXsKICBwYWlyTmFtZXNFbC5pbm5lckhUTUwgPSAnJzsKICBQMV9OQU1FUy5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpewogICAgdmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGRpdi5jbGFzc05hbWU9J3BhaXItbmFtZScgKyAobmFtZS5pc0V4YW1wbGU\/JyBleGFtcGxlJzonJyk7CiAgICBkaXYuZGF0YXNldC5uID0gbmFtZS5uOwogICAgZGl2LmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0icG4tbnVtIj4nK2VzYyhTdHJpbmcobmFtZS5uKSkrJzwvc3Bhbj48c3Bhbj4nK2VzYyhuYW1lLm5hbWUpKyc8L3NwYW4+PHNwYW4gY2xhc3M9InBuLWRvdCI+PC9zcGFuPic7CiAgICBpZighbmFtZS5pc0V4YW1wbGUpewogICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgICAgJCQoJy5wYWlyLW5hbWUnLHBhaXJOYW1lc0VsKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKX0pOwogICAgICAgIGlmKFAxX3NlbGVjdGVkTmFtZT09PW5hbWUubil7IFAxX3NlbGVjdGVkTmFtZT1udWxsOyB9CiAgICAgICAgZWxzZSB7IGRpdi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOyBQMV9zZWxlY3RlZE5hbWU9bmFtZS5uOyB9CiAgICAgIH0pOwogICAgfQogICAgcGFpck5hbWVzRWwuYXBwZW5kQ2hpbGQoZGl2KTsKICB9KTsKfQoKZnVuY3Rpb24gcmVuZGVyUDFUYXJnZXRzKCl7CiAgcGFpclRhcmdldHNFbC5pbm5lckhUTUw9Jyc7CiAgUDFfVEFSR0VUUy5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAgdmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkLmNsYXNzTmFtZT0ndGd0JysodC5pc0V4YW1wbGU\/JyBleGFtcGxlJzonJyk7CiAgICBkLnN0eWxlLmxlZnQ9dC54KyclJzsKICAgIGQuc3R5bGUudG9wPXQueSsnJSc7CiAgICBkLmRhdGFzZXQua2V5PXQua2V5OwogICAgZC5pbm5lckhUTUw9JzxzcGFuIGNsYXNzPSJ0bGFiZWwiPicrZXNjKHQubGFiZWwpKyc8L3NwYW4+JzsKICAgIGlmKCF0LmlzRXhhbXBsZSl7CiAgICAgIGQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoIVAxX3NlbGVjdGVkTmFtZSlyZXR1cm47CiAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIG1hdGNoIGZvciB0aGlzIG5hbWUKICAgICAgICBkZWxldGUgUDFfdXNlck1hdGNoZXNbUDFfc2VsZWN0ZWROYW1lXTsKICAgICAgICAvLyByZW1vdmUgYW55IG5hbWUgdGhhdCBtYXBzIHRvIHRoaXMgdGFyZ2V0CiAgICAgICAgT2JqZWN0LmtleXMoUDFfdXNlck1hdGNoZXMpLmZvckVhY2goZnVuY3Rpb24oayl7CiAgICAgICAgICBpZihQMV91c2VyTWF0Y2hlc1trXT09PXQua2V5KSBkZWxldGUgUDFfdXNlck1hdGNoZXNba107CiAgICAgICAgfSk7CiAgICAgICAgUDFfdXNlck1hdGNoZXNbUDFfc2VsZWN0ZWROYW1lXSA9IHQua2V5OwogICAgICAgIHZhciBuYW1lRWwgPSBwYWlyTmFtZXNFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uPSInK1AxX3NlbGVjdGVkTmFtZSsnIl0nKTsKICAgICAgICBpZihuYW1lRWwpe25hbWVFbC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO25hbWVFbC5jbGFzc0xpc3QuYWRkKCdtYXRjaGVkJyk7fQogICAgICAgIFAxX3NlbGVjdGVkTmFtZT1udWxsOwogICAgICAgIGRyYXdQMUxpbmVzKCk7CiAgICAgICAgdXBkYXRlUHJvZ3Jlc3MoKTsKICAgICAgfSk7CiAgICB9CiAgICBwYWlyVGFyZ2V0c0VsLmFwcGVuZENoaWxkKGQpOwogIH0pOwp9CgpmdW5jdGlvbiBkcmF3UDFMaW5lcyhvcHRzKXsKICBvcHRzID0gb3B0cyB8fCB7fTsKICB2YXIgc2hvd0NvcnJlY3QgPSBvcHRzLnNob3dDb3JyZWN0OwogIHZhciBiYm94ID0gcGFpckltZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICB2YXIgc2NlbmVCYm94ID0gcGFpclNjZW5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIHBhaXJMaW5lc0VsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBzY2VuZUJib3gud2lkdGgpOwogIHBhaXJMaW5lc0VsLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgc2NlbmVCYm94LmhlaWdodCk7CiAgcGFpckxpbmVzRWwuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAnK3NjZW5lQmJveC53aWR0aCsnICcrc2NlbmVCYm94LmhlaWdodCk7CiAgdmFyIHN2Z25zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CiAgcGFpckxpbmVzRWwuaW5uZXJIVE1MPScnOwoKICAvLyBleGFtcGxlIGxpbmUgKGFsd2F5cyBzaG93KQogIHZhciBleE5hbWUgPSBQMV9OQU1FUy5maW5kKGZ1bmN0aW9uKG4pe3JldHVybiBuLmlzRXhhbXBsZX0pOwogIHZhciBleFRndCA9IFAxX1RBUkdFVFMuZmluZChmdW5jdGlvbih0KXtyZXR1cm4gdC5pc0V4YW1wbGV9KTsKICBpZihleE5hbWUgJiYgZXhUZ3QpewogICAgZHJhd0xpbmUoZXhOYW1lLm4sIGV4VGd0LCAnI0ZCQkYyNCcsIDMsIHRydWUpOwogIH0KCiAgLy8gdXNlciBsaW5lcyAob3IgY29ycmVjdCBsaW5lcyBpZiBzaG93Q29ycmVjdCkKICBQMV9OQU1FUy5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpewogICAgaWYobmFtZS5pc0V4YW1wbGUpcmV0dXJuOwogICAgdmFyIHRndEtleTsKICAgIGlmKHNob3dDb3JyZWN0KSB0Z3RLZXkgPSBuYW1lLmFuczsKICAgIGVsc2UgdGd0S2V5ID0gUDFfdXNlck1hdGNoZXNbbmFtZS5uXTsKICAgIGlmKCF0Z3RLZXkpcmV0dXJuOwogICAgdmFyIHRndCA9IFAxX1RBUkdFVFMuZmluZChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXk9PT10Z3RLZXl9KTsKICAgIGlmKCF0Z3QpcmV0dXJuOwogICAgdmFyIGNvbG91ciA9IHNob3dDb3JyZWN0ID8gJyMxMEI5ODEnIDogJyMwNkI2RDQnOwogICAgZHJhd0xpbmUobmFtZS5uLCB0Z3QsIGNvbG91ciwgMi41LCBmYWxzZSk7CiAgfSk7CgogIGZ1bmN0aW9uIGRyYXdMaW5lKG5hbWVOLCB0Z3QsIGNvbG91ciwgdywgaXNFeGFtcGxlKXsKICAgIHZhciBuYW1lRWwgPSBwYWlyTmFtZXNFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uPSInK25hbWVOKyciXScpOwogICAgaWYoIW5hbWVFbClyZXR1cm47CiAgICB2YXIgbmIgPSBuYW1lRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgeDEgPSBuYi5yaWdodCAtIHNjZW5lQmJveC5sZWZ0OwogICAgdmFyIHkxID0gbmIudG9wICsgbmIuaGVpZ2h0LzIgLSBzY2VuZUJib3gudG9wOwogICAgdmFyIHgyID0gdGd0LngvMTAwICogc2NlbmVCYm94LndpZHRoOwogICAgdmFyIHkyID0gdGd0LnkvMTAwICogc2NlbmVCYm94LmhlaWdodDsKICAgIHZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z25zLCdsaW5lJyk7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgneDEnLHgxKTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCd5MScseTEpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3gyJyx4Mik7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgneTInLHkyKTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2UnLGNvbG91cik7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJyx3KTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsJ3JvdW5kJyk7CiAgICBpZihpc0V4YW1wbGUpIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaGFycmF5JywnNiA0Jyk7CiAgICBsaW5lLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBpc0V4YW1wbGUgPyAnbm9uZScgOiAnc3Ryb2tlJzsKICAgIGxpbmUuc3R5bGUuY3Vyc29yID0gaXNFeGFtcGxlID8gJ2RlZmF1bHQnIDogJ3BvaW50ZXInOwogICAgaWYoIWlzRXhhbXBsZSl7CiAgICAgIGxpbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgICAgLy8gZXJhc2UgdGhpcyBsaW5lCiAgICAgICAgZGVsZXRlIFAxX3VzZXJNYXRjaGVzW25hbWVOXTsKICAgICAgICB2YXIgbmFtZUVsMiA9IHBhaXJOYW1lc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW49IicrbmFtZU4rJyJdJyk7CiAgICAgICAgaWYobmFtZUVsMikgbmFtZUVsMi5jbGFzc0xpc3QucmVtb3ZlKCdtYXRjaGVkJyk7CiAgICAgICAgZHJhd1AxTGluZXMoKTsKICAgICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgICB9KTsKICAgIH0KICAgIHBhaXJMaW5lc0VsLmFwcGVuZENoaWxkKGxpbmUpOwogIH0KfQoKZnVuY3Rpb24gcDFSZXZlYWwoKXsKICAvLyBzaG93IGNvcnJlY3QgbGluZXMsIGxvY2sgaW50ZXJhY3Rpb25zCiAgZHJhd1AxTGluZXMoe3Nob3dDb3JyZWN0OnRydWV9KTsKICAkJCgnLnBhaXItbmFtZScscGFpck5hbWVzRWwpLmZvckVhY2goZnVuY3Rpb24oZWwpewogICAgZWwuc3R5bGUub3BhY2l0eT0nLjcnOwogICAgZWwuc3R5bGUucG9pbnRlckV2ZW50cz0nbm9uZSc7CiAgfSk7CiAgJCQoJy50Z3QnLHBhaXJUYXJnZXRzRWwpLmZvckVhY2goZnVuY3Rpb24oZWwpewogICAgaWYoIWVsLmNsYXNzTGlzdC5jb250YWlucygnZXhhbXBsZScpKWVsLnN0eWxlLnBvaW50ZXJFdmVudHM9J25vbmUnOwogIH0pOwp9Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncDFDbGVhcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogIGlmKCFjb25maXJtKCdDbGVhciBhbGwgeW91ciBQYXJ0IDEgbGluZXM\/JykpcmV0dXJuOwogIFAxX3VzZXJNYXRjaGVzPXt9OwogICQkKCcucGFpci1uYW1lJyxwYWlyTmFtZXNFbCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LmNsYXNzTGlzdC5yZW1vdmUoJ21hdGNoZWQnLCdzZWxlY3RlZCcpfSk7CiAgZHJhd1AxTGluZXMoKTsKICB1cGRhdGVQcm9ncmVzcygpOwp9KTsKCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLGZ1bmN0aW9uKCl7ZHJhd1AxTGluZXMoKX0pOwoKcmVuZGVyUDFOYW1lcygpOwpyZW5kZXJQMVRhcmdldHMoKTsKcGFpckltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxkcmF3UDFMaW5lcyk7Ci8vIGFsc28gZHJhdyBhZnRlciBhIHRpY2sgKGluIGNhc2UgY2FjaGVkKQpzZXRUaW1lb3V0KGRyYXdQMUxpbmVzLCAyMDApOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFBBUlQgMiBcdTIwMTQgSU5QVVQgQkxBTktTCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwooZnVuY3Rpb24oKXsKICB2YXIgZXhhbXBsZXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwMkV4YW1wbGVzJyk7CiAgUDJfRVhBTVBMRVMuZm9yRWFjaChmdW5jdGlvbihleCl7CiAgICBleGFtcGxlc0VsLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgJzxkaXYgY2xhc3M9ImZvcm0tcm93IGV4YW1wbGUiPjxsYWJlbD4nK2VzYyhleC5sYWJlbCkrJyA8c3BhbiBjbGFzcz0iZXgtdGFnIj5FeDwvc3Bhbj48L2xhYmVsPjxzcGFuIHN0eWxlPSJjb2xvcjojN0I1QjAwO2ZvbnQtd2VpZ2h0OjcwMCI+Jytlc2MoZXguZGlzcGxheSkrJzwvc3Bhbj48L2Rpdj4nCiAgICApOwogIH0pOwogIHZhciBxdWVzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3AyUXVlc3Rpb25zJyk7CiAgUDJfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgcHJlZml4SHRtbCA9IHEucHJlZml4ID8gZXNjKHEucHJlZml4KSsnICcgOiAnJzsKICAgIHF1ZXN0RWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAnPGRpdiBjbGFzcz0iZm9ybS1yb3ciPjxsYWJlbD48Yj4nK3EubisnLjwvYj4gJytlc2MocS5sYWJlbCkrJzwvbGFiZWw+JysKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4Ij4nK3ByZWZpeEh0bWwrCiAgICAgICc8aW5wdXQgY2xhc3M9ImlucHV0LWJsYW5rIiBkYXRhLXE9IicrcS5uKyciIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSIuLi4iPjwvc3Bhbj4nKwogICAgICAnPGJ1dHRvbiBjbGFzcz0ic2hvdy1hbnMtYnRuIiBkYXRhLXNob3c9IicrcS5uKyciPlx1ezFGNDQxfSBTaG93PC9idXR0b24+PC9kaXY+JwogICAgKTsKICB9KTsKfSkoKTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQQVJUIDMgXHUyMDE0IFBJQ1RVUkUgTUNRCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwooZnVuY3Rpb24oKXsKICB2YXIgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJ0M0xpc3QnKTsKICAvLyBleGFtcGxlCiAgaWYoUDNfRVhBTVBMRSl7CiAgICB2YXIgZXhIdG1sID0gJzxkaXYgY2xhc3M9InEtaXRlbSByZXZlYWxlZCIgc3R5bGU9Im9wYWNpdHk6LjgiPjxkaXYgY2xhc3M9InEtdGV4dCI+PGIgY2xhc3M9InFuIj5FeC48L2I+PHNwYW4+Jytlc2MoUDNfRVhBTVBMRS5xKSsnICZtZGFzaDsgYW5zd2VyOiA8Yj4nK2VzYyhQM19FWEFNUExFLmFucykrJzwvYj48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0icGljLW1jcSI+JzsKICAgIFAzX0VYQU1QTEUub3B0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICB2YXIgc2VsID0gby5pc0Fuc3dlciA\/ICcgc2VsZWN0ZWQgY29ycmVjdC1vcHQnIDogJyc7CiAgICAgIGV4SHRtbCArPSAnPGRpdiBjbGFzcz0icGljLW9wdCcrc2VsKyciPjxpbWcgc3JjPSInK28uaW1nKyciIGFsdD0iZXhhbXBsZSAnK28ubGV0dGVyKyciPjxkaXYgY2xhc3M9InBpYy1sZXR0ZXIiPjxiPicrby5sZXR0ZXIrJzwvYj48c3BhbiBjbGFzcz0icGljLXRpY2siPicrKG8uaXNBbnN3ZXI\/J1x1MjcxMyc6JycpKyc8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgIH0pOwogICAgZXhIdG1sICs9ICc8L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGV4SHRtbCk7CiAgfQogIFAzX1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIGggPSAnPGRpdiBjbGFzcz0icS1pdGVtIiBpZD0icScrcS5uKyciIGRhdGEtcWlkPSInK3EubisnIj48ZGl2IGNsYXNzPSJxLXRleHQiPjxiIGNsYXNzPSJxbiI+JytxLm4rJy48L2I+PHNwYW4+Jytlc2MocS5xKSsnPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgICBxLm9wdHMuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgaCArPSAnPGRpdiBjbGFzcz0icGljLW9wdCIgZGF0YS1sZXR0ZXI9Iicrby5sZXR0ZXIrJyIgZGF0YS1xPSInK3EubisnIj48aW1nIHNyYz0iJytvLmltZysnIiBhbHQ9IlEnK3EubisnIG9wdGlvbiAnK28ubGV0dGVyKyciIGxvYWRpbmc9ImxhenkiPjxkaXYgY2xhc3M9InBpYy1sZXR0ZXIiPjxiPicrby5sZXR0ZXIrJzwvYj48c3BhbiBjbGFzcz0icGljLXRpY2siPlx1MjcxMzwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgfSk7CiAgICBoICs9ICc8L2Rpdj48ZGl2IGNsYXNzPSJmZWVkYmFjayI+PC9kaXY+PGRpdiBjbGFzcz0icS1ib3R0b20iPjxidXR0b24gY2xhc3M9InNob3ctYW5zLWJ0biIgZGF0YS1zaG93PSInK3EubisnIj5cdXsxRjQ0MX0gU2hvdyBBbnN3ZXI8L2J1dHRvbj48L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGgpOwogIH0pOwogIC8vIHdpcmUgcGljIGNsaWNrcwogICQkKCcucGljLW9wdFtkYXRhLXFdJykuZm9yRWFjaChmdW5jdGlvbihvcHQpewogICAgb3B0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICB2YXIgcWlkID0gb3B0LmRhdGFzZXQucTsKICAgICAgJCQoJy5waWMtb3B0W2RhdGEtcT0iJytxaWQrJyJdJykuZm9yRWFjaChmdW5jdGlvbihvKXtvLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgICAgb3B0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7CiAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICB9KTsKICB9KTsKfSkoKTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQQVJUIDQgXHUyMDE0IENPTE9VUiBQQUxFVFRFCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwp2YXIgUDRfc2VsZWN0ZWRDb2xvdXIgPSBudWxsOwp2YXIgUDRfdXNlckNvbG91cnMgPSB7fTsgLy8geyByZWdpb246IGNvbG91cktleSB9CnZhciBQNF9SRUdJT05fVE9fUU4gPSB7fTsKUDRfSVRFTVMuZm9yRWFjaChmdW5jdGlvbihpdCl7IFA0X1JFR0lPTl9UT19RTltpdC5yZWdpb25dPWl0Lm47IH0pOwoKKGZ1bmN0aW9uKCl7CiAgdmFyIHBhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xvdXJQYWxldHRlJyk7CiAgLy8gZXJhc2VyIGZpcnN0CiAgdmFyIGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZXIuY2xhc3NOYW1lPSdzd2F0Y2ggZXJhc2VyJzsKICBlci5kYXRhc2V0LmNvbG91cj0nX19lcmFzZSc7CiAgZXIuaW5uZXJIVE1MPSc8c3BhbiBjbGFzcz0ic3ctbGFiZWwiPmVyYXNlcjwvc3Bhbj4nOwogIGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3NlbGVjdFN3YXRjaChlciwnX19lcmFzZScpfSk7CiAgcGFsLmFwcGVuZENoaWxkKGVyKTsKICBQNF9DT0xPVVJTLmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICB2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHMuY2xhc3NOYW1lPSdzd2F0Y2gnOwogICAgcy5zdHlsZS5iYWNrZ3JvdW5kPWMuaGV4OwogICAgcy5kYXRhc2V0LmNvbG91cj1jLmtleTsKICAgIHMuaW5uZXJIVE1MPSc8c3BhbiBjbGFzcz0ic3ctbGFiZWwiPicrYy5rZXkrJzwvc3Bhbj4nOwogICAgcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtzZWxlY3RTd2F0Y2gocyxjLmtleSl9KTsKICAgIHBhbC5hcHBlbmRDaGlsZChzKTsKICB9KTsKCiAgZnVuY3Rpb24gc2VsZWN0U3dhdGNoKGVsLGtleSl7CiAgICAkJCgnLnN3YXRjaCcscGFsKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKX0pOwogICAgZWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKICAgIFA0X3NlbGVjdGVkQ29sb3VyPWtleTsKICB9CgogIC8vIGluc3RydWN0aW9ucwogIHZhciBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3VySW5zdHJ1Y3Rpb25zJyk7CiAgaWYoUDRfRVhBTVBMRSl7CiAgICBpbnMuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAnPGRpdiBjbGFzcz0iY29sLWlucyBleGFtcGxlIj48c3BhbiBjbGFzcz0iY2ktbnVtIj5FeDwvc3Bhbj48c3Bhbj4nK2VzYyhQNF9FWEFNUExFLmluc3RydWN0aW9uKSsnPC9zcGFuPjxzcGFuIGNsYXNzPSJjaS1kb3QiIHN0eWxlPSJiYWNrZ3JvdW5kOicrZ2V0SGV4KFA0X0VYQU1QTEUuY29sb3VyKSsnIj48L3NwYW4+PC9kaXY+JwogICAgKTsKICAgIC8vIHByZS1jb2xvdXIgZXhhbXBsZSByZWdpb24KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXthcHBseUNvbG91clRvUmVnaW9uKFA0X0VYQU1QTEUucmVnaW9uLGdldEhleChQNF9FWEFNUExFLmNvbG91ciksdHJ1ZSl9LDE1MCk7CiAgfQogIFA0X0lURU1TLmZvckVhY2goZnVuY3Rpb24oaXQpewogICAgaW5zLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgJzxkaXYgY2xhc3M9ImNvbC1pbnMiIGRhdGEtcW49IicraXQubisnIj48c3BhbiBjbGFzcz0iY2ktbnVtIj4nK2l0Lm4rJzwvc3Bhbj48c3Bhbj4nK2VzYyhpdC5pbnN0cnVjdGlvbikrJzwvc3Bhbj48c3BhbiBjbGFzcz0iY2ktZG90IiBkYXRhLWRvdGZvcj0iJytpdC5uKyciIHN0eWxlPSJiYWNrZ3JvdW5kOiNmZmYiPjwvc3Bhbj48L2Rpdj4nCiAgICApOwogIH0pOwoKICAvLyB3aXJlIFNWRyByZWdpb25zCiAgdmFyIHNjZW5lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbG91clNjZW5lJyk7CiAgJCQoJ1tkYXRhLXJlZ2lvbl0nLHNjZW5lKS5mb3JFYWNoKGZ1bmN0aW9uKHJlZyl7CiAgICByZWcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgIGlmKCFQNF9zZWxlY3RlZENvbG91cil7YWxlcnQoJ1BsZWFzZSBwaWNrIGEgY29sb3VyIGZpcnN0IFx1ezFGM0E4fScpO3JldHVybn0KICAgICAgaWYocmVnLmRhdGFzZXQubG9ja2VkPT09JzEnKXJldHVybjsKICAgICAgdmFyIHJrZXkgPSByZWcuZGF0YXNldC5yZWdpb247CiAgICAgIGlmKFA0X3NlbGVjdGVkQ29sb3VyPT09J19fZXJhc2UnKXsKICAgICAgICBhcHBseUNvbG91clRvUmVnaW9uKHJrZXksJyNGRkZGRkYnLGZhbHNlKTsKICAgICAgICBkZWxldGUgUDRfdXNlckNvbG91cnNbcmtleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBwbHlDb2xvdXJUb1JlZ2lvbihya2V5LGdldEhleChQNF9zZWxlY3RlZENvbG91ciksZmFsc2UpOwogICAgICAgIFA0X3VzZXJDb2xvdXJzW3JrZXldPVA0X3NlbGVjdGVkQ29sb3VyOwogICAgICB9CiAgICAgIC8vIHVwZGF0ZSBkb3QKICAgICAgdmFyIHFuID0gUDRfUkVHSU9OX1RPX1FOW3JrZXldOwogICAgICBpZihxbil7CiAgICAgICAgdmFyIGRvdCA9IHNjZW5lLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZG90Zm9yPSInK3FuKyciXScpOwogICAgICAgIGlmKGRvdCkgZG90LnN0eWxlLmJhY2tncm91bmQgPSAoUDRfc2VsZWN0ZWRDb2xvdXI9PT0nX19lcmFzZSc\/JyNmZmYnOmdldEhleChQNF9zZWxlY3RlZENvbG91cikpOwogICAgICB9CiAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICB9KTsKICB9KTsKCi8qIEZMWUVSUyBQQVJUIDMgXHUyMDE0IE11bHRpcGxlIG1hdGNoaW5nIEEtSCAqLwooZnVuY3Rpb24oKXsKICB2YXIgYmFuayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwM0xldHRlckJhbmsnKTsKICBpZihiYW5rKXsKICAgIFAzX0xFVFRFUl9CQU5LLmZvckVhY2goZnVuY3Rpb24oYil7CiAgICAgIGJhbmsuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAgICc8ZGl2IGNsYXNzPSJtYXRjaC1sZXR0ZXIiPjxiPicrYi5MKyc8L2I+ICcrYi5sYWJlbCsnPC9kaXY+Jyk7CiAgICB9KTsKICB9CiAgdmFyIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFydDNMaXN0Jyk7CiAgaWYobGlzdCl7CiAgICAvLyBleGFtcGxlIHJvdwogICAgaWYoUDNfRVhBTVBMRV9NQVRDSCl7CiAgICAgIHZhciBleD0nPGRpdiBjbGFzcz0icS1pdGVtIHJldmVhbGVkIiBzdHlsZT0ib3BhY2l0eTouODUiPjxkaXYgY2xhc3M9InEtdGV4dCI+PGIgY2xhc3M9InFuIj5FeC48L2I+PHNwYW4+JytQM19FWEFNUExFX01BVENILnBlcnNvbisnICZtZGFzaDsgYW5zd2VyOiA8Yj4nK1AzX0VYQU1QTEVfTUFUQ0guYW5zKyc8L2I+ICgnK1AzX0VYQU1QTEVfTUFUQ0gud2h5KycpPC9zcGFuPjwvZGl2PjwvZGl2Pic7CiAgICAgIGxpc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBleCk7CiAgICB9CiAgICBQM19RVUVTVElPTlNfTUFUQ0guZm9yRWFjaChmdW5jdGlvbihxKXsKICAgICAgdmFyIG9wdHNIVE1MPScnOwogICAgICBbJ0EnLCdCJywnQycsJ0QnLCdFJywnRicsJ0cnLCdIJ10uZm9yRWFjaChmdW5jdGlvbihMKXsKICAgICAgICBvcHRzSFRNTCArPSAnPGxhYmVsIGNsYXNzPSJvcHQiIGRhdGEtbGV0dGVyPSInK0wrJyIgZGF0YS1xPSInK3EubisnIj48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InEnK3EubisnIiB2YWx1ZT0iJytMKyciPjxzcGFuIGNsYXNzPSJvcHQtbGV0dGVyIj4nK0wrJzwvc3Bhbj48L2xhYmVsPic7CiAgICAgIH0pOwogICAgICBsaXN0Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgICAnPGRpdiBjbGFzcz0icS1pdGVtIiBpZD0icScrcS5uKyciIGRhdGEtcWlkPSInK3EubisnIj48ZGl2IGNsYXNzPSJxLXRleHQiPjxiIGNsYXNzPSJxbiI+JytxLm4rJy48L2I+PHNwYW4+JytxLnBlcnNvbisnPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InEtb3B0cyI+JytvcHRzSFRNTCsnPC9kaXY+PGRpdiBjbGFzcz0iZmVlZGJhY2siPjwvZGl2PjxkaXYgY2xhc3M9InEtYm90dG9tIj48YnV0dG9uIGNsYXNzPSJzaG93LWFucy1idG4iIGRhdGEtc2hvdz0iJytxLm4rJyI+XHV7MUY0NDF9IFNob3cgQW5zd2VyPC9idXR0b24+PC9kaXY+PC9kaXY+Jyk7CiAgICB9KTsKICAgIC8vIHdpcmUgY2xpY2tzCiAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcub3B0W2RhdGEtcV0nKSkuZm9yRWFjaChmdW5jdGlvbihvcHQpewogICAgICBvcHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB2YXIgcWlkPW9wdC5kYXRhc2V0LnE7CiAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm9wdFtkYXRhLXE9IicrcWlkKyciXScpKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe28uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKX0pOwogICAgICAgIG9wdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICAgIHZhciBpbnB1dD1vcHQucXVlcnlTZWxlY3RvcignaW5wdXQnKTsgaWYoaW5wdXQpaW5wdXQuY2hlY2tlZD10cnVlOwogICAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICAgIH0pOwogICAgfSk7CiAgfQp9KSgpOwoKCi8qIEZMWUVSUyBQQVJUIDQgXHUyMDE0IFBpY3R1cmUgTUNRICovCihmdW5jdGlvbigpewogIHZhciBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcnQ0TGlzdCcpOwogIGlmKCFsaXN0KXJldHVybjsKICBpZihQNF9FWEFNUExFX1BJQyl7CiAgICB2YXIgZXg9JzxkaXYgY2xhc3M9InEtaXRlbSByZXZlYWxlZCIgc3R5bGU9Im9wYWNpdHk6LjgiPjxkaXYgY2xhc3M9InEtdGV4dCI+PGIgY2xhc3M9InFuIj5FeC48L2I+PHNwYW4+JytQNF9FWEFNUExFX1BJQy5xKycgJm1kYXNoOyBhbnN3ZXI6IDxiPicrUDRfRVhBTVBMRV9QSUMuYW5zKyc8L2I+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgICBQNF9FWEFNUExFX1BJQy5vcHRzLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgIHZhciBzZWwgPSBvLmlzQW5zd2VyID8gJyBzZWxlY3RlZCBjb3JyZWN0LW9wdCcgOiAnJzsKICAgICAgZXggKz0gJzxkaXYgY2xhc3M9InBpYy1vcHQnK3NlbCsnIj48aW1nIHNyYz0iJytvLmltZysnIiBhbHQ9ImV4YW1wbGUgJytvLmxldHRlcisnIj48ZGl2IGNsYXNzPSJwaWMtbGV0dGVyIj48Yj4nK28ubGV0dGVyKyc8L2I+PHNwYW4gY2xhc3M9InBpYy10aWNrIj4nKyhvLmlzQW5zd2VyPydcdTI3MTMnOicnKSsnPC9zcGFuPjwvZGl2PjwvZGl2Pic7CiAgICB9KTsKICAgIGV4ICs9ICc8L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGV4KTsKICB9CiAgUDRfUVVFU1RJT05TX1BJQy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIGg9JzxkaXYgY2xhc3M9InEtaXRlbSIgaWQ9InEnK3EubisnIiBkYXRhLXFpZD0iJytxLm4rJyI+PGRpdiBjbGFzcz0icS10ZXh0Ij48YiBjbGFzcz0icW4iPicrcS5uKycuPC9iPjxzcGFuPicrcS5xKyc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0icGljLW1jcSI+JzsKICAgIHEub3B0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICBoICs9ICc8ZGl2IGNsYXNzPSJwaWMtb3B0IiBkYXRhLWxldHRlcj0iJytvLmxldHRlcisnIiBkYXRhLXE9IicrcS5uKyciPjxpbWcgc3JjPSInK28uaW1nKyciIGFsdD0iUScrcS5uKycgb3B0aW9uICcrby5sZXR0ZXIrJyIgbG9hZGluZz0ibGF6eSI+PGRpdiBjbGFzcz0icGljLWxldHRlciI+PGI+JytvLmxldHRlcisnPC9iPjxzcGFuIGNsYXNzPSJwaWMtdGljayI+XHUyNzEzPC9zcGFuPjwvZGl2PjwvZGl2Pic7CiAgICB9KTsKICAgIGggKz0gJzwvZGl2PjxkaXYgY2xhc3M9ImZlZWRiYWNrIj48L2Rpdj48ZGl2IGNsYXNzPSJxLWJvdHRvbSI+PGJ1dHRvbiBjbGFzcz0ic2hvdy1hbnMtYnRuIiBkYXRhLXNob3c9IicrcS5uKyciPlx1ezFGNDQxfSBTaG93IEFuc3dlcjwvYnV0dG9uPjwvZGl2PjwvZGl2Pic7CiAgICBsaXN0Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaCk7CiAgfSk7CiAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBpYy1vcHRbZGF0YS1xXScpKS5mb3JFYWNoKGZ1bmN0aW9uKG9wdCl7CiAgICBvcHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBxaWQ9b3B0LmRhdGFzZXQucTsKICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBpYy1vcHRbZGF0YS1xPSInK3FpZCsnIl0nKSkuZm9yRWFjaChmdW5jdGlvbihvKXtvLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgICAgb3B0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7CiAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICB9KTsKICB9KTsKfSkoKTsKCi8qIEZMWUVSUyBQQVJUIDUgXHUyMDE0IFdyaXRlIHF1ZXN0aW9ucyAqLwooZnVuY3Rpb24oKXsKICB2YXIgcDVxdWVzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwNVF1ZXN0aW9ucycpOwogIGlmKHA1cXVlc3QpewogICAgUDVfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHA1cXVlc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAgICc8ZGl2IGNsYXNzPSJmb3JtLXJvdyI+PGxhYmVsPjxiPicrcS5uKycuPC9iPiAnK3EubGFiZWwrJzwvbGFiZWw+JysKICAgICAgICAnPGlucHV0IGNsYXNzPSJpbnB1dC1ibGFuayIgZGF0YS1xPSInK3EubisnIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iLi4uIj4nKwogICAgICAgICc8YnV0dG9uIGNsYXNzPSJzaG93LWFucy1idG4iIGRhdGEtc2hvdz0iJytxLm4rJyI+XHV7MUY0NDF9IFNob3c8L2J1dHRvbj48L2Rpdj4nKTsKICAgIH0pOwogIH0KfSkoKTsKCn0pKCk7CgpmdW5jdGlvbiBnZXRIZXgoY29sb3VyS2V5KXsKICB2YXIgYyA9IFA0X0NPTE9VUlMuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5rZXk9PT1jb2xvdXJLZXl9KTsKICByZXR1cm4gYz9jLmhleDonI0ZGRkZGRic7Cn0KZnVuY3Rpb24gYXBwbHlDb2xvdXJUb1JlZ2lvbihyZWdpb24saGV4LGxvY2spewogIHZhciBzY2VuZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3VyU2NlbmUnKTsKICAkJCgnW2RhdGEtcmVnaW9uPSInK3JlZ2lvbisnIl0nLHNjZW5lKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXsKICAgIGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsaGV4KTsKICAgIGlmKGxvY2spIGVsLmRhdGFzZXQubG9ja2VkPScxJzsKICB9KTsKfQoKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3A0Q2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICBpZighY29uZmlybSgnQ2xlYXIgYWxsIHlvdXIgUGFydCA0IGNvbG91cnM\/JykpcmV0dXJuOwogIFA0X0lURU1TLmZvckVhY2goZnVuY3Rpb24oaXQpewogICAgYXBwbHlDb2xvdXJUb1JlZ2lvbihpdC5yZWdpb24sJyNGRkZGRkYnLGZhbHNlKTsKICAgIHZhciBkb3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZG90Zm9yPSInK2l0Lm4rJyJdJyk7CiAgICBpZihkb3QpZG90LnN0eWxlLmJhY2tncm91bmQ9JyNmZmYnOwogIH0pOwogIFA0X3VzZXJDb2xvdXJzPXt9OwogIHVwZGF0ZVByb2dyZXNzKCk7Cn0pOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFBST0dSRVNTLCBTSE9XLCBTVUJNSVQKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmZ1bmN0aW9uIGFuc3dlcmVkKCl7CiAgdmFyIG49MDsKICAvLyBQMQogIGZvcih2YXIgaT0wO2k8UDFfTkFNRVMubGVuZ3RoO2krKyl7dmFyIG5tPVAxX05BTUVTW2ldOyBpZihubS5pc0V4YW1wbGUpY29udGludWU7IGlmKFAxX3VzZXJNYXRjaGVzW25tLm5dKW4rKzt9CiAgLy8gUDIKICBQMl9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgIHZhciBlbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK3EubisnIl0nKTsKICAgIGlmKGVsICYmIGVsLnZhbHVlLnRyaW0oKSE9PScnKW4rKzsKICB9KTsKICAvLyBQMwogIFAzX1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpYy1vcHQuc2VsZWN0ZWRbZGF0YS1xPSInK3EubisnIl0nKTsKICAgIGlmKHMpbisrOwogIH0pOwogIC8vIFAzIG1hdGNoaW5nIChGbHllcnMgdXNlcyAub3B0IGluc3RlYWQgb2YgLnBpYy1vcHQpCiAgaWYodHlwZW9mIFAzX1FVRVNUSU9OU19NQVRDSCAhPT0gJ3VuZGVmaW5lZCcpewogICAgUDNfUVVFU1RJT05TX01BVENILmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHZhciBzZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub3B0LnNlbGVjdGVkW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICAgIGlmKHNlbCluKys7CiAgICB9KTsKICB9CiAgLy8gUDQgcGljdHVyZSBNQ1EgKEZseWVycykKICBpZih0eXBlb2YgUDRfUVVFU1RJT05TX1BJQyAhPT0gJ3VuZGVmaW5lZCcpewogICAgUDRfUVVFU1RJT05TX1BJQy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgc2VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpYy1vcHQuc2VsZWN0ZWRbZGF0YS1xPSInK3EubisnIl0nKTsKICAgICAgaWYoc2VsKW4rKzsKICAgIH0pOwogIH0KICAvLyBQNSBjb2xvdXIgKyB3cml0ZQogIGlmKHR5cGVvZiBQNV9JVEVNU19DT0xPVVIgIT09ICd1bmRlZmluZWQnKXsKICAgIFA1X0lURU1TX0NPTE9VUi5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsgaWYoUDRfdXNlckNvbG91cnNbaXQucmVnaW9uXSluKys7IH0pOwogIH0KICBpZih0eXBlb2YgUDVfUVVFU1RJT05TICE9PSAndW5kZWZpbmVkJyl7CiAgICBQNV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgICAgdmFyIGVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dC1ibGFua1tkYXRhLXE9IicrcS5uKyciXScpOwogICAgICBpZihlbCAmJiBlbC52YWx1ZS50cmltKCkhPT0nJyluKys7CiAgICB9KTsKICB9CiAgcmV0dXJuIG47Cn0KZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MoKXsKICB2YXIgYT1hbnN3ZXJlZCgpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbnN3ZXJlZENvdW50JykudGV4dENvbnRlbnQ9YTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvZ0ZpbGwnKS5zdHlsZS53aWR0aD0oYS8yNSoxMDApKyclJzsKfQoKZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsZnVuY3Rpb24oZSl7CiAgaWYoZS50YXJnZXQuY2xhc3NMaXN0ICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnaW5wdXQtYmxhbmsnKSl1cGRhdGVQcm9ncmVzcygpOwp9KTsKCmRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogIHZhciBidG49ZS50YXJnZXQuY2xvc2VzdCgnLnNob3ctYW5zLWJ0bicpOwogIGlmKCFidG4pcmV0dXJuOwogIHZhciBrZXk9YnRuLmRhdGFzZXQuc2hvdzsKICBpZihrZXk9PT0nUDFBTEwnKXsgcDFSZXZlYWwoKTsgcmV0dXJuOyB9CiAgaWYoa2V5PT09J1A0QUxMJyB8fCBrZXk9PT0nUDVBTEwnKXsgcDRSZXZlYWwoKTsgcmV0dXJuOyB9CiAgdmFyIHFpZD1wYXJzZUludChrZXkpOwogIC8vIHdyaXRlLXF1ZXN0aW9uIHJldmVhbCAoUDIgKyBQNSB3cml0ZXMpCiAgaWYoKHFpZD49NiAmJiBxaWQ8PTEwKSB8fCAocWlkPj0yNCAmJiBxaWQ8PTI1KSl7CiAgICB2YXIgcSA9ICh0eXBlb2YgUDJfUVVFU1RJT05TIT09J3VuZGVmaW5lZCcgJiYgUDJfUVVFU1RJT05TLmZpbmQoZnVuY3Rpb24oeCl7cmV0dXJuIHgubj09PXFpZH0pKSB8fAogICAgICAgICAgICAodHlwZW9mIFA1X1FVRVNUSU9OUyE9PSd1bmRlZmluZWQnICYmIFA1X1FVRVNUSU9OUy5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4Lm49PT1xaWR9KSk7CiAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxaWQrJyJdJyk7CiAgICBpZihxICYmIGVsKXsKICAgICAgZWwudmFsdWU9cS5kaXNwbGF5OwogICAgICBlbC5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpOwogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfQogIH0gZWxzZSBpZihxaWQ+PTExICYmIHFpZDw9MTUpewogICAgLy8gUDMgbXVsdGlwbGUgbWF0Y2hpbmcKICAgIHZhciBxMyA9ICh0eXBlb2YgUDNfUVVFU1RJT05TX01BVENIIT09J3VuZGVmaW5lZCcpP1AzX1FVRVNUSU9OU19NQVRDSC5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4Lm49PT1xaWR9KTpudWxsOwogICAgdmFyIGl0ZW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3EnK3FpZCk7CiAgICBpZihxMyAmJiBpdGVtKXsKICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpOwogICAgICAkJCgnLm9wdFtkYXRhLXE9IicrcWlkKyciXScsaXRlbSkuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgICBpZihvLmRhdGFzZXQubGV0dGVyPT09cTMuYW5zKW8uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHQnKTsKICAgICAgfSk7CiAgICAgIHZhciBmYj1pdGVtLnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjaycpOwogICAgICBpZihmYil7ZmIudGV4dENvbnRlbnQ9J0Fuc3dlcjogJytxMy5hbnMrKHEzLndoeT8nICgnK3EzLndoeSsnKSc6JycpO30KICAgIH0KICB9IGVsc2UgaWYocWlkPj0xNiAmJiBxaWQ8PTIwKXsKICAgIC8vIFA0IHBpY3R1cmUgTUNRCiAgICB2YXIgcXAgPSAodHlwZW9mIFA0X1FVRVNUSU9OU19QSUMhPT0ndW5kZWZpbmVkJyk\/UDRfUVVFU1RJT05TX1BJQy5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4Lm49PT1xaWR9KTpudWxsOwogICAgdmFyIGl0ZW0yPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxJytxaWQpOwogICAgaWYocXAgJiYgaXRlbTIpewogICAgICBpdGVtMi5jbGFzc0xpc3QuYWRkKCdyZXZlYWxlZCcpOwogICAgICAkJCgnLnBpYy1vcHRbZGF0YS1xPSInK3FpZCsnIl0nLGl0ZW0yKS5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICAgIGlmKG8uZGF0YXNldC5sZXR0ZXI9PT1xcC5hbnMpby5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdCcpOwogICAgICB9KTsKICAgICAgdmFyIGZiMj1pdGVtMi5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2snKTsKICAgICAgaWYoZmIyKXtmYjIudGV4dENvbnRlbnQ9J0Fuc3dlcjogJytxcC5hbnM7fQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiBwNFJldmVhbCgpewogIGlmKHR5cGVvZiBQNV9JVEVNU19DT0xPVVIgPT09ICd1bmRlZmluZWQnKSByZXR1cm47CiAgUDVfSVRFTVNfQ09MT1VSLmZvckVhY2goZnVuY3Rpb24oaXQpewogICAgYXBwbHlDb2xvdXJUb1JlZ2lvbihpdC5yZWdpb24sZ2V0SGV4KGl0LmNvbG91ciksdHJ1ZSk7CiAgICB2YXIgZG90PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRvdGZvcj0iJytpdC5uKyciXScpOwogICAgaWYoZG90KWRvdC5zdHlsZS5iYWNrZ3JvdW5kPWdldEhleChpdC5jb2xvdXIpOwogICAgdmFyIGluc1Jvdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sLWluc1tkYXRhLXFuPSInK2l0Lm4rJyJdJyk7CiAgICBpZihpbnNSb3cpaW5zUm93LmNsYXNzTGlzdC5hZGQoJ3JldmVhbGVkJyk7CiAgfSk7CiAgJCQoJy5zd2F0Y2gnKS5mb3JFYWNoKGZ1bmN0aW9uKHMpe3Muc3R5bGUucG9pbnRlckV2ZW50cz0nbm9uZSc7cy5zdHlsZS5vcGFjaXR5PScuNid9KTsKICBQNF91c2VyQ29sb3VycyA9IHt9OwogIFA1X0lURU1TX0NPTE9VUi5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsgUDRfdXNlckNvbG91cnNbaXQucmVnaW9uXT1pdC5jb2xvdXI7IH0pOwogIHVwZGF0ZVByb2dyZXNzKCk7Cn0KCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJtaXRCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICB2YXIgc2NvcmU9MCwgcGFydHM9ezE6MCwyOjAsMzowLDQ6MCw1OjB9OwoKICBQMV9OQU1FUy5mb3JFYWNoKGZ1bmN0aW9uKG5tKXsKICAgIGlmKG5tLmlzRXhhbXBsZSlyZXR1cm47CiAgICB2YXIgbmFtZUVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYWlyLW5hbWVbZGF0YS1uPSInK25tLm4rJyJdJyk7CiAgICBpZihQMV91c2VyTWF0Y2hlc1tubS5uXT09PW5tLmFucyl7CiAgICAgIHNjb3JlKys7IHBhcnRzWzFdKys7CiAgICAgIGlmKG5hbWVFbCl7bmFtZUVsLmNsYXNzTGlzdC5hZGQoJ21hdGNoZWQnKTtuYW1lRWwuc3R5bGUuYm9yZGVyQ29sb3I9J3ZhcigtLWdyZWVuKSc7bmFtZUVsLnN0eWxlLmJhY2tncm91bmQ9J3JnYmEoMTYsMTg1LDEyOSwuMTIpJzt9CiAgICB9IGVsc2UgewogICAgICBpZihuYW1lRWwpe25hbWVFbC5zdHlsZS5ib3JkZXJDb2xvcj0ndmFyKC0tcmVkKSc7bmFtZUVsLnN0eWxlLmJhY2tncm91bmQ9J3JnYmEoMjM5LDY4LDY4LC4xMCknO30KICAgIH0KICB9KTsKICBkcmF3UDFMaW5lcygpOwoKICBQMl9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgIHZhciBlbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK3EubisnIl0nKTsKICAgIGlmKCFlbClyZXR1cm47CiAgICBpZihlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3JldmVhbGVkJykpcmV0dXJuOwogICAgdmFyIHYgPSBlbC52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLixdJC8sJycpOwogICAgdmFyIG9rID0gcS5hY2NlcHRlZC5pbmRleE9mKHYpPj0wOwogICAgaWYob2spe3Njb3JlKys7cGFydHNbMl0rKztlbC5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0Jyk7fQogICAgZWxzZSB7ZWwuY2xhc3NMaXN0LmFkZCgnd3JvbmcnKTsgZWwudGl0bGU9J0NvcnJlY3Q6ICcrcS5kaXNwbGF5O30KICB9KTsKCiAgLy8gUEFSVCAzIG11bHRpcGxlIG1hdGNoaW5nCiAgaWYodHlwZW9mIFAzX1FVRVNUSU9OU19NQVRDSCE9PSd1bmRlZmluZWQnKXsKICAgIFAzX1FVRVNUSU9OU19NQVRDSC5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgaXRlbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncScrcS5uKTsKICAgICAgaWYoIWl0ZW0pcmV0dXJuOwogICAgICB2YXIgc2VsPWl0ZW0ucXVlcnlTZWxlY3RvcignLm9wdC5zZWxlY3RlZCcpOwogICAgICB2YXIgbGV0dGVyPXNlbD9zZWwuZGF0YXNldC5sZXR0ZXI6bnVsbDsKICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdhbnN3ZXJlZCcpOwogICAgICAkJCgnLm9wdCcsaXRlbSkuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgICB2YXIgTD1vLmRhdGFzZXQubGV0dGVyOwogICAgICAgIGlmKEw9PT1xLmFucylvLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0Jyk7CiAgICAgICAgaWYobGV0dGVyPT09TCAmJiBMIT09cS5hbnMpby5jbGFzc0xpc3QuYWRkKCd3cm9uZy1vcHQnKTsKICAgICAgfSk7CiAgICAgIHZhciBmYj1pdGVtLnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjaycpOwogICAgICBpZihsZXR0ZXI9PT1xLmFucyl7c2NvcmUrKzsgcGFydHNbM10rKzsgaXRlbS5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0Jyk7IGlmKGZiKWZiLnRleHRDb250ZW50PSdDb3JyZWN0IC0gJytxLmFucysocS53aHk\/JyAoJytxLndoeSsnKSc6JycpO30KICAgICAgZWxzZXtpdGVtLmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7IGlmKGZiKWZiLnRleHRDb250ZW50PSdXcm9uZyAtIGNvcnJlY3Q6ICcrcS5hbnMrKHEud2h5PycgKCcrcS53aHkrJyknOicnKSsobGV0dGVyPycgKHlvdSBjaG9zZSAnK2xldHRlcisnKSc6JyAobm8gYW5zd2VyKScpO30KICAgIH0pOwogIH0KCiAgLy8gUEFSVCA0IHBpY3R1cmUgTUNRCiAgaWYodHlwZW9mIFA0X1FVRVNUSU9OU19QSUMhPT0ndW5kZWZpbmVkJyl7CiAgICBQNF9RVUVTVElPTlNfUElDLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHZhciBpdGVtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxJytxLm4pOwogICAgICBpZighaXRlbSlyZXR1cm47CiAgICAgIHZhciBzZWw9aXRlbS5xdWVyeVNlbGVjdG9yKCcucGljLW9wdC5zZWxlY3RlZCcpOwogICAgICB2YXIgbGV0dGVyPXNlbD9zZWwuZGF0YXNldC5sZXR0ZXI6bnVsbDsKICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdhbnN3ZXJlZCcpOwogICAgICAkJCgnLnBpYy1vcHQnLGl0ZW0pLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgdmFyIEw9by5kYXRhc2V0LmxldHRlcjsKICAgICAgICBpZihMPT09cS5hbnMpby5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdCcpOwogICAgICAgIGlmKGxldHRlcj09PUwgJiYgTCE9PXEuYW5zKW8uY2xhc3NMaXN0LmFkZCgnd3Jvbmctb3B0Jyk7CiAgICAgIH0pOwogICAgICB2YXIgZmI9aXRlbS5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2snKTsKICAgICAgaWYobGV0dGVyPT09cS5hbnMpe3Njb3JlKys7IHBhcnRzWzRdKys7IGl0ZW0uY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpOyBpZihmYilmYi50ZXh0Q29udGVudD0nQ29ycmVjdCAtICcrcS5hbnM7fQogICAgICBlbHNle2l0ZW0uY2xhc3NMaXN0LmFkZCgnd3JvbmcnKTsgaWYoZmIpZmIudGV4dENvbnRlbnQ9J1dyb25nIC0gY29ycmVjdDogJytxLmFucysobGV0dGVyPycgKHlvdSBjaG9zZSAnK2xldHRlcisnKSc6JyAobm8gYW5zd2VyKScpO30KICAgIH0pOwogIH0KCiAgLy8gUEFSVCA1IGNvbG91ciArIHdyaXRlCiAgaWYodHlwZW9mIFA1X0lURU1TX0NPTE9VUiE9PSd1bmRlZmluZWQnKXsKICAgIFA1X0lURU1TX0NPTE9VUi5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgICAgdmFyIGluc1Jvdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sLWluc1tkYXRhLXFuPSInK2l0Lm4rJyJdJyk7CiAgICAgIHZhciB1c2VyQ29sID0gUDRfdXNlckNvbG91cnNbaXQucmVnaW9uXTsKICAgICAgaWYodXNlckNvbCA9PT0gaXQuY29sb3VyKXsKICAgICAgICBzY29yZSsrOyBwYXJ0c1s1XSsrOwogICAgICAgIGlmKGluc1JvdylpbnNSb3cuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmKGluc1JvdylpbnNSb3cuY2xhc3NMaXN0LmFkZCgnd3JvbmcnKTsKICAgICAgfQogICAgfSk7CiAgfQogIGlmKHR5cGVvZiBQNV9RVUVTVElPTlMhPT0ndW5kZWZpbmVkJyl7CiAgICBQNV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgICAgdmFyIGVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dC1ibGFua1tkYXRhLXE9IicrcS5uKyciXScpOwogICAgICBpZighZWwpcmV0dXJuOwogICAgICBpZihlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3JldmVhbGVkJykpcmV0dXJuOwogICAgICB2YXIgdiA9IGVsLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1suLF0kLywnJyk7CiAgICAgIHZhciBvayA9IHEuYWNjZXB0ZWQuaW5kZXhPZih2KT49MDsKICAgICAgaWYob2spe3Njb3JlKys7cGFydHNbNV0rKztlbC5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0Jyk7fQogICAgICBlbHNlIHtlbC5jbGFzc0xpc3QuYWRkKCd3cm9uZycpOyBlbC50aXRsZT0nQ29ycmVjdDogJytxLmRpc3BsYXk7fQogICAgfSk7CiAgfQoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NvcmVOb3cnKS50ZXh0Q29udGVudD1zY29yZTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmluYWxTY29yZScpLnRleHRDb250ZW50PXNjb3JlOwogIHZhciBwY3Q9TWF0aC5yb3VuZChzY29yZS8yNSoxMDApOwogIHZhciBtc2cgPSBwY3Q+PTg1ID8gJ0V4Y2VsbGVudCEgWW91ciBsaXN0ZW5pbmcgaXMgc3Ryb25nLicKICAgICAgICAgIDogcGN0Pj03MCA\/ICdHb29kIGpvYiEgQSBmZXcgbW9yZSB0ZXN0cyBhbmQgeW91IHdpbGwgYmUgcmVhZHkuJwogICAgICAgICAgOiBwY3Q+PTUwID8gJ0tlZXAgcHJhY3Rpc2luZyAtIHJlLWxpc3RlbiB0byB0aGUgcGFydHMgd2hlcmUgeW91IG1pc3NlZCBhbnN3ZXJzLicKICAgICAgICAgIDogJ1RyeSBzbG93aW5nIHRoZSBhdWRpbyBhbmQgdXNlIHRoZSB0cmFuc2NyaXB0IHRvIHN0dWR5Lic7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHNNc2cnKS50ZXh0Q29udGVudD1tc2c7CiAgdmFyIHNwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njb3JlUGFydHMnKTsKICBzcC5pbm5lckhUTUw9Jyc7CiAgWydQYWlyJywnV3JpdGUnLCdNYXRjaCcsJ1RpY2snLCdDb2xvdXInXS5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsLGkpewogICAgc3AuaW5uZXJIVE1MICs9ICc8ZGl2IGNsYXNzPSJzcC1pdGVtIj48Yj4nK3BhcnRzW2krMV0rJy81PC9iPlBhcnQgJysoaSsxKSsnIC0gJytsYWJlbCsnPC9kaXY+JzsKICB9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0c0Jhbm5lcicpLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHNCYW5uZXInKS5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCcsYmxvY2s6J2NlbnRlcid9KX0sMTIwKTsKfSk7Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXRCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICBpZighY29uZmlybSgnUmVzZXQgYWxsIGFuc3dlcnM\/IFlvdXIgbm90ZXMgd2lsbCBhbHNvIGJlIGNsZWFyZWQuJykpcmV0dXJuOwogIGxvY2F0aW9uLnJlbG9hZCgpOwp9KTsKCn0pKCk7Cg=='));<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>All English 4U Grammar IELTS TOEFL Cambridge CELPIP Dictation Back Grammar IELTS TOEFL Cambridge CELPIP Dictation Cambridge YLE &#183; Flyers Flyers 1 &mdash; Test 1 Listening Listen to 5 parts with 25 questions. Use YouTube audio, jump to each part, take notes. Each question has its own Show Answer button &mdash; submit panel is at [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-with-title","meta":{"footnotes":""},"class_list":["post-4594","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/4594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/comments?post=4594"}],"version-history":[{"count":4,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/4594\/revisions"}],"predecessor-version":[{"id":5872,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/4594\/revisions\/5872"}],"wp:attachment":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/media?parent=4594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}