blogspot/dist/quest.min.js · Nhập từ GitHub ocd4-assets@55ada5e8 (bản đang chạy trên thudao.com 10/11/2026)

/* Thư Đạo · quest · nguồn: blogspot/pages/quest.html */
(function(I,C,H,J){var d=document,w=window,r=d.getElementById(I);if(!r||r.getAttribute("data-on"))return;r.setAttribute("data-on","1");if(C){var st=d.createElement("style");st.textContent=C;d.head.appendChild(st);}r.insertAdjacentHTML("beforebegin",H);r.parentNode.removeChild(r);var late=d.readyState!=="loading";function fire(t,f,o){var e=new Event(t);setTimeout(function(){typeof f==="function"?f.call(o,e):f&&f.handleEvent&&f.handleEvent(e);});}if(late){d.addEventListener=function(t,f){if(t==="DOMContentLoaded")return fire(t,f,d);return EventTarget.prototype.addEventListener.apply(this,arguments);};w.addEventListener=function(t,f){if(t==="DOMContentLoaded"||(t==="load"&&d.readyState==="complete"))return fire(t,f,w);return EventTarget.prototype.addEventListener.apply(this,arguments);};}try{for(var i=0;i<J.length;i++){var s=d.createElement("script");s.textContent=J[i];d.body.appendChild(s);}}finally{if(late){delete d.addEventListener;delete w.addEventListener;}}})("tdp-quest","#ocdQuestPage{--paper:#fffdf8;--ink:#352b24;--muted:#796f67;--brown:#71472d;--gold:#b88745;--line:#e8ddcd;--green:#47765b;--red:#963f36;max-width:1120px;margin:auto;padding:22px 12px 50px;font-family:Arial,Helvetica,sans-serif;color:var(--ink)}#ocdQuestPage,#ocdQuestPage *{box-sizing:border-box}#ocdQuestPage button{font:inherit}.qtop-banner{width:100%;margin:0 0 18px;overflow:hidden;border-radius:22px;border:1px solid #e1cfad;background:#f5eee2;box-shadow:0 12px 35px #48301e17}.qtop-banner img{display:block;width:100%;height:auto;object-fit:cover}.beast-rank-banner{position:relative;margin-bottom:0;left:50%;width:100vw;max-width:none;margin-left:-50vw;padding:18px max(18px,calc((100vw - 1120px)/2 + 12px));border-radius:0;background:linear-gradient(135deg,#171513,#2a2118);color:#fff}@media(min-width:641px){.beast-rank-banner{left:auto;width:100%;max-width:100%;margin:0;padding:18px 20px;border-radius:18px}}.beast-rank-head{text-align:center}.beast-rank-head .qkick{color:#d9b873}.beast-rank-head strong{display:block;margin-top:4px;color:#fff;font:700 24px Georgia,serif}.beast-rank-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-areas:\"third first second\";align-items:end;gap:12px;margin-top:16px}.beast-rank-card:nth-child(1){grid-area:first}.beast-rank-card:nth-child(2){grid-area:second}.beast-rank-card:nth-child(3){grid-area:third}.beast-rank-card{--br-img:none;position:relative;min-height:245px;border:1px solid rgba(255,255,255,.2);border-radius:17px;overflow:hidden;background:#111;isolation:isolate}.beast-rank-card:before{content:\"\";position:absolute;inset:0;z-index:-2;background-image:var(--br-img);background-size:cover;background-position:center}.beast-rank-card:after{content:\"\";position:absolute;inset:0;z-index:-1;background:linear-gradient(0deg,#080706f5,#080706b3 42%,#08070614 78%)}.beast-rank-copy{position:absolute;left:0;right:0;bottom:0;padding:18px 14px;text-align:left}.beast-rank-copy b{display:block;font:700 22px Georgia,serif}.beast-rank-copy small{display:block;margin-top:6px;color:#eee2d2;font-size:11px;line-height:1.5}.beast-rank-pos{position:absolute;z-index:2;top:10px;left:10px;padding:6px 9px;border:1px solid rgba(255,255,255,.35);border-radius:999px;background:#08080875;font-size:10px;font-weight:900;backdrop-filter:blur(7px)}.beast-rank-loading{grid-column:1/-1;padding:28px;text-align:center;color:#ddd0bd;font-size:11px}.beast-rank-rules{margin:10px 0 24px;text-align:center}.beast-rank-rules a{display:inline-block;padding:7px 12px;border:1px solid #dcc8a8;border-radius:999px;color:#79562f;background:#fffaf0;font-size:10px;font-weight:900;text-decoration:none}.beast-rank-rules a:hover{text-decoration:underline}@media(max-width:640px){.beast-rank-banner{padding:13px}.beast-rank-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-areas:\"third first second\";align-items:end;gap:7px;margin-top:0}.beast-rank-card{min-height:260px;border-radius:12px}.beast-rank-card:before{background-position:62% center}.beast-rank-card[data-team=\"1\"]:before,.beast-rank-card[data-team=\"2\"]:before{background-position:70% center}.beast-rank-card:nth-child(1){grid-area:first;min-height:310px}.beast-rank-card:nth-child(2){grid-area:second;min-height:285px}.beast-rank-card:nth-child(3){grid-area:third;min-height:260px}.beast-rank-copy{padding:12px 8px}.beast-rank-copy b{font-size:14px}.beast-rank-copy small{font-size:8px;line-height:1.4}.beast-rank-pos{top:7px;left:7px;padding:4px 6px;font-size:8px}.beast-rank-head{margin-top:15px}.beast-rank-head strong{font-size:18px}}@media(max-width:640px){.qtop-banner{margin-bottom:12px;border-radius:15px}.qtop-banner img{max-height:none}}.beast-entry-sec{display:none}.beast-entry-sec.on{display:block}.beast-info-toggle{width:100%;display:flex;align-items:center;gap:10px;text-align:left;margin:8px 0 14px;padding:13px 14px;border:1px solid #dbc49f;border-radius:14px;background:#fffaf0;color:#4d3020;cursor:pointer}.beast-info-toggle strong{display:block;font:700 18px Georgia,serif}.beast-info-toggle small{display:block;margin-top:3px;color:#75695f;font-size:10px;line-height:1.5}.beast-info-toggle .beast-info-copy{display:block;min-width:0}.beast-info-toggle .beast-info-view{margin-left:auto;padding:6px 9px;border:1px solid #dcc8a8;border-radius:999px;color:#79562f;font-size:9px;font-weight:900;white-space:nowrap}.beast-info-desc{margin-top:18px;padding:16px;border-top:1px solid rgba(255,255,255,.16);text-align:center;color:#eee2d2;font-size:11px;line-height:1.7}.beast-info-desc a{display:inline-block;margin-top:8px;color:#e6c37d;font-weight:900;text-decoration:underline}@media(max-width:600px){.beast-info-toggle{flex-direction:column;align-items:stretch;text-align:center}.beast-info-toggle .beast-info-view{margin:2px auto 0}.beast-info-desc{font-size:10px;padding:14px 8px}}.beast-info-modal{display:none;position:fixed;inset:0;z-index:2147482995;padding:18px;background:#1b130dc7;align-items:center;justify-content:center}.beast-info-modal.on{display:flex}.beast-info-box{position:relative;width:min(900px,100%);max-height:calc(100dvh - 36px);overflow:auto;border-radius:22px;background:#171513}.beast-info-close{position:absolute;top:10px;right:10px;z-index:60;width:38px;height:38px;padding:0;border:2px solid #b53a32;border-radius:50%;background:#fffaf4;color:#b53a32;font:900 24px/32px Arial,sans-serif;box-shadow:0 5px 16px #2b1d1238}.beast-info-close:hover{background:#fff0ed}.beast-rank-modal{left:auto;width:100%;max-width:none;margin:0;padding:22px;border-radius:22px}.beast-rank-modal .beast-rank-head{padding-right:38px}@media(max-width:600px){.beast-info-modal{padding:10px}.beast-info-box{max-height:calc(100dvh - 20px)}.beast-rank-modal{padding:14px}.beast-info-close{top:8px;right:8px}.beast-entry-go{display:none}}.beast-entry-card{width:100%;display:flex;align-items:center;gap:12px;padding:14px;border:1px solid #dfcfb5;border-radius:16px;background:#fffaf0;text-align:left;color:inherit}.beast-entry-icon{position:relative;width:62px;height:62px;flex:0 0 62px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:radial-gradient(circle,#fff8dc 0%,#f2dfba 52%,transparent 72%);animation:beastFloat 2.8s ease-in-out infinite;filter:drop-shadow(0 0 7px #e6b84f) drop-shadow(0 0 14px #e6b84f88)}.beast-entry-icon img{width:58px;height:58px;object-fit:contain;max-height:none}.beast-entry-icon:after{content:\"\";position:absolute;inset:-5px;border-radius:50%;border:1px solid #e6b84f88;box-shadow:0 0 14px #e6b84f88;animation:beastAura 2.2s ease-in-out infinite}@keyframes beastFloat{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}@keyframes beastAura{0%,to{opacity:.45;transform:scale(.94)}50%{opacity:1;transform:scale(1.08)}}.beast-entry-card strong{display:block;font:700 17px Georgia}.beast-entry-card small{display:block;margin-top:4px;line-height:1.45;color:#766b5d}.beast-entry-go{margin-left:auto;font-weight:900}.beast-entry-card.test{border-style:dashed}.beast-entry-card.active{box-shadow:0 0 0 2px #ead5aa inset}.qhero{padding:32px 28px;border:1px solid #e1cfad;border-radius:25px;background:radial-gradient(circle at 90% 0%,#b887452e,transparent 35%),linear-gradient(135deg,#fff9ec,#fffdf8);box-shadow:0 12px 35px #48301e17}.qkick{color:#a16207;font-size:9px;font-weight:900;letter-spacing:.13em}.qtitle{margin:5px 0;color:#5a351f;font:700 34px Georgia,serif}.qdesc{max-width:780px;color:#80756c;font-size:11px;line-height:1.7}.qsession{display:flex;gap:10px;align-items:center;margin-top:18px;padding:12px 14px;border:1px solid #eadfcf;border-radius:14px;background:#ffffffc7}.qsession.logged{cursor:pointer}.qdot{width:12px;height:12px;border-radius:50%;background:#aaa}.logged .qdot{background:#4f8b64;box-shadow:0 0 0 4px #4f8b641f}.qst{font-size:12px;font-weight:900}.qss{font-size:10px;color:#82786f;margin-top:2px}.qsession-open{display:none;margin-left:auto;padding:6px 9px;border:1px solid #dcc8a8;border-radius:999px;color:#79562f;font-size:9px;font-weight:900;white-space:nowrap}.qsession.logged .qsession-open{display:block}.qprofile-modal{display:none;position:fixed;inset:0;z-index:2147482990;padding:18px;background:#1b130dc7;align-items:center;justify-content:center}.qprofile-modal.on{display:flex}.qprofile-box{position:relative;width:min(620px,100%);max-height:calc(100vh - 36px);max-height:calc(100dvh - 36px);overflow:auto;border-radius:22px}.qprofile-box .qprofile{display:block!important;margin:0}.qprofile-close{position:absolute;top:10px;right:10px;z-index:20;width:38px;height:38px;padding:0;border:2px solid #b53a32;border-radius:50%;background:#fffaf4;color:#b53a32;font:900 24px/32px Arial;box-shadow:0 5px 16px #2b1d1238}.qprofile-close:hover{background:#fff0ed}@media(max-width:600px){.qprofile-modal{padding:10px}.qprofile-box{max-height:calc(100dvh - 20px)}.qprofile-close{top:8px;right:8px}}.qprofile{display:none;position:relative;isolation:isolate;margin-top:16px;padding:18px;border:1px solid #dac29c;border-radius:20px;background:#fffaf0;background-size:cover;background-position:center;overflow:hidden}.qprofile.on{display:block}.qprofile>*{position:relative;z-index:1}.qpi{display:grid;grid-template-columns:92px 1fr;gap:16px;align-items:center}.qavwrap{position:relative;width:92px;height:92px;display:flex;align-items:center;justify-content:center}.qav{position:relative;z-index:1;width:82px;height:82px;border:2px solid #dfc89f;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#f4e6ca;font:700 28px Georgia}.qav img{width:100%;height:100%;object-fit:cover}.qframe{display:none;position:absolute;z-index:2;inset:-2px;width:96px;height:96px;object-fit:contain;pointer-events:none}.qframe.on{display:block}.qname{font:700 21px Georgia;color:#4d3020}.qcode{font-size:9px;font-weight:900;color:#9a6a30}.qmeta{font-size:9px;color:#6c5442;margin-top:5px}.qgems{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px}.qgem{display:flex;gap:5px;align-items:center;padding:6px 8px;border:1px solid #e2d4c0;border-radius:10px;background:#fff;font-size:11px;font-weight:900}.qgem img{width:22px;height:22px;object-fit:contain}.qassets{margin-top:14px;padding-top:12px;border-top:1px solid #ded0ba}.qassets h4{margin:0;font-size:10px;color:#5b3a27}.qagrid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:7px;margin-top:8px}.qasset{display:flex;gap:7px;align-items:center;padding:7px;border:1px solid #e6d9c7;border-radius:10px;background:#fff;font-size:8px;font-weight:800}.qasset img{width:32px;height:32px;border-radius:8px;object-fit:cover}.qsec{margin-top:27px}.qsec h2{margin:4px 0;color:#5a351f;font:700 24px Georgia}.qsec p{color:#80756c;font-size:10px}.npclogin{display:none;padding:20px;text-align:center;border:1px solid #e5d3b7;border-radius:16px;background:#fff9ec;font-size:11px}.npclogin.on{display:block}.npcgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.npccard{position:relative;padding:15px;border:1px solid var(--line);border-radius:18px;background:#fff;cursor:pointer;text-align:left;box-shadow:0 7px 20px #48301e12}.npccard:hover{transform:translateY(-2px)}.npccard.event-alert:after{content:\"\";position:absolute;right:12px;top:12px;width:12px;height:12px;border-radius:50%;background:#d62f2f;border:2px solid #fff;box-shadow:0 0 0 3px #d62f2f2b,0 2px 7px #0002}.npccard.event-alert:before{content:\"SỰ KIỆN\";position:absolute;right:31px;top:11px;padding:3px 6px;border-radius:999px;background:#fff0ed;color:#a6322b;font-size:7px;font-weight:900;letter-spacing:.06em}.npccard.surprise-alert:after{content:\"\";position:absolute;right:12px;top:12px;width:12px;height:12px;border-radius:50%;background:#e28a16;border:2px solid #fff;box-shadow:0 0 0 3px #e28a162b,0 2px 7px #0002;animation:qsurprise 1.4s ease-in-out infinite}.npccard.surprise-alert:before{content:\"ĐỘT XUẤT\";position:absolute;right:31px;top:11px;padding:3px 6px;border-radius:999px;background:#fff6df;color:#9a5a08;font-size:7px;font-weight:900;letter-spacing:.06em}@keyframes qsurprise{50%{transform:scale(1.18);box-shadow:0 0 0 6px #e28a1618,0 2px 7px #0002}}.npcrow{display:flex;gap:12px;align-items:center}.npcav{width:66px;height:66px;flex:0 0 66px;border:2px solid #e5d0aa;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#f4e6ca;font:700 24px Georgia}.npcav img{width:100%;height:100%;object-fit:cover}.npcname{font:700 17px Georgia;color:#4c2f20}.npcdesc{margin-top:5px;font-size:9px;color:#80756c;line-height:1.5}.qlist{overflow:hidden;border:1px solid var(--line);border-radius:19px;background:#fff}.qempty{padding:20px;text-align:center;color:#82786f;font-size:11px}.qgroup{border-bottom:1px solid #eee5d9}.qgroup:last-child{border:0}.qgroup summary{display:flex;gap:11px;align-items:center;padding:16px 18px;list-style:none;cursor:pointer}.qgroup summary::-webkit-details-marker{display:none}.qnum{width:32px;height:32px;flex:0 0 32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#f8ecd5;color:#8a581f;font-size:11px;font-weight:900}.qsum{flex:1}.qgn{font-size:13px;font-weight:900;color:#4e3222}.qgd{font-size:9px;color:#8a8179;margin-top:3px}.qgm{font-size:9px;font-weight:900;color:#9a6a30;margin-top:5px}.qbody{padding:0 18px 17px 61px}.qstep{position:relative;margin-top:8px;padding:11px 13px 11px 39px;border:1px solid #eee5d9;border-radius:12px;background:#fffdf9;font-size:10px;line-height:1.55}.qstep:before{content:\"\";position:absolute;left:13px;top:14px;width:14px;height:14px;border:2px solid #c9b18c;border-radius:50%}.qstep.done{border-color:#cfe1d4;background:#f5fbf7}.qstep.done:before{content:\"✓\";display:flex;align-items:center;justify-content:center;width:18px;height:18px;left:11px;top:12px;border:0;background:#4f8b64;color:#fff;font-size:10px;font-weight:900}.qsn{font-weight:900;color:#563824}.qstate{margin-top:3px;color:#8c8178;font-size:9px}.qok{color:#47765b;font-weight:900}.qaction{display:inline-flex;margin-top:7px;padding:6px 9px;border:1px solid #dcc39d;border-radius:8px;color:#875b2d;text-decoration:none;font-weight:900}.qprogress,.qnote,.qcomplete,.qsync{margin-top:11px;padding:12px;border-radius:11px;font-size:10px;line-height:1.55}.qprogress{border:1px solid #eadfce;background:#fffaf2}.qnote{background:#f8f5ef;color:#776d64}.qcomplete{border:1px solid #cfe1d4;background:#edf7f0;color:#47765b;font-weight:700}.qsync{background:#fff8e9;color:#866126}.qph{display:flex;justify-content:space-between;font-weight:900}.qtrack{height:7px;margin-top:8px;border-radius:99px;background:#eee6dc;overflow:hidden}.qbar{height:100%;background:#59876a}.qbtn{width:100%;margin-top:9px;padding:10px;border:0;border-radius:11px;background:linear-gradient(135deg,#765034,#9a6b3e);color:#fff;font-size:10px;font-weight:900;cursor:pointer}.qbtn.green{background:linear-gradient(135deg,#47765b,#619374)}.qbtn:disabled{opacity:.55}.quiz{margin-top:12px}.question{margin-top:9px;padding:12px;border:1px solid #eadfce;border-radius:12px}.question b{font-size:10px}.option{display:flex;gap:7px;margin-top:6px;padding:8px;border:1px solid #eee5d9;border-radius:9px;font-size:10px;cursor:pointer}.result{display:none;margin-top:9px;padding:10px;border-radius:9px;font-size:10px}.result.on{display:block}.result.fail{background:#fff1f0;color:#963f36}.result.ok{background:#edf7f0;color:#47765b}.result.wait{background:#fff8e9;color:#866126}.nmodal{position:fixed;inset:0;z-index:2147483000;display:none;align-items:center;justify-content:center;padding:18px;background:#1c161299;overflow:hidden;overscroll-behavior:contain}.nmodal.on{display:flex}.nbox{width:100%;max-width:520px;max-height:calc(100vh - 36px);max-height:calc(100dvh - 36px);border-radius:22px;background:#fffdf8;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;touch-action:pan-y;position:relative}.nhead{text-align:center;padding:22px;background:#fff9ed}.nmav{width:88px;height:88px;margin:auto;border:3px solid #e5d0aa;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#f4e6ca}.nmav img{width:100%;height:100%;object-fit:cover}.nmname{margin-top:10px;font:700 22px Georgia}.nbody{padding:18px 18px 76px}.ndialog{padding:14px;border-left:3px solid #c99a55;background:#fff9ee;font-size:11px;line-height:1.7}#nmClose{position:absolute;top:10px;right:10px;z-index:50;width:38px;height:38px;min-width:38px;margin:0;padding:0;border:2px solid #b53a32;border-radius:50%;background:#fffaf4;color:#b53a32;box-shadow:0 5px 16px #2b1d1238;font:900 24px/32px Arial,sans-serif}#nmClose:hover{background:#fff0ed}.ndialog .npc-line{margin:0}.ndialog .npc-link{display:inline-flex;align-items:center;justify-content:center;margin-top:10px;padding:9px 12px;border:1px solid #d8bd91;border-radius:10px;background:#fff;color:#765034;font-weight:900;text-decoration:none}.ndialog .npc-link:hover{background:#fff4df}.nquest{margin-top:12px;padding:12px;border:1px solid #e8ded0;border-radius:11px;font-size:10px}.hiddenframe{position:absolute;width:1px;height:1px;opacity:0;left:-9999px}.beast-ui{font-size:12px;line-height:1.55}.nmav.beast-modal-banner{width:100%;height:auto;max-width:none;margin:0 0 14px;border:0;border-radius:16px;background:transparent;overflow:hidden}.nmav.beast-modal-banner img{display:block;width:100%;height:auto;max-height:none;object-fit:cover;border-radius:16px}.nhead:has(.beast-modal-banner){padding:14px 14px 18px}.nhead:has(.beast-modal-banner) .nmname{margin-top:4px}.beast-badge{display:inline-block;padding:4px 8px;border:1px solid #d8bd91;border-radius:999px;background:#fff9ed;font-weight:800}.beast-clock{margin:10px 0;font:700 24px Georgia;text-align:center}.beast-note{margin:8px 0;padding:10px;border-radius:10px;background:#fff9ee}.beast-q{margin:12px 0;padding:12px;border:1px solid #e8ded0;border-radius:12px}.beast-q b{display:block;margin-bottom:8px}.beast-opt{display:block;width:100%;margin:6px 0;padding:9px 10px;border:1px solid #ddd1bf;border-radius:9px;background:#fff;text-align:left}.beast-opt.on{border-color:#9c713e;background:#fff6e6}.beast-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.beast-actions .qbtn{flex:1;min-width:130px}.beast-test{margin-bottom:8px;padding:6px 8px;border:1px dashed #b98b49;border-radius:8px;text-align:center;font-weight:800}@media(max-width:850px){.npcgrid{grid-template-columns:repeat(2,1fr)}.qagrid{grid-template-columns:repeat(3,1fr)}}@media(max-width:600px){#ocdQuestPage{padding:12px 8px 40px}.qhero{padding:24px 17px}.qtitle{font-size:27px}.qagrid{grid-template-columns:repeat(2,1fr)}.npcrow{display:block;text-align:center}.npcav{margin:auto auto 8px}.qgroup summary{padding:14px 12px}.qbody{padding:0 12px 14px}}","<div id=\"ocdQuestPage\">\n<section class=\"qhero\">\n<div class=\"qkick\">OCD QUEST</div><h1 class=\"qtitle\">Trang Nhiệm Vụ</h1>\n<p class=\"qdesc\">Gặp gỡ các nhân vật trong Thanh Phong Thư Môn, khám phá website và hoàn thành các nhiệm vụ do Trợ giảng Minh Hồng giao cho bạn.</p>\n<div class=\"qsession\" id=\"qSession\" role=\"button\" tabindex=\"0\"><span class=\"qdot\"></span><div><div class=\"qst\" id=\"qST\">Chào mừng bạn đến Thanh Phong Thư Môn</div><div class=\"qss\" id=\"qSS\">Hãy xác minh mã học viên với Minh Hồng để bắt đầu nhiệm vụ.</div></div><span class=\"qsession-open\">Xem thông tin</span></div>\n<div class=\"qprofile-modal\" id=\"qProfileModal\" aria-hidden=\"true\"><div class=\"qprofile-box\"><button class=\"qprofile-close\" id=\"qProfileClose\" type=\"button\" aria-label=\"Đóng thông tin học viên\">×</button><div class=\"qprofile on\" id=\"qProfile\"><div class=\"qpi\"><div class=\"qavwrap\" id=\"qAvatarWrap\"><div class=\"qav\" id=\"qAvatar\">書</div><img class=\"qframe\" id=\"qFrame\" alt=\"\" aria-hidden=\"true\"></div><div><div class=\"qcode\" id=\"qCode\"></div><div class=\"qname\" id=\"qName\"></div><div class=\"qmeta\" id=\"qMeta\"></div><div class=\"qgems\" id=\"qGems\"></div></div></div><div class=\"qassets\"><h4>HÀNH TRANG <span id=\"qAssetCount\"></span></h4><div class=\"qagrid\" id=\"qAssets\"></div></div></div></div></div>\n</section>\n<section class=\"qsec beast-entry-sec\" id=\"beastEntrySec\"><div class=\"qkick\">SỰ KIỆN TỔ</div><div class=\"beast-rank-banner\" id=\"beastRankBanner\" aria-label=\"Bảng xếp hạng Chinh phục Linh Thú\"><div class=\"beast-rank-head\"><div class=\"qkick\" id=\"beastRankDate\">KẾT QUẢ GẦN NHẤT</div><strong>SỰ KIỆN CHINH PHỤC LINH THÚ TỪ 19:00-20:00 HÀNG NGÀY</strong></div><div class=\"beast-rank-grid\" id=\"beastRankGrid\"><div class=\"beast-rank-loading\">Đang tải bảng xếp hạng gần nhất...</div></div></div><div class=\"beast-rank-rules\"><a href=\"https://www.thudao.com/2026/09/chinh-phuc-linh-thu.html\" target=\"_blank\" rel=\"noopener\">Xem thể lệ</a></div><button class=\"beast-entry-card\" id=\"beastEntryBtn\" type=\"button\"><span class=\"beast-entry-icon\" id=\"beastDailyIcon\"></span><span><strong id=\"beastEntryTitle\">Chinh phục Linh Thú</strong><small id=\"beastEntryStatus\">Đăng nhập để kiểm tra trạng thái</small></span><span class=\"beast-entry-go\">Mở</span></button></section>\n<section class=\"qsec\"><div class=\"qkick\">NHÂN VẬT</div><h2>Gặp gỡ các nhân vật</h2><p>Nhân vật sẽ phản hồi theo đúng nhiệm vụ bạn đang thực hiện.</p><div class=\"npclogin\" id=\"npcLogin\">Nói chuyện với Minh Hồng và nhập mã học viên để bắt đầu.</div><div class=\"npcgrid\" id=\"npcGrid\"></div></section>\n<section class=\"qsec\"><div class=\"qkick\">LỘ TRÌNH</div><h2>Danh sách nhiệm vụ</h2><p>Mỗi yêu cầu được kiểm tra độc lập. Nhiệm vụ hỗn hợp có thể gồm bài nộp, câu hỏi, vật phẩm và NPC.</p><div class=\"qlist\" id=\"qList\"><div class=\"qempty\">Đang tải nhiệm vụ...</div></div></section>\n<div class=\"nmodal\" id=\"nModal\"><div class=\"nbox\"><button class=\"qbtn\" id=\"nmClose\" type=\"button\" aria-label=\"Đóng\">×</button><div class=\"nhead\"><div class=\"nmav\" id=\"nmAv\"></div><div class=\"nmname\" id=\"nmName\"></div></div><div class=\"nbody\"><div class=\"ndialog\" id=\"nmDialog\"></div><div class=\"nquest\" id=\"nmQuest\"></div></div></div></div>\n<iframe name=\"ocdQuestActivityFormTarget\" class=\"hiddenframe\"></iframe><iframe name=\"ocdQuestFormTarget\" class=\"hiddenframe\"></iframe><iframe name=\"ocdQuestRewardFormTarget\" class=\"hiddenframe\"></iframe><iframe name=\"ocdBeastEventFormTarget\" class=\"hiddenframe\"></iframe><iframe name=\"ocdBeastResultFormTarget\" class=\"hiddenframe\"></iframe><iframe name=\"ocdBeastFinalFormTarget\" class=\"hiddenframe\"></iframe>\n</div>",["var xa=Object.defineProperty;var c=(E,M)=>xa(E,\"name\",{value:M,configurable:!0});(function(){\"use strict\";if(window.__OCD_QUEST_PAGE_V3180__)return;window.__OCD_QUEST_PAGE_V3180__=1,window.OCD_QUEST_EVENT_TEST=window.OCD_QUEST_EVENT_TEST||{enabled:!1,questId:\"SKQ_0209\",beast:{enabled:!1,ignoreSchedule:!1,battleMinutes:10,eventId:\"BEAST_TEST\",allowReset:!1}};const E={version:\"3.30.0\",timeZone:\"Asia/Ho_Chi_Minh\",npcBook:\"1-IkcpEkKQtIavl5DIf6Sbwx3p0aAfnSS4HjT6dn1u_E\",npcSheet:\"NhanVat\",questBook:\"10EjfikAuPyc1t_aGDDsUlq0eewo0WUl5qOyXjkVG28M\",sheets:{quest:\"NhiemVu\",step:\"BuocNhiemVu\",question:\"CauHoi\",progress:\"TienDoForm\",activity:\"HoatDongNhiemVu\",dialogue:\"HoiThoaiNPC\",event:\"SuKienTruyenThong\"},giftBook:\"1-IkcpEkKQtIavl5DIf6Sbwx3p0aAfnSS4HjT6dn1u_E\",giftSheet:\"QuaTangGVCN\",tradeSheet:\"MinhHongGiaoDich\",exchangeSheet:\"PhieuDoi\",works:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vRP5cc8duj1XrCXMrymo6Cj7aqIkWfX6bHxGeW-lXcSewfQXhM8fZ5rzbNIQ9mBeVuB8yYr_o1aBoYA/pub?gid=1023688821&single=true&output=csv\",fallback:\"https://docs.google.com/spreadsheets/d/1GJoTRsbq0kZfZrDdh0uCC667PwS3Bgkje2fHQnwnCKs/export?format=csv&gid=1837470623\",formWait:1200,activityForm:{action:\"https://docs.google.com/forms/d/e/1FAIpQLSdfbYq-uMMWRHcvJZxcn1_X4sW3CWJNyQXRXAgawFclC-cZQw/formResponse\",target:\"ocdQuestActivityFormTarget\",fields:{studentCode:\"entry.17565235\",questId:\"entry.1492892557\",stepId:\"entry.1962773712\",stepType:\"entry.1616883484\",status:\"entry.362786452\",result:\"entry.62128887\",completedAt:\"entry.1653056864\"}},progressForm:{action:\"https://docs.google.com/forms/d/e/1FAIpQLSeKQ_WF7f1t-0q69my3h5t2wdNC1HNMdbQTU7-QfvWMChqoeQ/formResponse\",target:\"ocdQuestFormTarget\",fields:{studentCode:\"entry.1705322576\",questId:\"entry.1754303676\",status:\"entry.347553244\",correct:\"entry.1540655773\",total:\"entry.599934961\",startedAt:\"entry.841738600\",completedAt:\"entry.1727972195\",rewardStatus:\"entry.1164148115\"}},rewardForm:{action:\"https://docs.google.com/forms/d/e/1FAIpQLSc48-Y-3nf4GtAKdE-Gq4uOMgOJSBUzvFruoSeQx8qmAok06Q/formResponse\",target:\"ocdQuestRewardFormTarget\",fields:{scope:\"entry.1737038806\",studentCode:\"entry.583300350\",group:\"entry.1930196666\",course:\"entry.1043199349\",rewardType:\"entry.1978772868\",giftName:\"entry.1254676473\",gemType:\"entry.1706258741\",quantity:\"entry.606656855\",reason:\"entry.360182186\",giver:\"entry.1383532227\",status:\"entry.1295235585\"}}},M={version:\"1.0.0\",schedule:{start:\"19:00\",end:\"20:00\",battleMinutes:10},quiz:{questionsPerStudent:5,pool:\"BEAST\"},rewards:{1:3,2:2,3:1,4:0,assistantMultiplier:2},csv:{event:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQs-M8ctSJnddzI1PEibUYK5QN1qbK2GIdam5GXGnuqmhhFsNCvbsxhkHbnccJ4Tmvd-9EJMYDA3RcO/pub?gid=1565964261&single=true&output=csv\",result:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQs-M8ctSJnddzI1PEibUYK5QN1qbK2GIdam5GXGnuqmhhFsNCvbsxhkHbnccJ4Tmvd-9EJMYDA3RcO/pub?gid=866834712&single=true&output=csv\",final:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQs-M8ctSJnddzI1PEibUYK5QN1qbK2GIdam5GXGnuqmhhFsNCvbsxhkHbnccJ4Tmvd-9EJMYDA3RcO/pub?gid=177244121&single=true&output=csv\",questions:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQs-M8ctSJnddzI1PEibUYK5QN1qbK2GIdam5GXGnuqmhhFsNCvbsxhkHbnccJ4Tmvd-9EJMYDA3RcO/pub?gid=2006719682&single=true&output=csv\",assistants:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQs-M8ctSJnddzI1PEibUYK5QN1qbK2GIdam5GXGnuqmhhFsNCvbsxhkHbnccJ4Tmvd-9EJMYDA3RcO/pub?gid=1767609121&single=true&output=csv\"},eventForm:{action:\"https://docs.google.com/forms/d/e/1FAIpQLSd0hZS8jLNSxf9N8kJtbnwp6ijbudeZ-JWijE8dzKXfVCCR1Q/formResponse\",target:\"ocdBeastEventFormTarget\",fields:{eventId:\"entry.2001447255\",day:\"entry.1243873146\",team:\"entry.207220441\",assistantCode:\"entry.819563639\",action:\"entry.1634188609\"}},resultForm:{action:\"https://docs.google.com/forms/d/e/1FAIpQLSdNswWmxLVCnW0gvOZaQAn5ibjrjhBN_sAChG5PR-75qTTcPw/formResponse\",target:\"ocdBeastResultFormTarget\",fields:{eventId:\"entry.173699053\",studentCode:\"entry.1223217323\",studentName:\"entry.1988828424\",studentTeam:\"entry.306115003\",combatTeam:\"entry.932150496\",isAssistant:\"entry.1931518249\",questionIds:\"entry.1948073181\",answers:\"entry.1025502606\",correct:\"entry.646768246\",total:\"entry.1026842227\",startedAt:\"entry.125955484\",submittedAt:\"entry.1813368022\",duration:\"entry.1761638989\",status:\"entry.1696751901\"}},finalForm:{action:\"https://docs.google.com/forms/d/e/1FAIpQLScFKPqT-ySShsuPYsF6cUckk-iz2GlifSHARUqFEse6q0Z6oQ/formResponse\",target:\"ocdBeastFinalFormTarget\",fields:{eventId:\"entry.306714631\",team:\"entry.1567703104\",completed:\"entry.1429860735\",correct:\"entry.1528605714\",score:\"entry.1796852984\",rank:\"entry.1964688425\",reward:\"entry.1561856448\",finalizedAt:\"entry.1711948976\",status:\"entry.3825860\"}}},Fe={HOANG_NGOC:\"Hoàng Ngọc\",HAI_LAM_NGOC:\"Hải Lam Ngọc\",THACH_ANH_TIM:\"Thạch Anh Tím\",LAM_BAO_THACH:\"Lam Bảo Thạch\",LUC_THACH:\"Lục Thạch\",HONG_NGOC:\"Hồng Ngọc\"},vt=[[\"Hoàng Thượng\",\"王\"],[\"Nữ hoạ gia\",\"畫\"],[\"Nông dân\",\"田\"],[\"Nghệ nhân\",\"藝\"],[\"Thư gia\",\"書\"],[\"Võ tướng\",\"武\"],[\"Con bạc\",\"財\"],[\"Con nghiện\",\"藏\"],[\"Gian thương\",\"商\"]],i={code:\"\",logged:!1,npcs:[],quests:[],steps:[],questions:[],remote:{},progressReady:!1,progressError:\"\",rewardKeys:new Set,ledgerReady:!1,studentCsv:\"\",info:null,profile:null,subs:[],subLoaded:!1,evidence:{},activityKeys:new Set,activityReady:!1,dialogues:[],trades:[],tradeReady:!1,events:[],activeEvents:[],surpriseQuestId:\"\",surpriseDay:\"\",assignedSurpriseId:\"\",exchanges:[],exchangeReady:!1,open:new Set,busy:{},formPending:{},submissionUi:{},claimUi:{}};i.beast={ready:!1,error:\"\",eventId:\"\",events:[],results:[],finals:[],questions:[],assistants:[],assistant:null,studentTeam:\"\",combatTeam:\"\",completed:!1,test:null};const p=c(e=>document.getElementById(e),\"$\"),Z=c(()=>window.StudentRewardSystem,\"RS\"),h=c(e=>String(e??\"\").trim(),\"cl\"),q=c(e=>h(e).toLowerCase().normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g,\"\").replace(/đ/g,\"d\").replace(/\\s+/g,\" \"),\"nm\"),b=c(e=>h(e).toUpperCase().replace(/\\s+/g,\" \"),\"tg\"),I=c(e=>h(e).replace(/[&<>\"']/g,t=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"})[t]),\"esc\"),A=c(e=>{try{return Z().normalizeCode(e)}catch{return h(e).toUpperCase().replace(/\\s+/g,\"\")}},\"cd\"),Be=c((e,t)=>\"https://docs.google.com/spreadsheets/d/\"+e+\"/gviz/tq?tqx=out:csv&sheet=\"+encodeURIComponent(t),\"sheetUrl\"),wt=c(e=>Fe[h(e).toUpperCase()]||e,\"rewardName\");function ce(e){let t=[],n=[],a=\"\",r=!1;e=String(e||\"\").replace(/^\\uFEFF/,\"\");for(let s=0;s<e.length;s++){let o=e[s];o=='\"'?r&&e[s+1]=='\"'?(a+='\"',s++):r=!r:o==\",\"&&!r?(n.push(a),a=\"\"):(o==`\n`||o==\"\\r\")&&!r?(o==\"\\r\"&&e[s+1]==`\n`&&s++,n.push(a),n.some(h)&&t.push(n),n=[],a=\"\"):a+=o}return(a||n.length)&&(n.push(a),n.some(h)&&t.push(n)),t}c(ce,\"csv\");function g(e,t){let n=e.map(q);for(let a of t){let r=n.indexOf(q(a));if(r>=0)return r}return-1}c(g,\"col\");const G=(function(){const e=\"https://script.google.com/macros/s/AKfycbwtMkodKNVrUgVWhpvhwMndPZKBrdWD4OF0XoR4i5poQsxRkEDLIkm56-MTxuOCVW9JXA/exec\",t=\"2PACX-1vQs-M8ctSJnddzI1PEibUYK5QN1qbK2GIdam5GXGnuqmhhFsNCvbsxhkHbnccJ4Tmvd-9EJMYDA3RcO\",n=\"2PACX-1vRP5cc8duj1XrCXMrymo6Cj7aqIkWfX6bHxGeW-lXcSewfQXhM8fZ5rzbNIQ9mBeVuB8yYr_o1aBoYA\",a=\"1GJoTRsbq0kZfZrDdh0uCC667PwS3Bgkje2fHQnwnCKs\",r={1565964261:\"LinhThuEvent\",866834712:\"LinhThuKetQua\",177244121:\"LinhThuTongKet\",2006719682:\"NganHangCauHoi\",1767609121:\"TroGiang\"},s={TienDoForm:1,HoatDongNhiemVu:1},o={MinhHongGiaoDich:1},l=new Map,d={},T={};let f=\"\",u=0;function m(N,D){let C=String(N||\"\").match(new RegExp(\"(?:^|&)\"+D+\"=([^&#]*)\"));return C?decodeURIComponent(C[1].replace(/\\+/g,\" \")):\"\"}c(m,\"param\");function y(N,D){N=String(N||\"\");let C=N.match(/\\/spreadsheets\\/d\\/([^/]+)\\/gviz\\/tq\\?([^#]*)/);if(C){let k=C[1],L=m(C[2],\"sheet\");return L?k===E.questBook?{src:\"quest\",name:L,filter:!!s[L]}:k===E.giftBook||k===E.npcBook?{src:\"gift\",name:L,filter:!!o[L]||m(C[2],\"own\")===\"1\"}:null:null}if(C=N.match(/\\/spreadsheets\\/d\\/e\\/([^/]+)\\/pub\\?([^#]*)/),C){let k=m(C[2],\"gid\");return C[1]===t&&r[k]?{src:\"quest\",name:r[k],filter:!1}:C[1]===n&&k===\"1023688821\"?{src:\"students\",name:\"TacPhamWeb\",filter:!0}:C[1]===n&&!k?{src:\"students\",name:\"Form Responses 1\",filter:!0}:null}if(C=N.match(/\\/spreadsheets\\/d\\/([^/]+)\\/export\\?([^#]*)/),C&&C[1]===a){let k=m(C[2],\"gid\");if(k===\"1837470623\")return{src:\"students\",name:\"Form Responses 1\",filter:!0};if(k===\"1603096683\")return{src:\"students\",name:\"HocVien\",filter:!1}}return null}c(y,\"item\");function S(N){return N.src+\":\"+N.name+(N.filter?\"!\":\"\")}c(S,\"key\");async function w(N,D){const C=new AbortController,k=setTimeout(()=>C.abort(),15e3),L=Date.now();try{let K=await fetch(e+\"?multi=\"+encodeURIComponent(N.join(\";\"))+(D?\"&code=\"+encodeURIComponent(D):\"\")+\"&_=\"+Date.now(),{cache:\"no-store\",credentials:\"omit\",signal:C.signal}),O=JSON.parse(await K.text());if(console.info(\"[OCD Quest] Apps Script \"+(Date.now()-L)+\"ms:\",N.join(\" ; \"),O&&O.sheets&&O.sheets._ms||\"\"),!O||!O.ok||!O.sheets)throw Error(O&&O.error||\"Apps Script trả về lỗi.\");return O.sheets}finally{clearTimeout(k)}}c(w,\"request\");function v(N){let D=T[N]?N:\"main\",C=d[D];return C||(C={keys:new Set,code:i.code||\"\"},C.promise=new Promise((k,L)=>setTimeout(()=>{d[D]===C&&delete d[D],w(Array.from(C.keys),C.code).then(k,L)},0)),d[D]=C),C.keys.add(N),C.promise.then(k=>{let L=k[N];if(!Array.isArray(L)||!L.length)throw Error(\"Apps Script thiếu \"+N);return L})}c(v,\"enqueue\");function ne(N,D,C){let k=S(N),L=k+\"@\"+(N.filter?i.code:\"\"),K=l.get(L),O=Date.now();if(K&&(D?K.pre&&O-K.at<2e4||!K.done||O-K.done<1e3:O-K.at<3e4))return D&&(K.pre=!1),K.promise;let j=v(k),Qe={at:O,done:0,pre:!!C,promise:j};return l.set(L,Qe),j.then(()=>{Qe.done=Date.now()},()=>{Qe.done=Date.now(),l.get(L)===Qe&&l.delete(L)}),j}c(ne,\"get\");function Ga(N){return N.map(D=>D.map(C=>(C=C==null?\"\":String(C),/[\",\\r\\n]/.test(C)?'\"'+C.replace(/\"/g,'\"\"')+'\"':C)).join(\",\")).join(`\n`)}c(Ga,\"toCsv\");async function Va(N,D){let C=e?y(N,D):null;if(C&&(!C.filter||i.code)&&Date.now()>=u)try{let k=await ne(C,D);return f=\"Apps Script (\"+new Date().toLocaleTimeString(\"vi-VN\",{timeZone:E.timeZone})+\")\",Ga(k)}catch(k){console.warn(\"[OCD Quest] Apps Script lỗi, dùng nguồn cũ:\",k&&k.message||k),k&&(k.name===\"AbortError\"||k.name===\"TypeError\")&&(u=Date.now()+18e4),f=\"Nguồn cũ dự phòng (Apps Script lỗi)\"}return Dn(N,D)}c(Va,\"text\");async function za(N){const D=new AbortController,C=setTimeout(()=>D.abort(),12e4);try{let L=await(await fetch(e,{method:\"POST\",headers:{\"Content-Type\":\"text/plain;charset=utf-8\"},body:JSON.stringify(N),credentials:\"omit\",signal:D.signal})).text();try{return JSON.parse(L)}catch{throw Error(\"Apps Script trả về dữ liệu không hợp lệ.\")}}catch(k){throw k&&k.name===\"AbortError\"?Error(\"Apps Script phản hồi chậm. Hãy bấm lại sau ít giây; hệ thống không phát thưởng trùng.\"):k}finally{clearTimeout(C)}}c(za,\"post\");async function ja(N,D){let C=0;for(;;){const k=new AbortController,L=setTimeout(()=>k.abort(),12e3),K=Date.now();try{let O=await fetch(e+\"?action=beastLive&what=\"+N+\"&eventId=\"+encodeURIComponent(D)+\"&_=\"+Date.now(),{cache:\"no-store\",credentials:\"omit\",signal:k.signal}),j=JSON.parse(await O.text());if(!j||!j.live)return null;if(!j.ok)throw Error(j.error||\"Linh Thú: máy chủ báo lỗi.\");return console.info(\"[OCD Beast] đọc trực tiếp \"+N+\" \"+(Date.now()-K)+\"ms\"),f=\"Apps Script trực tiếp (\"+new Date().toLocaleTimeString(\"vi-VN\",{timeZone:E.timeZone})+\")\",j}catch(O){if(++C>=2)throw O;await new Promise(j=>setTimeout(j,800))}finally{clearTimeout(L)}}}c(ja,\"live\");function yt(N){e&&N.forEach(D=>{(!D.filter||i.code)&&ne(D,!1,!0).catch(()=>{})})}c(yt,\"prefetch\");const Xa=[\"LinhThuTongKet\",\"NganHangCauHoi\",\"TroGiang\"];return{text:Va,post:za,live:ja,source:c(()=>f,\"source\"),prefetchContent(){yt([[\"quest\",\"NhiemVu\"],[\"quest\",\"BuocNhiemVu\"],[\"quest\",\"CauHoi\"],[\"quest\",\"HoiThoaiNPC\"],[\"quest\",\"SuKienTruyenThong\"],[\"gift\",\"NhanVat\"]].map(N=>({src:N[0],name:N[1],filter:!1})))},prefetchStudent(){yt([{src:\"quest\",name:\"TienDoForm\",filter:!0},{src:\"quest\",name:\"HoatDongNhiemVu\",filter:!0},{src:\"gift\",name:\"QuaTangGVCN\",filter:!0},{src:\"gift\",name:\"MinhHongGiaoDich\",filter:!0},{src:\"gift\",name:\"PhieuDoi\",filter:!1},{src:\"gift\",name:\"SoDuChotDaNhan\",filter:!0}])},prefetchBeast(){yt(Xa.map(N=>({src:\"quest\",name:N,filter:!1})))}}})();window.OCDQuestApi=G;async function ae(e,t){return G.text(e,t)}c(ae,\"text\");async function Dn(e,t){let n=await fetch(e+(t?(e.includes(\"?\")?\"&\":\"?\")+\"_=\"+Date.now():\"\"),{cache:t?\"no-store\":\"default\",credentials:\"omit\"});if(!n.ok)throw Error(\"HTTP \"+n.status);return n.text()}c(Dn,\"textDirect\");async function X(e,t,n){return ce(await ae(Be(e,t),n))}c(X,\"sh\");async function Tt(){let e=Date.now()+15e3;for(;Date.now()<e;){let t=Z();if(t&&t.CONFIG&&t.getStudentRewardProfile){try{window.StudentRewardSystemReady&&await window.StudentRewardSystemReady}catch{}return t}await new Promise(n=>setTimeout(n,100))}throw Error(\"Không tìm thấy Reward Core\")}c(Tt,\"waitCore\");function Ct(){let e=\"\";try{e=A(window.OCDStudentSession&&window.OCDStudentSession.getCode&&window.OCDStudentSession.getCode())}catch{}if(e&&e!==\"ADMIN\"&&!(/^TV\\d{6}$/.test(e)&&!/^TV(?!00)\\d{2,3}0[1-4]01$/.test(e)))return e;try{let t=window.OCDAuth,n=t&&t.token&&t.token()&&t.me&&t.me();if(n){let a=A(n.linked||(n.type!==\"TV\"?n.code:\"\"));if(a)return a}}catch{}return e===\"ADMIN\"?e:\"\"}c(Ct,\"sessionCode\");function W(e,t=400){if(e=h(e),!e)return\"\";try{if(Z().convertDriveImageUrl)return Z().convertDriveImageUrl(e,t)||e}catch{}let n=e.match(/\\/file\\/d\\/([^/?&#]+)|\\/d\\/([^/?&#]+)|[?&]id=([^&#]+)/i),a=n&&(n[1]||n[2]||n[3]);return a?\"https://drive.google.com/thumbnail?id=\"+encodeURIComponent(a)+\"&sz=w\"+t:e}c(W,\"drive\");function An(e,t=\"npcav\"){let n=document.createElement(\"div\");if(n.className=t,e.image){let a=new Image;a.src=e.image,a.alt=e.name,a.onerror=()=>n.textContent=e.symbol||e.name[0],n.appendChild(a)}else n.textContent=e.symbol||e.name[0];return n}c(An,\"visual\");async function St(){i.npcs=vt.map((e,t)=>({id:\"NPC_\"+(t+1),name:e[0],symbol:e[1],description:\"Chào mừng bạn đến Thanh Phong Thư Môn.\",image:\"\"}));try{let e=await X(E.npcBook,E.npcSheet),t=e[0],n=g(t,[\"Nhân vật\"]),a=g(t,[\"Hình ảnh\"]),r=g(t,[\"Mô tả\"]),s=e.slice(1).map((o,l)=>{let d=h(o[n]),T=vt.find(f=>q(f[0])==q(d));return d?{id:\"NPC_\"+(l+1),name:d,symbol:T?T[1]:d[0],image:a>=0?W(o[a]):\"\",description:r>=0?h(o[r]):\"\"}:null}).filter(Boolean);s.length&&(i.npcs=s)}catch(e){console.warn(e)}yn()}c(St,\"loadNpcs\");function Ln(e){if(!e.length)return[];let t=e[0],n={id:g(t,[\"QuestID\"]),name:g(t,[\"TenNhiemVu\"]),level:g(t,[\"Cap\",\"Tuan\",\"Tuần\"]),desc:g(t,[\"MoTa\"]),open:g(t,[\"DieuKienMo\"]),reward:g(t,[\"LoaiThuong\"]),amount:g(t,[\"SoLuongThuong\"]),next:g(t,[\"NextQuest\"]),status:g(t,[\"TrangThai\"])};return e.slice(1).map(a=>({id:h(a[n.id]),name:h(a[n.name]),level:h(a[n.level]),desc:h(a[n.desc]),open:n.open>=0?h(a[n.open]):\"AUTO\",reward:h(a[n.reward]),amount:Number(a[n.amount])||0,next:h(a[n.next]),status:h(a[n.status])})).filter(a=>a.id&&q(a.status)==\"active\")}c(Ln,\"mapQuest\");function Rn(e){if(!e.length)return[];let t=e[0],n={id:g(t,[\"EventID\"]),name:g(t,[\"TenSuKien\",\"Tên sự kiện\"]),calendar:g(t,[\"LoaiLich\",\"Loại lịch\"]),day:g(t,[\"Ngay\",\"Ngày\"]),month:g(t,[\"Thang\",\"Tháng\"]),pre:g(t,[\"MoTruocNgay\",\"Mở trước ngày\"]),npc:g(t,[\"NPC\"]),quest:g(t,[\"QuestID\"]),annual:g(t,[\"LapHangNam\",\"Lặp hàng năm\"]),desc:g(t,[\"MoTa\",\"Mô tả\"]),status:g(t,[\"TrangThai\",\"Trạng thái\"])};return e.slice(1).map(a=>({id:h(a[n.id]),name:h(a[n.name]),calendar:h(a[n.calendar]).toUpperCase(),day:Number(a[n.day])||0,month:Number(a[n.month])||0,pre:Math.max(0,Number(a[n.pre])||0),npc:h(a[n.npc]),quest:h(a[n.quest]),annual:n.annual>=0?h(a[n.annual]):\"TRUE\",desc:n.desc>=0?h(a[n.desc]):\"\",status:n.status>=0?h(a[n.status]):\"ACTIVE\"})).filter(a=>a.id&&a.quest&&a.day&&a.month&&q(a.status)===\"active\")}c(Rn,\"mapEvent\");function x(){let e=new Intl.DateTimeFormat(\"en-CA\",{timeZone:E.timeZone,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",hourCycle:\"h23\"}).formatToParts(new Date),t={};return e.forEach(n=>{n.type!==\"literal\"&&(t[n.type]=Number(n.value))}),{year:t.year,month:t.month,day:t.day,hour:t.hour||0,minute:t.minute||0,second:t.second||0}}c(x,\"vnDateParts\");function Et(e,t,n){return Math.floor(Date.UTC(e,t-1,n)/864e5)}c(Et,\"dayNo\");function V(){let e=window.OCD_QUEST_EVENT_TEST||{},t=e.beast||{};return{enabled:t.enabled===!0,ignoreSchedule:t.ignoreSchedule!==!1,battleMinutes:Math.max(1,Number(t.battleMinutes)||M.schedule.battleMinutes),eventId:h(t.eventId||\"BEAST_TEST\"),allowReset:t.allowReset===!0,rewardsEnabled:!1}}c(V,\"beastTestConfig\");function It(){let e=V();if(e.enabled){let n=x();return e.eventId+\"_\"+n.year+String(n.month).padStart(2,\"0\")+String(n.day).padStart(2,\"0\")}let t=x();return\"BEAST_\"+t.year+String(t.month).padStart(2,\"0\")+String(t.day).padStart(2,\"0\")}c(It,\"beastRuntimeEventId\");function Nt(){let e=x();return e.year+\"-\"+String(e.month).padStart(2,\"0\")+\"-\"+String(e.day).padStart(2,\"0\")}c(Nt,\"beastRuntimeDay\");function Hn(){let e=V();return e.enabled?e.battleMinutes:M.schedule.battleMinutes}c(Hn,\"beastBattleMinutes\");async function $(e,t){let n=e===M.csv.event?\"event\":e===M.csv.result?\"result\":\"\",a=i.beast&&i.beast.eventId;if(n&&a)try{let r=await G.live(n,a);if(r&&Array.isArray(r[n]))return r[n].map(s=>(s||[]).map(o=>o==null?\"\":String(o)))}catch(r){console.warn(\"[OCD Beast] đọc trực tiếp lỗi, dùng nguồn dự phòng:\",r&&r.message||r)}return ce(await ae(e,t))}c($,\"beastCsv\");function kt(){i.beast={ready:!1,error:\"\",eventId:It(),events:[],results:[],finals:[],questions:[],assistants:[],assistant:null,studentTeam:\"\",combatTeam:\"\",completed:!1,test:V()}}c(kt,\"beastResetState\");function Q(e){let t=h(e),n=q(t),a=n.match(/\\bto\\s*([1-4])\\b/i)||n.match(/(?:^|\\s)([1-4])(?:\\s|$)/);return a?a[1]:n.includes(\"thanh phong mac vu\")?\"1\":n.includes(\"truc mac thu\")?\"2\":n.includes(\"vuong trieu ca biet\")?\"3\":n.includes(\"noi it lam nhieu\")?\"4\":[\"1\",\"2\",\"3\",\"4\"].includes(n)?n:\"\"}c(Q,\"beastTeamNumber\");function fe(e,t){if(!e||!e.length)return[];let n=e[0],a={};return Object.keys(t).forEach(r=>a[r]=g(n,t[r])),e.slice(1).map(r=>{let s={};return Object.keys(a).forEach(o=>s[o]=a[o]>=0?h(r[a[o]]):\"\"),s})}c(fe,\"beastRows\");function Pn(e){return fe(e,{code:[\"Mã học viên\",\"Ma hoc vien\"],name:[\"Họ và tên\",\"Ho va ten\"],team:[\"Tổ bạn muốn phụ trách\",\"To ban muon phu trach\"],role:[\"Vai trò\",\"Vai tro\"]}).filter(t=>t.code&&t.team).map(t=>({...t,code:A(t.code),team:Q(t.team)})).filter(t=>t.team)}c(Pn,\"beastMapAssistants\");function Mt(e){return fe(e,{timestamp:[\"Dấu thời gian\",\"Dau thoi gian\"],eventId:[\"EventID\"],day:[\"Ngày\",\"Ngay\"],team:[\"Tổ\",\"To\"],assistantCode:[\"Mã trợ giảng\",\"Ma tro giang\"],action:[\"Hành động\",\"Hanh dong\"]}).filter(t=>t.eventId&&t.team&&t.action).map(t=>({...t,team:Q(t.team),assistantCode:A(t.assistantCode),action:b(t.action)}))}c(Mt,\"beastMapEvents\");function _e(e){return fe(e,{timestamp:[\"Dấu thời gian\",\"Dau thoi gian\"],eventId:[\"EventID\"],studentCode:[\"Mã học viên\",\"Ma hoc vien\"],studentName:[\"Họ và tên\",\"Ho va ten\"],studentTeam:[\"Tổ gốc\",\"To goc\"],combatTeam:[\"Tổ chiến đấu\",\"To chien dau\"],isAssistant:[\"Là trợ giảng\",\"La tro giang\"],questionIds:[\"QuestionIDs\"],answers:[\"Answers\"],correct:[\"Số câu đúng\",\"So cau dung\"],total:[\"Tổng số câu\",\"Tong so cau\"],startedAt:[\"Bắt đầu lúc\",\"Bat dau luc\"],submittedAt:[\"Nộp lúc\",\"Nop luc\"],duration:[\"Thời gian làm\",\"Thoi gian lam\"],status:[\"Trạng thái\",\"Trang thai\"]}).filter(t=>t.eventId&&t.studentCode).map(t=>({...t,studentCode:A(t.studentCode),studentTeam:Q(t.studentTeam),combatTeam:Q(t.combatTeam),status:b(t.status),correct:Number(t.correct)||0,total:Number(t.total)||0}))}c(_e,\"beastMapResults\");function On(e,t){let n=h(e),a=Number(n.includes(\",\")?n.replace(/\\./g,\"\").replace(\",\",\".\"):n),r=String(t||\"\").match(/^BEAST_(\\d{8})$/),s=Number(n.replace(/\\./g,\"\"));return r&&r[1]>=\"20260930\"&&!n.includes(\",\")&&Number.isInteger(s)&&s>=1e6&&s<=1e8&&(a=s/1e6),Number.isFinite(a)?a:0}c(On,\"beastFinalScore\");function qt(e){return fe(e,{timestamp:[\"Dấu thời gian\",\"Dau thoi gian\"],eventId:[\"EventID\"],team:[\"Tổ\",\"To\"],completed:[\"Số người hoàn thành\",\"So nguoi hoan thanh\"],correct:[\"Tổng câu đúng\",\"Tong cau dung\"],score:[\"Điểm chinh phục\",\"Diem chinh phuc\"],rank:[\"Rank\"],reward:[\"Thưởng mỗi người\",\"Thuong moi nguoi\"],finalizedAt:[\"Thời gian tổng kết\",\"Thoi gian tong ket\"],status:[\"Trạng thái\",\"Trang thai\"]}).filter(t=>t.eventId&&t.team).map(t=>({...t,team:Q(t.team),completed:Number(t.completed)||0,correct:Number(t.correct)||0,score:On(t.score,t.eventId),rank:Number(t.rank)||0,reward:Number(t.reward)||0,status:b(t.status)}))}c(qt,\"beastMapFinals\");function Qn(e){return fe(e,{id:[\"QuestionID\"],text:[\"CauHoi\",\"Câu hỏi\"],A:[\"A\"],B:[\"B\"],C:[\"C\"],D:[\"D\"],answer:[\"DapAn\",\"Đáp án\"],topic:[\"ChuDe\",\"Chủ đề\"],difficulty:[\"DoKho\",\"Độ khó\"],pool:[\"Pool\"],status:[\"TrangThai\",\"Trạng thái\"]}).filter(t=>t.id&&t.text&&b(t.pool||\"BEAST\")===\"BEAST\"&&(!t.status||b(t.status)===\"ACTIVE\")).map(t=>({...t,answer:b(t.answer)}))}c(Qn,\"beastMapQuestions\");const Ue=[[\"Linh thú Cú\",\"https://drive.google.com/file/d/1Iukr_1eoHfCZAn0AyLaxy4u-wE-l8I0g/view?usp=drivesdk\"],[\"Linh thú Mèo\",\"https://drive.google.com/file/d/1_echC_Y_PcIzP8rdcLzX9E3TfOswT57y/view?usp=drivesdk\"],[\"Linh thú Rồng\",\"https://drive.google.com/file/d/1nubbtI_w3qVxpLUrXCm528_kCK926_T0/view?usp=drivesdk\"],[\"Linh thú Kỳ Lân\",\"https://drive.google.com/file/d/16vG6n6-WIDmpmqwVP-haL0Ul-JlTTAWg/view?usp=drivesdk\"],[\"Linh Thú Huyền Dực Phượng\",\"https://drive.google.com/file/d/1Th1Q4bX0_eP4hIho2lqX08pMIN8AHbSe/view?usp=drive_link\"],[\"Linh Thú Thanh Phong Long\",\"https://drive.google.com/file/d/1PjuZV6CjsgyErxBCFZAVOQK0OLWsPo6s/view?usp=drive_link\"],[\"Linh Thú Cửu Vĩ Hồ\",\"https://drive.google.com/file/d/1m5xXEgY8kMbKVjYTbTWRNw7B7-35Dxp9/view?usp=drive_link\"],[\"Linh Thú Huyền Giáp Quy\",\"https://drive.google.com/file/d/1XOOYexbJkQ4QoCcvx4nDak6jH5PikamZ/view?usp=drive_link\"],[\"Linh Thú Kim Sí Điểu\",\"https://drive.google.com/file/d/1PH8P2deTA5xdZOy3OlzA5sQ9xaqSHq7X/view?usp=drive_link\"],[\"Linh Thú Linh Quang Lộc\",\"https://drive.google.com/file/d/1sbUdKDH6a2HUXqy-HHwpCdbzD8Uyzv5n/view?usp=drive_link\"]];function Ke(){let e=Nt(),t=et(\"BEAST_PET|\"+e)%Ue.length;return{name:Ue[t][0],icon:Ue[t][1]}}c(Ke,\"beastDailyPet\");function Fn(){let e=p(\"beastDailyIcon\"),t=Ke(),n=document.createElement(\"img\"),a=p(\"beastEntryTitle\");n.src=W(t.icon,300),n.alt=t.name,n.title=t.name,e.innerHTML=\"\",e.appendChild(n),a&&(a.textContent=t.name+\" đang mất kiểm soát\")}c(Fn,\"renderBeastDailyPet\");function Bn(e,t){return b(e)+\"|\"+A(t)}c(Bn,\"beastQuestionSeed\");function _n(e){let t=et(e)||2654435769;return function(){t+=1831565813;let n=t;return n=Math.imul(n^n>>>15,n|1),n^=n+Math.imul(n^n>>>7,n|61),((n^n>>>14)>>>0)/4294967296}}c(_n,\"beastSeededRandom\");function Ne(e,t){let n=(i.beast&&i.beast.questions||[]).slice().sort((s,o)=>h(s.id).localeCompare(h(o.id),\"en\")),a=M.quiz.questionsPerStudent;if(n.length<a)throw Error(\"Ngân hàng câu hỏi Linh Thú không đủ \"+a+\" câu ACTIVE.\");let r=_n(Bn(e||i.beast.eventId,t||i.code));for(let s=n.length-1;s>0;s--){let o=Math.floor(r()*(s+1)),l=n[s];n[s]=n[o],n[o]=l}return n.slice(0,a)}c(Ne,\"beastAssignedQuestions\");function Dt(e,t){return Ne(e,t).map(n=>n.id)}c(Dt,\"beastAssignedQuestionIds\");function Un(e,t,n){let a=Array.isArray(e)?e:String(e||\"\").split(/[|,;]+/).map(h).filter(Boolean),r=Dt(t,n);return a.length===r.length&&a.every((s,o)=>b(s)===b(r[o]))}c(Un,\"beastValidateAssignment\");function At(){let e=i.beast||{},t=P();if(!i.logged)return\"Bạn cần nhập mã học viên trước.\";if(!e.ready)return e.error||\"Đang tải dữ liệu Linh Thú...\";if(!e.combatTeam)return\"Chưa xác định được tổ chiến đấu của bạn.\";if(e.completed&&!ie())return\"Các tổ khác vẫn đang chinh phục linh thú, hãy chờ các tổ khác hoàn thành nhiệm vụ hoặc sau 20:00 để xem kết quả trận đấu\";if(!t||t.state===\"WAITING\"){let n=V(),a=x(),r=a.hour*60+a.minute;return!(n.enabled&&n.ignoreSchedule)&&r<1140?\"Hiện tại chưa tới thời gian bắt đầu sự kiện. Hãy quay lại sau 19:00 để nhận nhiệm vụ chinh phục\":\"Trợ giảng chưa mở nhiệm vụ, hãy chờ thêm giây lát\"}return t.state===\"FINISHED\"?\"Thời gian chinh phục Linh Thú của tổ đã kết thúc.\":t.state===\"RESULT\"?\"Kết quả Chinh phục Linh Thú đã được tổng kết.\":\"\"}c(At,\"beastQuizMessage\");function Lt(){let e=At();if(e)throw Error(e);if(P().state!==\"ACTIVE\")throw Error(\"Nhiệm vụ Linh Thú chưa sẵn sàng.\");let n=Ne(),a=Date.now();return i.beast.quizRun={eventId:i.beast.eventId,studentCode:i.code,team:i.beast.combatTeam,startedMs:a,questionIds:n.map(r=>r.id),answers:{}},n.map(r=>({id:r.id,text:r.text,A:r.A,B:r.B,C:r.C,D:r.D,topic:r.topic,difficulty:r.difficulty}))}c(Lt,\"beastStartQuiz\");function Rt(e,t){let n=i.beast&&i.beast.quizRun;if(!n)throw Error(\"Bạn chưa bắt đầu nhiệm vụ Linh Thú.\");if(n.eventId!==i.beast.eventId||n.studentCode!==i.code)throw Error(\"Phiên làm bài Linh Thú không còn hợp lệ.\");let a=h(e),r=b(t);if(!n.questionIds.includes(a))throw Error(\"Câu hỏi không thuộc lượt Linh Thú của bạn.\");if(![\"A\",\"B\",\"C\",\"D\"].includes(r))throw Error(\"Đáp án không hợp lệ.\");return n.answers[a]=r,{answered:Object.keys(n.answers).length,total:n.questionIds.length}}c(Rt,\"beastAnswer\");function Kn(){let e=i.beast&&i.beast.quizRun;return e?{eventId:e.eventId,team:e.team,startedMs:e.startedMs,questionIds:e.questionIds.slice(),answers:{...e.answers},answered:Object.keys(e.answers).length,total:e.questionIds.length}:null}c(Kn,\"beastQuizSnapshot\");function Gn(e){let t=new Map((i.beast.questions||[]).map(n=>[n.id,n]));return e.questionIds.reduce((n,a)=>n+(t.get(a)&&b(t.get(a).answer)===b(e.answers[a])?1:0),0)}c(Gn,\"beastScoreAnswers\");function Ge(){let e=i.beast||{},t=b(e.eventId);return(e.results||[]).some(n=>b(n.eventId)===t&&n.studentCode===i.code&&n.combatTeam===e.combatTeam&&n.status===\"COMPLETED\"&&n.total===M.quiz.questionsPerStudent)}c(Ge,\"beastResultConfirmed\");async function Ht(){let e=await $(M.csv.result,!0);return i.beast.results=_e(e),ke(),i.beast.results}c(Ht,\"beastReloadResultsOnly\");async function Pt(e){let t=Date.now()+(e||15e3);for(;Date.now()<t;){try{if(await Ht(),Ge())return!0}catch{}await new Promise(n=>setTimeout(n,1200))}return!1}c(Pt,\"beastWaitResult\");async function Ot(){let e=i.beast||{},t=e.quizRun,n=F(\"beast-result\",e.eventId+\"|\"+i.code+\"|\"+(e.combatTeam||\"\"));if(!t)throw Error(\"Bạn chưa bắt đầu nhiệm vụ Linh Thú.\");if(e.completed||Ge())return R(n),e.completed=!0,{confirmed:!0,alreadyCompleted:!0};let a=P();if(a.state!==\"ACTIVE\")throw Error(\"Thời gian chinh phục Linh Thú của tổ đã kết thúc.\");if(t.eventId!==e.eventId||t.studentCode!==i.code||t.team!==e.combatTeam)throw Error(\"Phiên làm bài Linh Thú không còn hợp lệ.\");if(!Un(t.questionIds,t.eventId,t.studentCode))throw Error(\"Bộ câu hỏi Linh Thú không hợp lệ.\");if(t.questionIds.length!==M.quiz.questionsPerStudent||Object.keys(t.answers).length!==M.quiz.questionsPerStudent)throw Error(\"Bạn cần trả lời đủ 5 câu trước khi nộp.\");if(i.busy.beastSubmit)throw Error(\"Đang gửi kết quả Linh Thú.\");i.busy.beastSubmit=!0;try{try{await Ht()}catch(f){console.warn(\"[OCD Beast] đọc kết quả trước khi nộp lỗi, vẫn gửi bài (máy chủ chống trùng):\",f&&f.message||f)}if(Ge())return R(n),e.completed=!0,{confirmed:!0,alreadyCompleted:!0};if(U(n)){if(await Pt(15e3))return R(n),e.completed=!0,{confirmed:!0,alreadyCompleted:!0};throw Error(\"Đã gửi bài thành công! Dữ liệu đang được đồng bộ! Kết quả đã được ghi nhận.\")}if(a=P(),a.state!==\"ACTIVE\")throw Error(\"Thời gian chinh phục Linh Thú của tổ đã kết thúc.\");let r=Gn(t),s=Date.now(),o=i.info||{},l=i.profile||{},d=h(o.name||o.fullName||l.name||l.fullName||\"\");if(await te(M.resultForm,{eventId:e.eventId,studentCode:i.code,studentName:d,studentTeam:e.studentTeam,combatTeam:e.combatTeam,isAssistant:e.assistant?\"TRUE\":\"FALSE\",questionIds:t.questionIds.join(\"|\"),answers:t.questionIds.map(f=>t.answers[f]).join(\"|\"),correct:r,total:t.questionIds.length,startedAt:new Date(t.startedMs).toISOString(),submittedAt:new Date(s).toISOString(),duration:Math.max(0,Math.round((s-t.startedMs)/1e3)),status:\"COMPLETED\"}),se(n),!await Pt(15e3))throw Error(\"Đã gửi bài thành công! Dữ liệu đang được đồng bộ! Kết quả đã được ghi nhận.\");return R(n),e.completed=!0,{confirmed:!0,correct:r,total:t.questionIds.length}}finally{i.busy.beastSubmit=!1}}c(Ot,\"beastSubmitQuiz\");function ke(){let e=i.beast||{},t=i.info||{},n=i.profile||{},a=h(t.group||t.team||t.to||n.group||n.team||\"\");e.studentTeam=Q(a),e.assistant=(e.assistants||[]).find(s=>A(s.code)===A(i.code)||b(s.code)===b(i.code))||null,e.combatTeam=e.assistant&&e.assistant.team?e.assistant.team:e.studentTeam;let r=b(e.eventId);e.completed=(e.results||[]).some(s=>b(s.eventId)===r&&s.studentCode===i.code&&s.status===\"COMPLETED\")}c(ke,\"beastResolveIdentity\");function Y(e){let t=h(e);if(!t)return 0;let n=t.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})\\s+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?/);if(n)return Date.UTC(+n[3],+n[2]-1,+n[1],+n[4]-7,+n[5],+(n[6]||0));let a=Date.parse(t);return Number.isFinite(a)?a:0}c(Y,\"beastParseTimestamp\");function Vn(e){let t=new Date(e),n=new Intl.DateTimeFormat(\"en-CA\",{timeZone:E.timeZone,year:\"numeric\",month:\"2-digit\",day:\"2-digit\"}).formatToParts(t).reduce((r,s)=>(r[s.type]=s.value,r),{}),a=n.year+\"-\"+n.month+\"-\"+n.day+\"T20:00:00+07:00\";return Date.parse(a)}c(Vn,\"beastDayEndMs\");function zn(){let e=V();if(e.enabled&&e.ignoreSchedule)return!0;let t=x(),n=t.hour*60+t.minute;return n>=1140&&n<1200}c(zn,\"beastScheduleOpenNow\");function Ve(e){let t=i.beast||{},n=b(t.eventId),a=Q(e||t.combatTeam),r=V(),s=Date.now(),o=(t.events||[]).filter(v=>b(v.eventId)===n&&v.team===a).map(v=>({...v,ms:Y(v.timestamp)})).filter(v=>v.ms).sort((v,ne)=>v.ms-ne.ms),l=o.filter(v=>v.action===\"OPEN\"),d=o.filter(v=>v.action===\"FINISH\"),T=l[0]||null,f=T?T.ms:0,u=d.find(v=>!f||v.ms>=f)||null,m=u?u.ms:0,y=0;f&&(y=f+Hn()*6e4,r.enabled&&r.ignoreSchedule||(y=Math.min(y,Vn(f))));let S=(t.finals||[]).find(v=>b(v.eventId)===n&&v.team===a&&(!v.status||v.status===\"FINAL\"||v.status===\"COMPLETED\"))||null,w=\"WAITING\";return S?w=\"RESULT\":f&&(m||s>=y?w=\"FINISHED\":w=\"ACTIVE\"),{state:w,eventId:t.eventId,team:a,open:T,openMs:f,finish:u,finishMs:m,deadline:y,remainingMs:y?Math.max(0,y-s):0,final:S,canOpen:!!a&&!f&&zn(),canFinish:!!a&&!!f&&!m&&s<y,test:r}}c(Ve,\"beastTeamEventState\");function P(){return i.beast?(i.beast.teamState=Ve(i.beast.combatTeam),i.beast.teamState):null}c(P,\"beastRefreshState\");function Me(){let e=i.beast||{};return!!(i.logged&&e.assistant&&e.combatTeam&&e.assistant.team===e.combatTeam&&A(e.assistant.code)===i.code)}c(Me,\"beastCanControl\");function jn(e,t){let n=i.beast||{},a=b(n.eventId),r=n.combatTeam,s=b(e);return(n.events||[]).some(o=>!o._local&&b(o.eventId)===a&&o.team===r&&o.action===s&&(!t||o.assistantCode===i.code))}c(jn,\"beastHasAction\");function Xn(e){return[b(e.eventId),Q(e.team),A(e.assistantCode),b(e.action),h(e.timestamp)].join(\"|\")}c(Xn,\"beastEventKey\");function ze(e,t){let n=new Map;[...e||[],...t||[]].forEach(r=>{r&&r.eventId&&r.team&&r.action&&n.set(Xn(r),r)});let a=[...n.values()];return a.filter(r=>!r._local||!a.some(s=>!s._local&&b(s.eventId)===b(r.eventId)&&Q(s.team)===Q(r.team)&&b(s.action)===b(r.action)))}c(ze,\"beastMergeEvents\");function Qt(){let e=i.beast||{};return\"ocdBeastActionMemo:\"+encodeURIComponent(A(i.code))+\":\"+encodeURIComponent(b(e.eventId)+\"|\"+Q(e.combatTeam))}c(Qt,\"beastActionMemoKey\");function Ft(){let e=i.beast||{},t=Qt();try{let n=JSON.parse(localStorage.getItem(t)||\"null\");return n&&n.eventId===b(e.eventId)&&n.team===Q(e.combatTeam)?n:null}catch{return null}}c(Ft,\"beastReadActionMemo\");function je(e,t){let n=i.beast||{},a=Q(n.combatTeam),r=b(n.eventId);if(!a||!r)return;let s=Ft()||{eventId:r,team:a},o=t||new Date().toISOString();e===\"OPEN\"&&!s.openAt&&(s.openAt=o),e===\"FINISH\"&&!s.finishAt&&(s.finishAt=o),s.assistantCode=i.code;try{localStorage.setItem(Qt(),JSON.stringify(s))}catch{}}c(je,\"beastRememberAction\");function Bt(e){let t=i.beast||{},n=b(t.eventId),a=Q(t.combatTeam),r=(e||[]).slice(),s=Ft();if(!s||!a)return r;let o=c(l=>r.some(d=>b(d.eventId)===n&&Q(d.team)===a&&b(d.action)===l),\"has\");return s.openAt&&!o(\"OPEN\")&&r.push({eventId:t.eventId,team:a,assistantCode:A(s.assistantCode),action:\"OPEN\",timestamp:s.openAt,_local:!0}),s.finishAt&&!o(\"FINISH\")&&r.push({eventId:t.eventId,team:a,assistantCode:A(s.assistantCode),action:\"FINISH\",timestamp:s.finishAt,_local:!0}),r}c(Bt,\"beastActionMemoRows\");function _t(){let e=i.beast||{},t=b(e.eventId),n=Q(e.combatTeam),a=(e.events||[]).filter(o=>b(o.eventId)===t&&Q(o.team)===n),r=a.filter(o=>b(o.action)===\"OPEN\").sort((o,l)=>Y(o.timestamp)-Y(l.timestamp)),s=a.filter(o=>b(o.action)===\"FINISH\").sort((o,l)=>Y(o.timestamp)-Y(l.timestamp));r[0]&&je(\"OPEN\",r[0].timestamp),s[0]&&je(\"FINISH\",s[0].timestamp)}c(_t,\"beastRememberObservedActions\");async function pe(){let e=await $(M.csv.event,!0),t=Mt(e);return i.beast.events=ze(i.beast.events,Bt(t)),_t(),P(),i.beast.teamState}c(pe,\"beastReloadEventOnly\");async function Ut(e,t){let n=Date.now()+(t||12e3),a=b(e);for(;Date.now()<n;){try{if(await pe(),jn(a,!1))return!0}catch{}await new Promise(r=>setTimeout(r,1200))}return!1}c(Ut,\"beastWaitAction\");async function Kt(e,t){let n=b(e);if(n!==\"OPEN\"&&n!==\"FINISH\")throw Error(\"Hành động Linh Thú không hợp lệ.\");if(!Me())throw Error(\"Chỉ Trợ giảng phụ trách tổ mới có quyền thực hiện thao tác này.\");if(i.busy.beastAction)throw Error(\"Đang xử lý thao tác Linh Thú.\");i.busy.beastAction=!0;let a=F(\"beast-action\",i.beast.eventId+\"|\"+i.beast.combatTeam+\"|\"+n);try{await pe();let r=P();if(n===\"OPEN\"){if(r.openMs)return R(a),r;if(!r.canOpen)throw Error(\"Chưa đến thời gian mở nhiệm vụ Linh Thú.\")}else{if(!r.openMs)throw Error(\"Nhiệm vụ Linh Thú của tổ chưa được mở.\");if(r.finishMs||r.state===\"FINISHED\"||r.state===\"RESULT\")return R(a),r;if(!r.canFinish)throw Error(\"Thời gian chiến đấu của tổ đã kết thúc.\")}if(U(a)){if(await Ut(n,n===\"FINISH\"?3e4:18e3))return R(a),P();throw Error(n===\"OPEN\"?\"Đã ghi nhận lệnh chiến đấu, Trợ giảng hãy kêu gọi học viên F5/ Tải lại trang để tranh quyền trả lời sớm\":\"Đã gửi lệnh thu quân. Dữ liệu đang được ghi. Quay lại xem tổng kết sau 20:00 cùng ngày và nhận phần thưởng cho tổ.\")}if(se(a),await te(M.eventForm,{eventId:i.beast.eventId,day:Nt(),team:i.beast.combatTeam,assistantCode:i.code,action:n}),je(n),typeof t==\"function\"&&t(),!await Ut(n,n===\"FINISH\"?3e4:18e3)){try{await pe()}catch{}let o=P();if(n===\"FINISH\"&&(o.finishMs&&!(o.finish&&o.finish._local)||o.state===\"RESULT\")||n===\"OPEN\"&&o.openMs&&!(o.open&&o.open._local))return R(a),o;throw Error(n===\"OPEN\"?\"Đã ghi nhận lệnh chiến đấu, Trợ giảng hãy kêu gọi học viên F5/ Tải lại trang để tranh quyền trả lời sớm\":\"Đã gửi lệnh thu quân. Dữ liệu đang được ghi. Quay lại xem tổng kết sau 20:00 cùng ngày và nhận phần thưởng cho tổ.\")}return R(a),P()}finally{i.busy.beastAction=!1}}c(Kt,\"beastWriteAction\");async function Gt(e){return Kt(\"OPEN\",e)}c(Gt,\"beastOpen\");async function Vt(e){return Kt(\"FINISH\",e)}c(Vt,\"beastFinish\");function Xe(){let e=b(i.beast.eventId),t=new Map;return(i.beast.results||[]).filter(n=>b(n.eventId)===e&&n.status===\"COMPLETED\"&&n.total===M.quiz.questionsPerStudent&&n.combatTeam).forEach(n=>{let a=n.combatTeam+\"|\"+n.studentCode,r=Y(n.timestamp),s=t.get(a);(!s||!s._ms&&r||r&&r<s._ms)&&t.set(a,{...n,_ms:r})}),[...t.values()]}c(Xe,\"beastUniqueCompletedResults\");function le(){let e=Xe(),t=b(i.beast.eventId),n=[\"1\",\"2\",\"3\",\"4\"].map(r=>{let s=e.filter(v=>v.combatTeam===r),o=s.length,l=s.reduce((v,ne)=>v+(Number(ne.correct)||0),0),d=(i.beast.events||[]).filter(v=>!v._local&&b(v.eventId)===t&&v.team===r).map(v=>({...v,ms:Y(v.timestamp)})).filter(v=>v.ms).sort((v,ne)=>v.ms-ne.ms),T=d.find(v=>v.action===\"OPEN\"),f=T?T.ms:0,u=f?d.find(v=>v.action===\"FINISH\"&&v.ms>=f):null,m=u?u.ms:0,y=f&&m?m-f:null,S=0;o>0&&y!==null&&y<=6e5&&(S=y<18e4?20:y<3e5?15:y<42e4?10:5);let w=o?40*l/(M.quiz.questionsPerStudent*o):0;return{team:r,completed:o,correct:l,openMs:f,finishMs:m,durationMs:y,accuracyPoints:w,mobilizationPoints:0,coordinationPoints:S,score:0}}),a=Math.max(0,...n.map(r=>r.completed));return n.forEach(r=>{r.mobilizationPoints=a?40*r.completed/a:0,r.score=Number((r.accuracyPoints+r.mobilizationPoints+r.coordinationPoints).toFixed(6))}),n.sort((r,s)=>s.score-r.score||s.completed-r.completed||s.correct-r.correct||(r.durationMs===null?1/0:r.durationMs)-(s.durationMs===null?1/0:s.durationMs)||Number(r.team)-Number(s.team)),n.forEach((r,s)=>{r.rank=s+1,r.reward=M.rewards[r.rank]||0}),n}c(le,\"beastSummaryRows\");function xe(e){return(Number(e)||0).toFixed(2).replace(\".\",\",\")}c(xe,\"beastFormatScore\");function zt(){let e=V(),t=Date.now();if(!(e.enabled&&e.ignoreSchedule)){let n=x();if(n.hour*60+n.minute>=1200)return!0}return[\"1\",\"2\",\"3\",\"4\"].every(n=>{let a=Ve(n);return a.openMs?a.finishMs||a.state===\"RESULT\"?!0:!!(a.deadline&&t>=a.deadline):!1})}c(zt,\"beastAllTeamsClosed\");const xn={1:\"https://drive.google.com/file/d/1VLwUU_73rOPsXNrrljhWkK3lF1EpE8KH/view?usp=drivesdk\",2:\"https://drive.google.com/file/d/10OzDAfhWpGdXQoyBTs_seFMw6giTu8Vg/view?usp=drivesdk\",3:\"https://drive.google.com/file/d/1036Hsa90s_A7uuXdfv0jFP49_CfzLqMS/view?usp=drivesdk\",4:\"https://drive.google.com/file/d/1zJr6Xw4uhFxK3klzvuwwp7ZDBTXJi7MC/view?usp=drivesdk\"};function jt(e,t){return\"BEAST:\"+b(e)+\":RANK\"+Number(t)}c(jt,\"beastRewardReason\");function Ye(){return ve().map(e=>({studentCode:e.studentCode,studentName:e.studentName||\"\",team:e.combatTeam,rank:e.rank,reward:e.reward,isAssistant:b(e.isAssistant)===\"TRUE\"}))}c(Ye,\"beastRewardPreview\");function Xt(){let e=Ye();return e.length?`CHẾ ĐỘ TEST - KHÔNG CỘNG THƯỞNG THẬT\n\n`+e.map((t,n)=>n+1+\". \"+(t.studentName||t.studentCode)+\" (\"+t.studentCode+\") - Tổ \"+t.team+\" - Rank \"+t.rank+\" - \"+t.reward+\" Hoàng Ngọc\"+(t.isAssistant?\" [Trợ giảng ×2]\":\"\")).join(`\n`)+`\n\nTổng: `+e.length+\" người.\":\"Không có học viên hợp lệ để nhận thưởng.\"}c(Xt,\"beastRewardPreviewText\");function Yn(){let e=(i.beast&&i.beast.finals||[]).filter(n=>n.eventId);if(!e.length)return\"\";let t=new Map;return e.forEach(n=>{let a=b(n.eventId),r=Y(n.timestamp)||Date.parse(n.finalizedAt)||0,s=t.get(a);(!s||r>s.ms)&&t.set(a,{id:n.eventId,ms:r})}),[...t.values()].sort((n,a)=>a.ms-n.ms)[0]?.id||\"\"}c(Yn,\"beastLatestFinalEvent\");function be(e){let t=new Map;return(i.beast.finals||[]).filter(n=>b(n.eventId)===b(e)&&n.team&&(n.status===\"FINAL\"||n.status===\"COMPLETED\")).forEach(n=>{let a=t.get(n.team),r=Date.parse(n.finalizedAt)||Y(n.timestamp)||0,s=a&&(Date.parse(a.finalizedAt)||Y(a.timestamp))||0;(!a||r>=s)&&t.set(n.team,n)}),[...t.values()].sort((n,a)=>n.rank-a.rank||Number(n.team)-Number(a.team))}c(be,\"beastLatestFinalRows\");function ue(e){return(e||[]).slice().sort((t,n)=>Number(t.team)-Number(n.team)).map(t=>[t.team,t.completed,t.correct,t.score,t.rank,t.reward].join(\":\")).join(\"|\")}c(ue,\"beastSummarySignature\");function Je(){return ue(be(i.beast.eventId))===ue(le())}c(Je,\"beastFinalMatchesSummary\");function xt(e){return b(e)===b(i.beast.eventId)&&(i.beast.results||[]).length?le():be(e)}c(xt,\"beastDisplayRows\");function Yt(){let e=p(\"beastRankGrid\"),t=p(\"beastRankDate\");if(!e)return;let n=Yn()||((i.beast.results||[]).length?i.beast.eventId:\"\");if(!n){e.innerHTML='<div class=\"beast-rank-loading\">Chưa có kết quả Chinh phục Linh Thú.</div>',t&&(t.textContent=\"KẾT QUẢ GẦN NHẤT\");return}let a=xt(n).filter(r=>r.rank>=1&&r.rank<=3).sort((r,s)=>r.rank-s.rank||Number(r.team)-Number(s.team));if(t){let r=String(n).match(/(20\\d{2})[-/]?(\\d{2})[-/]?(\\d{2})/);t.textContent=\"TOP 3 TỔ CHIẾN THẮNG NGÀY \"+(r?r[3]+\"/\"+r[2]+\"/\"+r[1]:n)}if(!a.length){e.innerHTML='<div class=\"beast-rank-loading\">Chưa có kết quả xếp hạng.</div>';return}e.innerHTML=\"\",a.forEach(r=>{let s=r.team,o=xn[s]||\"\",l=document.createElement(\"div\");l.className=\"beast-rank-card\",l.dataset.team=s,o&&l.style.setProperty(\"--br-img\",'url(\"'+W(o,900)+'\")'),l.innerHTML='<span class=\"beast-rank-pos\">HẠNG '+r.rank+'</span><div class=\"beast-rank-copy\"><b>Tổ '+s+\"</b><small>\"+r.completed+\" học viên hoàn thành<br>\"+r.correct+\" câu trả lời đúng · \"+xe(r.score)+\" điểm</small></div>\",e.appendChild(l)})}c(Yt,\"renderBeastRankBanner\");function Jt(e,t,n){return A(e)+\"|\"+jt(t,n)}c(Jt,\"beastRewardKey\");function ye(e,t,n){return i.rewardKeys.has(Jt(e,t,n))}c(ye,\"beastRewarded\");function Ze(e){return F(\"beast-reward\",i.beast.eventId+\"|\"+e.studentCode+\"|\"+e.rank)}c(Ze,\"beastRewardPendingKey\");function Jn(e){return U(Ze(e))}c(Jn,\"beastRewardPending\");function ve(){let e=new Map(be(i.beast.eventId).filter(t=>t.rank>0).map(t=>[t.team,t]));return Xe().map(t=>{let n=e.get(t.combatTeam);if(!n)return null;let a=Number(n.reward)||0,r=b(t.isAssistant)===\"TRUE\"?M.rewards.assistantMultiplier:1;return{...t,rank:Number(n.rank)||0,reward:a*r}}).filter(t=>t&&t.reward>0)}c(ve,\"beastRewardParticipants\");function Zn(){let e=ve();return e.length>0&&e.every(t=>ye(t.studentCode,i.beast.eventId,t.rank))}c(Zn,\"beastAllRewardsConfirmed\");function Wn(){return ve().some(e=>!ye(e.studentCode,i.beast.eventId,e.rank)&&Jn(e))}c(Wn,\"beastAnyRewardPending\");async function Zt(){if(!Me())throw Error(\"Chỉ Trợ giảng mới có quyền phát thưởng.\");if(V().enabled)return{test:!0,preview:Ye(),text:Xt()};if(!ie())throw Error(\"Chưa có kết quả tổng kết chính thức.\");if(!Je())throw Error(\"LinhThuTongKet chưa khớp dữ liệu bài làm mới nhất. Hãy cập nhật tổng kết trước khi phát thưởng.\");if(i.busy.beastReward)throw Error(\"Đang phát thưởng Chinh phục Linh Thú.\");i.busy.beastReward=!0;try{let e=ve();if(!e.length)throw Error(\"Không có học viên hợp lệ để nhận thưởng.\");let t=await G.post({action:\"beastReward\",assistant:i.code,eventId:i.beast.eventId,items:e.map(s=>({code:s.studentCode}))});if(!t||!t.ok)throw Error(t&&t.error||\"Apps Script chưa phát được thưởng Linh Thú.\");let n=t.results||[],a=n.filter(s=>s.status===\"sent\"||s.status===\"already\"),r=n.filter(s=>s.status===\"error\");a.forEach(s=>{i.rewardKeys.add(Jt(s.code,i.beast.eventId,s.rank)),R(F(\"beast-reward\",i.beast.eventId+\"|\"+s.code+\"|\"+s.rank))}),r.length&&console.warn(\"[Linh Thú] Chưa phát được:\",r);try{await z(!0)}catch{}return{total:e.length,confirmed:a.length,pending:e.length-a.length,errors:r}}finally{i.busy.beastReward=!1}}c(Zt,\"beastClaimRewards\");async function Ya(){if(!Me())throw Error(\"Chỉ Trợ giảng mới có quyền phát thưởng.\");if(V().enabled)return{test:!0,preview:Ye(),text:Xt()};if(!ie())throw Error(\"Chưa có kết quả tổng kết chính thức.\");if(!Je())throw Error(\"LinhThuTongKet chưa khớp dữ liệu bài làm mới nhất. Hãy cập nhật tổng kết trước khi phát thưởng.\");if(i.busy.beastReward)throw Error(\"Đang phát thưởng Chinh phục Linh Thú.\");i.busy.beastReward=!0;try{if(await z(),!i.ledgerReady)throw Error(\"Không đọc được QuaTangGVCN.\");let e=ve();if(!e.length)throw Error(\"Không có học viên hợp lệ để nhận thưởng.\");let t;try{t=await ba()}catch(r){throw Error(\"Không đọc được tab HocVien nên chưa gửi quà: \"+String(r&&r.message||r))}for(let r of e){let s=Ze(r);if(ye(r.studentCode,i.beast.eventId,r.rank)){R(s);continue}if(U(s))continue;let o=Re(t,r.studentCode);if(!o||!o.group||!o.course)throw Error(\"Tab HocVien chưa có đủ thông tin Tổ/Khóa cho học viên \"+r.studentCode+\"; chưa gửi quà để tránh ghi sai.\");se(s),await te(E.rewardForm,{scope:\"Cá nhân\",studentCode:r.studentCode,group:o.group,course:o.course,rewardType:\"Linh thạch\",giftName:\"\",gemType:Fe.HOANG_NGOC,quantity:r.reward,reason:jt(i.beast.eventId,r.rank),giver:\"GVCN\",status:\"Đang hiệu lực\"})}let n=Date.now()+3e4,a=0;do{if(await z(),!i.ledgerReady)throw Error(\"Không đọc được QuaTangGVCN khi đang chờ xác nhận.\");if(e.forEach(r=>{ye(r.studentCode,i.beast.eventId,r.rank)&&R(Ze(r))}),a=e.filter(r=>ye(r.studentCode,i.beast.eventId,r.rank)).length,a===e.length||Date.now()>=n)break;await new Promise(r=>setTimeout(r,1500))}while(Date.now()<n);return{total:e.length,confirmed:a,pending:e.length-a}}finally{i.busy.beastReward=!1}}c(Ya,\"beastClaimRewardsLegacy\");async function $n(e){if(!(!e||e.disabled)){e.disabled=!0,e.textContent=\"Đang gửi - đang đồng bộ với dữ liệu - vui lòng chờ trong giây lát...\";try{let t=await Zt();t.test?alert(t.text):t.confirmed===t.total?alert(\"Sheet đã xác nhận đủ \"+t.confirmed+\"/\"+t.total+\" phần thưởng.\"):alert(\"Sheet đã xác nhận \"+t.confirmed+\"/\"+t.total+\" phần thưởng. Các phần còn lại vẫn đang chờ đồng bộ; không gửi lại để tránh trùng.\")}catch(t){alert(t.message||t)}finally{J()}}}c($n,\"beastRewardButtonClick\");function ie(){let e=b(i.beast.eventId);return[\"1\",\"2\",\"3\",\"4\"].every(t=>(i.beast.finals||[]).some(n=>b(n.eventId)===e&&n.team===t&&(n.status===\"FINAL\"||n.status===\"COMPLETED\")))}c(ie,\"beastFinalConfirmed\");async function Wt(){let e=await $(M.csv.final,!0);return i.beast.finals=qt(e),P(),i.beast.finals}c(Wt,\"beastReloadFinalsOnly\");async function ea(e,t){let n=Date.now()+(e||18e3);for(;Date.now()<n;){try{if(await Wt(),ie()&&(!t||ue(be(i.beast.eventId))===t))return!0}catch{}await new Promise(a=>setTimeout(a,1e3))}return!1}c(ea,\"beastWaitFinal\");function Ja(){let e=i.beast||{},t=b(e.eventId),n=new Set((e.events||[]).filter(r=>b(r.eventId)===t&&r.action===\"FINISH\").map(r=>r.team)),a=Xe();return(e.assistants||[]).filter(r=>n.has(r.team)&&!(a||[]).some(s=>s.combatTeam===r.team&&A(s.studentCode)===A(r.code)))}c(Ja,\"beastMissingAssistantResults\");async function ta(e){let t=Date.now(),n=t+(e||15e4),a=\"\",r=0,s=[\"1\",\"2\",\"3\",\"4\"].map(l=>{let d=Ve(l);return d.finishMs||d.deadline||0}).reduce((l,d)=>Math.max(l,d),0),o=(s||t)+(String(G.source()).indexOf(\"Apps Script\")===0?2e4:9e4);for(;Date.now()<n;){try{let l=await $(M.csv.result,!0);i.beast.results=_e(l),ke();let d=ue(le());if(r=d&&d===a?r+1:1,a=d,r>=3&&Date.now()>=o)return!0}catch{r=0}await new Promise(l=>setTimeout(l,2500))}return!1}c(ta,\"beastWaitResultsReady\");async function We(){if(!Me())throw Error(\"Chỉ Trợ giảng mới có quyền tổng kết sự kiện.\");if(i.busy.beastFinalize)throw Error(\"Đang tổng kết Chinh phục Linh Thú.\");i.busy.beastFinalize=!0;let e=\"ocdBeastFinalize:\"+i.beast.eventId;try{if(await de(!0),!zt())throw Error(\"Chưa thể tổng kết: vẫn còn tổ chưa kết thúc lượt chiến đấu.\");if(!await ta(15e4))throw Error(\"Dữ liệu bài làm vẫn đang thay đổi. Hệ thống chưa ghi tổng kết để tránh sai số; hãy thử lại sau vài giây.\");let n=le(),a=ue(n);if(await Wt(),ue(be(i.beast.eventId))===a)return n;try{let o=JSON.parse(localStorage.getItem(e)||\"null\");if(o&&Date.now()-o.at<9e4)throw Error(\"Một lượt tổng kết đang được gửi. Hãy chờ Sheet xác nhận, không bấm lại.\");localStorage.setItem(e,JSON.stringify({at:Date.now(),signature:a}))}catch(o){if(o&&String(o.message).includes(\"Một lượt tổng kết\"))throw o}let r=new Date().toISOString();for(let o of n){let l=F(\"beast-final\",i.beast.eventId+\"|\"+a+\"|\"+o.team);U(l)||(se(l),await te(M.finalForm,{eventId:i.beast.eventId,team:o.team,completed:o.completed,correct:o.correct,score:Number(o.score).toFixed(6).replace(\".\",\",\"),rank:o.rank,reward:o.reward,finalizedAt:r,status:\"FINAL\"}))}if(!await ea(3e4,a))throw Error(\"Đã gửi snapshot tổng kết và đang chờ LinhThuTongKet xác nhận đủ 4 tổ. Không bấm lại; hãy kiểm tra sau vài giây.\");try{localStorage.removeItem(e)}catch{}return Yt(),n}finally{i.busy.beastFinalize=!1}}c(We,\"beastFinalize\");async function de(e){if(!i.logged)return;(!i.beast||!i.beast.eventId)&&kt();let t=i.beast;t.ready=!1,t.error=\"\",t.eventId=It(),t.test=V();try{let n=await Promise.all([$(M.csv.event,e),$(M.csv.result,e),$(M.csv.final,e),$(M.csv.questions,e),$(M.csv.assistants,e)]);t.events=ze(t.events,Mt(n[0])),t.results=_e(n[1]),t.finals=qt(n[2]),t.questions=Qn(n[3]),t.assistants=Pn(n[4]),Yt(),ke(),t.events=ze(t.events,Bt([])),_t(),P(),t.ready=!0}catch(n){t.error=String(n&&n.message||n),console.warn(\"[OCD Beast] load:\",n)}}c(de,\"loadBeast\");function na(){let e=window.OCD_QUEST_EVENT_TEST||{};return{enabled:e.enabled===!0,questId:h(e.questId||\"SKQ_0209\")}}c(na,\"eventTestConfig\");function aa(){let e=x(),t=Et(e.year,e.month,e.day),n=na();i.events.forEach(a=>{a.year=e.year,a.eventDay=Et(e.year,a.month,a.day),a.startDay=a.eventDay-a.pre,a.testActive=!!(n.enabled&&a.quest===n.questId),a.active=a.testActive||a.calendar===\"DUONG_LICH\"&&t>=a.startDay&&t<=a.eventDay}),i.activeEvents=i.events.filter(a=>a.active)}c(aa,\"refreshActiveEvents\");function we(e){let t=h(e).split(\"@\")[0];return i.events.find(n=>n.quest===t)||null}c(we,\"eventForQuest\");function qe(e){return!!e&&(h(e.level).toUpperCase()===\"EVENT\"||!!we(e.id))}c(qe,\"isEventQuest\");function $e(e){return i.activeEvents.some(t=>t.quest===h(e).split(\"@\")[0])}c($e,\"isActiveEventQuest\");function _(e){if(e=h(e),!e||e.includes(\"@\"))return e;let t=we(e);return t?t.testActive?e+\"@TEST\":e+\"@\"+(t.year||x().year):e}c(_,\"runtimeQuestId\");function ia(e){return i.activeEvents.some(t=>q(t.npc)===q(e.name)&&B(t.quest).status!==\"COMPLETED\")}c(ia,\"eventPendingForNpc\");function he(e){return!!e&&h(e.level).toUpperCase()===\"SURPRISE\"}c(he,\"isSurpriseQuest\");function ra(e){let t=e&&i.steps.find(n=>n.quest===e.id&&n.type===\"NPC\");return t?h(t.req):\"\"}c(ra,\"surpriseNpcName\");function $t(){let e=x();return String(e.year)+String(e.month).padStart(2,\"0\")+String(e.day).padStart(2,\"0\")}c($t,\"dateKey\");function et(e){let t=2166136261;e=String(e);for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}c(et,\"stableHash\");function en(e){return!(!e||B(e.id).status===\"COMPLETED\"||e.id===\"DX_MYSTERY_BOX_10\"&&lt()<9)}c(en,\"surpriseEligible\");async function sa(e){if(!e||i.assignedSurpriseId===e.id)return!0;let t=new Date().toISOString();return await te(E.progressForm,{studentCode:i.code,questId:e.id,status:\"ASSIGNED\",correct:0,total:0,startedAt:t,completedAt:\"\",rewardStatus:\"NOT_DUE\"}),i.assignedSurpriseId=e.id,!0}c(sa,\"recordSurpriseAssignment\");async function oa(){if(i.surpriseQuestId=\"\",i.surpriseDay=$t(),!i.logged||!i.progressReady)return;let e=i.quests.filter(he);if(!e.length)return;let t=null;try{t=await G.post({action:\"surprise\",code:i.code,eligible:e.filter(en).map(a=>a.id)})}catch(a){console.warn(\"[OCD Quest] Giao nhiệm vụ đột xuất qua Apps Script lỗi:\",a&&a.message||a)}if(t&&t.ok){let a=h(t.questId).toUpperCase(),r=e.find(s=>h(s.id).toUpperCase()===a);r&&B(r.id).status!==\"COMPLETED\"&&(i.surpriseQuestId=r.id,i.assignedSurpriseId=r.id),console.info(\"[OCD Quest] Nhiệm vụ đột xuất: \"+(a||\"(không còn)\")+(t.assigned?\" - vừa giao\":\" - đang làm\"));return}if(t&&/thao tác không hợp lệ/i.test(String(t.error||\"\")))return ca();t&&console.warn(\"[OCD Quest] Apps Script từ chối giao nhiệm vụ đột xuất:\",t.error);let n=e.find(a=>a.id===i.assignedSurpriseId&&B(a.id).status!==\"COMPLETED\");n&&(i.surpriseQuestId=n.id)}c(oa,\"refreshDailySurprise\");async function ca(){if(i.surpriseQuestId=\"\",i.surpriseDay=$t(),!i.logged||!i.progressReady)return;let e=i.quests.filter(he),t=e.find(r=>r.id===i.assignedSurpriseId&&B(r.id).status!==\"COMPLETED\"),n=\"ocdQuestSurprise:\"+i.code+\":\"+i.surpriseDay,a=\"\";if(!t){try{a=h(localStorage.getItem(n))}catch{}t=e.find(r=>r.id===a&&B(r.id).status!==\"COMPLETED\")}if(!t){let r=e.filter(en);if(!r.length)return;t=r[et(i.code+\"|\"+i.surpriseDay)%r.length]}i.surpriseQuestId=t.id;try{localStorage.setItem(n,t.id)}catch{}i.assignedSurpriseId!==t.id&&await sa(t)}c(ca,\"refreshDailySurpriseLegacy\");function la(e){let t=i.quests.find(n=>n.id===i.surpriseQuestId);return!!t&&q(ra(t))===q(e.name)&&B(t.id).status!==\"COMPLETED\"}c(la,\"surprisePendingForNpc\");function tt(e){let t=h(e.req);if(e.type!==\"SUBMISSION\"||!we(e.quest))return t;let n=we(e.quest);return n&&n.testActive?t+\"-TEST\":t+\"-\"+(n.year||x().year)}c(tt,\"submissionRequirement\");function ua(e){if(!e.length)return[];let t=e[0],n={quest:g(t,[\"QuestID\"]),id:g(t,[\"StepID\"]),order:g(t,[\"ThuTu\"]),name:g(t,[\"TenBuoc\"]),type:g(t,[\"Loai\"]),url:g(t,[\"URL\"]),req:g(t,[\"YeuCau\",\"Yêu cầu\"]),guide:g(t,[\"HuongDan\",\"Hướng dẫn\"]),qty:g(t,[\"SoLuongYeuCau\",\"Số lượng yêu cầu\"])};return e.slice(1).map(a=>({quest:h(a[n.quest]),id:h(a[n.id]),order:Number(a[n.order])||0,name:h(a[n.name]),type:h(a[n.type]).toUpperCase(),url:n.url>=0?h(a[n.url]):\"\",req:n.req>=0?h(a[n.req]):\"\",guide:n.guide>=0?h(a[n.guide]):\"\",qty:n.qty>=0&&Number(a[n.qty])||1})).filter(a=>a.quest&&a.id)}c(ua,\"mapStep\");function da(e){if(!e.length)return[];let t=e[0],n={id:g(t,[\"DialogueID\"]),quest:g(t,[\"QuestID\"]),step:g(t,[\"StepID\"]),npc:g(t,[\"NPC\"]),order:g(t,[\"ThuTu\"]),content:g(t,[\"NoiDung\",\"Nội dung\"]),label:g(t,[\"NhanNut\",\"Nhãn nút\"]),status:g(t,[\"TrangThai\",\"Trạng thái\"])};return e.slice(1).map(a=>({id:h(a[n.id]),quest:h(a[n.quest]),step:h(a[n.step]),npc:h(a[n.npc]),order:Number(a[n.order])||0,content:h(a[n.content]),label:n.label>=0?h(a[n.label]):\"\",status:n.status>=0?h(a[n.status]):\"ACTIVE\"})).filter(a=>a.id&&a.quest&&a.step&&a.npc&&(!a.status||q(a.status)===\"active\")).sort((a,r)=>a.order-r.order)}c(da,\"mapDialogue\");function ha(e,t){return i.dialogues.filter(n=>n.quest===e.quest&&n.step===e.id&&q(n.npc)===q(t.name)).sort((n,a)=>n.order-a.order)}c(ha,\"dialogueFor\");function ma(e){let t=h(e),n=/https?:\\/\\/[^\\s<>\"']+/gi,a=[],r=0,s;for(;s=n.exec(t);){s.index>r&&a.push({type:\"text\",value:t.slice(r,s.index)});let o=s[0].replace(/[),.;!?]+$/,\"\"),l=s[0].slice(o.length);a.push({type:\"link\",value:o}),l&&a.push({type:\"text\",value:l}),r=s.index+s[0].length}return r<t.length&&a.push({type:\"text\",value:t.slice(r)}),a.length?a:[{type:\"text\",value:t}]}c(ma,\"dialogueParts\");function De(e,t){e.innerHTML=\"\";let n=document.createElement(\"p\");n.className=\"npc-line\",ma(t).forEach(a=>{if(a.type===\"link\"){let r=document.createElement(\"a\");r.className=\"npc-link\",r.href=a.value,r.target=\"_blank\",r.rel=\"noopener noreferrer\",r.textContent=\"Đọc nội dung\",n.appendChild(r)}else n.appendChild(document.createTextNode(a.value))}),e.appendChild(n)}c(De,\"renderDialogueContent\");function ga(e){if(!e.length)return[];let t=e[0],n={id:g(t,[\"QuestionID\"]),quest:g(t,[\"QuestID\"]),step:g(t,[\"StepID\"]),order:g(t,[\"ThuTu\"]),text:g(t,[\"CauHoi\"]),a:g(t,[\"A\"]),b:g(t,[\"B\"]),c:g(t,[\"C\"]),d:g(t,[\"D\"]),answer:g(t,[\"DapAn\"])};return e.slice(1).map(a=>({id:h(a[n.id]),quest:h(a[n.quest]),step:h(a[n.step]),order:Number(a[n.order])||0,text:h(a[n.text]),options:{A:h(a[n.a]),B:h(a[n.b]),C:h(a[n.c]),D:h(a[n.d])},answer:h(a[n.answer]).toUpperCase()})).filter(a=>a.id&&a.quest)}c(ga,\"mapQ\");function fa(e,t){let n=e.slice(),a=new Set(n.map(s=>s.quest+\"|\"+s.id)),r=new Map;return t.forEach(s=>{let o=h(s.step),l=s.quest+\"|\"+o;r.has(l)||r.set(l,[]),r.get(l).push(s)}),r.forEach((s,o)=>{let l=o.split(\"|\"),d=l[0],T=l.slice(1).join(\"|\");if(T&&a.has(o)||!T&&(n.find(m=>m.quest===d&&m.type===\"QUIZ\")||(T=d+\"-QUIZ\",o=d+\"|\"+T,a.has(o))))return;let f=n.filter(u=>u.quest===d).reduce((u,m)=>Math.max(u,m.order||0),0);n.push({quest:d,id:T,order:f+1,name:\"Thử thách kiến thức\",type:\"QUIZ\",url:\"\",req:\"ALL\",guide:\"Trả lời đúng toàn bộ câu hỏi để hoàn thành bước này.\",qty:s.length||1}),a.add(o)}),n.sort((s,o)=>s.quest===o.quest?s.order-o.order:0)}c(fa,\"compileSteps\");function nt(e){try{return JSON.parse(localStorage.getItem(e)||\"null\")}catch{return null}}c(nt,\"lsGet\");function at(e,t){try{localStorage.setItem(e,JSON.stringify(t))}catch{}}c(at,\"lsSet\");const tn=\"ocdQuestContent_v1\";function nn(e){let[t,n,a,r,s]=e;i.events=Rn(s),aa(),i.quests=Ln(t),i.questions=ga(a),i.steps=fa(ua(n),i.questions),i.dialogues=da(r),oe(),H()}c(nn,\"applyQuests\");async function an(){let e=nt(tn);if(e&&Array.isArray(e.d)&&e.d.length===5&&!i.quests.length)try{nn(e.d)}catch(n){console.warn(\"[OCD Quest] cache:\",n)}let t=await Promise.all([X(E.questBook,E.sheets.quest),X(E.questBook,E.sheets.step),X(E.questBook,E.sheets.question),X(E.questBook,E.sheets.dialogue),X(E.questBook,E.sheets.event)]);at(tn,{at:Date.now(),d:t}),nn(t)}c(an,\"loadQuests\");function Ae(e,t,n){return i.code+\"|\"+_(e).toUpperCase()+\"|\"+h(t).toUpperCase()+\"|\"+h(n).toUpperCase()}c(Ae,\"activityKey\");function it(e){return i.activityKeys.has(Ae(e.quest,e.id,e.type))}c(it,\"activityDone\");function rn(e){let t=e[0]||[],n=g(t,[\"StudentCode\",\"Mã học viên\"]),a=g(t,[\"QuestID\"]),r=g(t,[\"StepID\"]),s=g(t,[\"StepType\"]),o=g(t,[\"Status\"]),l=new Set;e.slice(1).forEach(d=>{A(d[n])===i.code&&h(d[o]).toUpperCase()===\"COMPLETED\"&&l.add(Ae(d[a],d[r],d[s]))}),i.activityKeys=l,i.activityReady=!0}c(rn,\"applyActivity\");async function me(){if(!i.logged){i.activityReady=!1,i.activityKeys=new Set;return}let e=\"ocdQuestAct_v1:\"+i.code;if(!i.activityReady){let t=nt(e);if(t&&t.code===i.code)try{rn(t.d)}catch{}}try{let t=await X(E.questBook,E.sheets.activity,!0);rn(t),at(e,{code:i.code,d:t})}catch(t){console.warn(\"[OCD Quest] Activity:\",t)}}c(me,\"loadActivity\");async function sn(e,t){if(!i.logged)throw Error(\"Chưa xác minh học viên.\");if(await me(),!i.activityReady)throw Error(\"Không đọc được HoatDongNhiemVu.\");let n=F(\"activity\",Ae(e.quest,e.id,e.type));if(it(e))return R(n),!0;if(!U(n)){se(n);let a=new Date().toISOString();await te(E.activityForm,{studentCode:i.code,questId:_(e.quest),stepId:e.id,stepType:e.type,status:\"COMPLETED\",result:t||\"\",completedAt:a})}for(let a=0;a<14;a++)if(await new Promise(r=>setTimeout(r,a?2200:Date.now()-(i.formOkAt||0)<8e3?0:1200)),await me(),i.activityReady&&it(e))return R(n),!0;throw Error(\"Đã gửi yêu cầu. Chưa thấy xác nhận trong HoatDongNhiemVu; hệ thống sẽ không gửi lại để tránh trùng. Hãy bấm kiểm tra lại sau vài giây.\")}c(sn,\"recordActivity\");function B(e){let t=h(_(e)).toUpperCase();return i.progressReady&&i.remote[t]&&i.remote[t].status===\"COMPLETED\"?i.remote[t]:{status:\"AVAILABLE\"}}c(B,\"progress\");function Le(e){let t=h(e.open);return!t||q(t)==\"auto\"||t.split(/[,;|]+/).map(h).filter(Boolean).every(n=>B(n).status===\"COMPLETED\")}c(Le,\"unlocked\");function pa(){let e=i.quests.filter(t=>!qe(t)&&!he(t)&&B(t.id).status!==\"COMPLETED\"&&Le(t));return e.length?(e.sort((t,n)=>{let a=Number(t.level),r=Number(n.level);return Number.isFinite(a)&&Number.isFinite(r)&&a!==r?a-r:i.quests.indexOf(t)-i.quests.indexOf(n)}),e[0]):null}c(pa,\"currentRegularQuest\");function on(e){if(!e)return!1;if(qe(e))return $e(e.id)&&B(e.id).status!==\"COMPLETED\";if(he(e))return e.id===i.surpriseQuestId&&B(e.id).status!==\"COMPLETED\";let t=pa();return!!t&&t.id===e.id}c(on,\"questVisible\");function cn(e){let t=e[0]||[],n=g(t,[\"StudentCode\",\"Mã học viên\"]),a=g(t,[\"QuestID\"]),r=g(t,[\"Status\"]),s=g(t,[\"CorrectAnswers\"]),o=g(t,[\"TotalQuestions\"]);if(n<0||a<0||r<0)throw Error(\"TienDoForm thiếu cột StudentCode, QuestID hoặc Status\");let l={},d=\"\";e.slice(1).forEach(T=>{let f=A(T[n]),u=h(T[a]).toUpperCase(),m=h(T[r]).toUpperCase();f!==i.code||!u||(m===\"COMPLETED\"?(l[u]={status:\"COMPLETED\",correct:Number(T[s])||0,total:Number(T[o])||0},d===u&&(d=\"\")):m===\"ASSIGNED\"&&u.startsWith(\"DX_\")&&!l[u]&&(d=u))}),d&&l[d]&&l[d].status===\"COMPLETED\"&&(d=\"\"),i.remote=l,i.assignedSurpriseId=d,i.progressReady=!0}c(cn,\"applyProgress\");async function Te(){if(i.progressError=\"\",!i.logged){i.progressReady=!1,i.assignedSurpriseId=\"\";return}let e=\"ocdQuestProg_v1:\"+i.code;if(!i.progressReady){let t=nt(e);if(t&&t.code===i.code)try{cn(t.d),H()}catch{}}try{let t=await X(E.questBook,E.sheets.progress,!0);cn(t),at(e,{code:i.code,d:t})}catch(t){i.progressReady||(i.remote={},i.assignedSurpriseId=\"\"),i.progressError=t&&t.message?t.message:\"Không đọc được TienDoForm\",console.warn(\"[OCD Quest] Progress:\",t)}}c(Te,\"loadProgress\");const ln=\"SoDuChotDaNhan\";function un(e){let t=h(e).match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})\\s+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?/);return t?Date.UTC(+t[3],+t[2]-1,+t[1],+t[4]-7,+t[5],+(t[6]||0)):0}c(un,\"qMs\");function dn(e,t){try{return JSON.parse(h(e))||t}catch{return t}}c(dn,\"qJson\");async function rt(e){let t=e||!i.code?\"*\":i.code;if(i.snapKeys&&(i.snapKeysFor===\"*\"||i.snapKeysFor===t))return i.snapKeys;let n=new Map;try{let a=ce(await ae(Be(E.giftBook,ln)+(t===\"*\"?\"\":\"&own=1\"),!1)),r=a[0]||[],s=g(r,[\"Mã học viên\"]),o=g(r,[\"Mốc chốt\"]),l=g(r,[\"Thưởng đã nhận\"]),d=g(r,[\"Đã bán Minh Hồng\"]),T=g(r,[\"Hộp bí ẩn đã mở\"]),f=g(r,[\"Trạng thái\"]);s>=0&&o>=0&&l>=0&&a.slice(1).forEach(u=>{let m=A(u[s]),y=f>=0?q(u[f]):\"\";if(!m||y&&y!==\"dang hieu luc\"&&y!==\"active\")return;let S=un(u[o]);if(!S)return;let w=n.get(m);w&&w.cut>=S||n.set(m,{cut:S,reasons:dn(u[l],[]),sold:d>=0?dn(u[d],{}):{},mystery:T>=0?Math.max(0,parseInt(u[T],10)||0):0})})}catch(a){console.warn(\"[OCD Quest] \"+ln+\":\",a)}return i.snapKeys=n,i.snapKeysFor=t,n}c(rt,\"loadSnapKeys\");function hn(e,t,n){let a=e&&e.get(t);if(!a)return!0;let r=un(n);return!r||r>a.cut}c(hn,\"afterSnap\");async function z(e){i.ledgerReady=!1;try{let t=rt(e),n=ce(await ae(Be(E.giftBook,E.giftSheet)+(e||!i.code?\"\":\"&own=1\"),!0)),a=n[0]||[],r=g(a,[\"Mã học viên\",\"StudentCode\"]),s=g(a,[\"Lý do tặng\",\"Lý do\",\"Reason\"]),o=g(a,[\"Trạng thái\",\"Status\"]),l=new Set;n.slice(1).forEach(d=>{let T=o>=0?q(d[o]):\"dang hieu luc\",f=A(d[r]),u=h(d[s]).toUpperCase();f&&u&&(!T||T==\"dang hieu luc\"||T==\"active\")&&l.add(f+\"|\"+u)}),(await t).forEach((d,T)=>d.reasons.forEach(f=>{let u=h(f).toUpperCase();u&&l.add(T+\"|\"+u)})),i.rewardKeys=l,i.ledgerReady=!0}catch(t){console.warn(t)}}c(z,\"loadLedger\");async function mn(e){if(i.studentCsv&&!e)return i.studentCsv;let t=Z(),n=t&&t.CONFIG&&t.CONFIG.studentCsv,a=\"\";if(n)try{a=t&&t.getStudentSubmissionsCsv?await t.getStudentSubmissionsCsv(i.code,!!e):await ae(n,!0)}catch(s){console.warn(\"[OCD Quest] Core studentCsv:\",s)}let r=a?Re(a,i.code):null;if(i.code&&!r){let s=\"https://docs.google.com/spreadsheets/d/1GJoTRsbq0kZfZrDdh0uCC667PwS3Bgkje2fHQnwnCKs/export?format=csv&gid=1603096683\";try{let o=await ae(s,!0);o&&Re(o,i.code)&&(a=o)}catch(o){console.warn(\"[OCD Quest] HocVien fallback:\",o)}}if(!a)throw Error(\"Không có studentCsv\");return i.studentCsv=a,a}c(mn,\"loadStudentCsv\");async function ba(){let e=\"https://docs.google.com/spreadsheets/d/1GJoTRsbq0kZfZrDdh0uCC667PwS3Bgkje2fHQnwnCKs/export?format=csv&gid=1603096683\",t=await ae(e,!0);if(!t)throw Error(\"Tab HocVien không có dữ liệu.\");return t}c(ba,\"loadHocVienCsv\");function Re(e,t){let n=ce(e),a=n[0]||[],r=g(a,[\"Mã học viên\",\"StudentCode\"]),s=g(a,[\"Họ và tên\",\"Họ tên\",\"Name\"]),o=g(a,[\"Tổ\",\"Group\"]),l=g(a,[\"Khóa\",\"Khoá\",\"Course\"]);for(let d=n.length-1;d>0;d--)if(A(n[d][r])===t)return{name:s>=0?h(n[d][s]):\"\",group:o>=0?h(n[d][o]):\"\",course:l>=0?h(n[d][l]):\"\"};return null}c(Re,\"findStudent\");function ge(){return i.profile&&Array.isArray(i.profile.ownedItems)?i.profile.ownedItems:[]}c(ge,\"items\");const ya=new Set([\"the doi avatar\",\"linh thu\",\"nen ho so\",\"khung\"]);function gn(e,t){let n=q(e),a=q(t);return!n||!a?!1:!!(n===a||ya.has(a)&&n.startsWith(a+\" \"))}c(gn,\"itemMatchesRequirement\");function st(e){let t=0;return ge().forEach(n=>{let a=h(n.giftName||n.name||n.gift&&n.gift.name);if(!gn(a,e))return;let r=n.quantity!=null?n.quantity:n.qty!=null?n.qty:n.count!=null?n.count:1,s=Number(r);Number.isFinite(s)&&s>0&&(t+=s)}),t}c(st,\"itemQty\");function ot(e){let t=st(e.req),n=Math.max(1,Number(e.qty)||1);return{have:t,need:n,matched:t>=n}}c(ot,\"itemRequirement\");async function re(e){let t=await Tt(),n=await mn(e),a=Re(n,i.code);if(!a)throw Error(\"Không tìm thấy thông tin học viên \"+i.code+\" trong studentCsv.\");let r=e&&t.refreshStudentRewardProfile?await t.refreshStudentRewardProfile(i.code,n):await t.getStudentRewardProfile(i.code,n,!!e);if(!r)throw Error(\"Reward Core chưa trả về hồ sơ học viên \"+i.code+\".\");return i.info=a,i.profile=r,Ma(),r}c(re,\"loadProfile\");function va(e){let t=q(e),n=0;return i.trades.forEach(a=>{a.student===i.code&&q(a.item)===t&&(n+=Math.max(0,Number(a.qty)||0))}),n}c(va,\"tradeItemQty\");function ct(e){let t=va(e.req),n=Math.max(1,Number(e.qty)||1);return{have:t,need:n,matched:t>=n}}c(ct,\"sellRequirement\");async function He(e){if(i.tradeReady=!1,i.trades=[],!!i.logged)try{let t=rt(!1),n=await X(E.giftBook,E.tradeSheet,e),a=n[0]||[],r=g(a,[\"Mã học viên\",\"StudentCode\"]),s=g(a,[\"Tên vật phẩm\",\"Vật phẩm\",\"Item\"]),o=g(a,[\"Số lượng\",\"Quantity\"]),l=g(a,[\"Xác nhận\",\"Confirmation\"]),d=g(a,[\"Dấu thời gian\",\"Timestamp\"]);if(r<0||s<0||o<0)throw Error(\"MinhHongGiaoDich thiếu cột bắt buộc\");let T=await t;i.trades=n.slice(1).filter(u=>d<0||hn(T,A(u[r]),u[d])).map(u=>({student:A(u[r]),item:h(u[s]),qty:Number(u[o])||0,confirm:l>=0?h(u[l]):\"\"})).filter(u=>u.student&&u.item&&u.qty>0);let f=T.get(i.code);f&&Object.keys(f.sold||{}).forEach(u=>{let m=Number(f.sold[u])||0;m>0&&i.trades.push({student:i.code,item:u,qty:m,confirm:\"\",snapshot:!0})}),i.tradeReady=!0}catch(t){console.warn(\"[OCD Quest] MinhHongGiaoDich:\",t)}}c(He,\"loadTrades\");async function Pe(e){if(i.exchangeReady=!1,i.exchanges=[],!!i.logged)try{let t=rt(!1),n=await X(E.giftBook,E.exchangeSheet,e),a=n[0]||[],r=g(a,[\"Mã học viên\",\"StudentCode\"]),s=g(a,[\"Món quà muốn đổi\",\"Tên vật phẩm\",\"Vật phẩm\"]),o=g(a,[\"Là hộp bí ẩn\"]),l=g(a,[\"Trạng thái\",\"Status\"]),d=g(a,[\"Dấu thời gian\",\"Timestamp\"]);if(r<0||s<0||o<0||l<0)throw Error(\"PhieuDoi thiếu cột kiểm tra Hộp quà bí ẩn\");let T=await t;i.exchanges=n.slice(1).map((u,m)=>({id:m+2,student:A(u[r]),item:h(u[s]),mystery:[\"true\",\"1\",\"yes\",\"co\"].includes(q(u[o])),status:q(u[l]),at:d>=0?u[d]:\"\"})).filter(u=>u.student===i.code&&u.mystery&&u.status===\"da mo\"&&q(u.item).startsWith(q(\"Hộp quà bí ẩn\"))&&hn(T,u.student,u.at));let f=T.get(i.code);for(let u=0;u<(f?f.mystery:0);u++)i.exchanges.push({id:\"snap-\"+u,student:i.code,item:\"Hộp quà bí ẩn\",mystery:!0,status:\"da mo\",snapshot:!0});i.exchangeReady=!0}catch(t){console.warn(\"[OCD Quest] PhieuDoi:\",t)}}c(Pe,\"loadExchanges\");function wa(e){let t=ce(e);if(!t.length)return[];let n=t[0],a=g(n,[\"Mã học viên\",\"Mã HV\",\"StudentCode\"]),r=g(n,[\"Mô tả bài tập\",\"Mô tả\",\"Description\"]),s=g(n,[\"Điểm số\",\"Điểm\",\"Điểm giáo viên\",\"Score\"]),o=g(n,[\"Nhận xét\",\"Nhận xét GVCN\",\"Comment\"]);if(r<0&&(r=n.findIndex(l=>q(l).includes(\"mo ta bai tap\"))),a<0)throw Error(\"Thiếu cột Mã học viên\");return t.slice(1).map(l=>({student:A(l[a]),description:r>=0?h(l[r]):\"\",tag:r>=0?b(l[r]):\"\",score:s>=0?Number(String(l[s]||\"\").replace(\",\",\".\")):NaN,comment:o>=0?h(l[o]):\"\"})).filter(l=>l.student)}c(wa,\"parseSubs\");async function Ce(e){let t=await mn(e);if(!t)throw Error(\"Không đọc được bài nộp.\");return i.subs=wa(t).filter(n=>n.student===i.code),i.subLoaded=!0,oe(),i.subs}c(Ce,\"loadSubs\");function F(e,t){return\"ocdQuestPending:\"+encodeURIComponent(i.code)+\":\"+encodeURIComponent(e)+\":\"+encodeURIComponent(t)}c(F,\"pendingFormKey\");function U(e){if(i.formPending[e])return!0;try{return sessionStorage.getItem(e)===\"1\"}catch{return!1}}c(U,\"pendingFormHas\");function se(e){i.formPending[e]=!0;try{sessionStorage.setItem(e,\"1\")}catch{}}c(se,\"pendingFormSet\");function R(e){delete i.formPending[e];try{sessionStorage.removeItem(e)}catch{}}c(R,\"pendingFormClear\");async function Ta(e){let t=\"submission-check:\"+e.id;if(i.busy[t])return i.busy[t];let n=(async()=>{let a=c((s,o)=>{i.submissionUi[e.id]={state:s,text:o},H()},\"set\");a(\"checking\",\"Đã nhận yêu cầu kiểm tra. Đang đọc lại dữ liệu bài nộp...\");let r=\"\";for(let s=1;s<=8;s++){try{if(await Ce(!0),oe(),i.evidence[e.id]&&i.evidence[e.id].matched)return a(\"verified\",\"Đã kiểm tra: tìm thấy bài nộp trong bảng.\"),i.open.add(e.quest),H(),!0}catch(o){r=String(o&&o.message||o)}a(\"waiting\",r?\"Chưa đọc được nguồn bài nộp. Hệ thống sẽ thử lại sau 2 giây... (\"+s+\"/8)\":\"Chưa thấy bài trong Sheet. Hệ thống sẽ kiểm tra lại sau 2 giây... (\"+s+\"/8). Đừng gửi lại Form.\"),s<8&&await new Promise(o=>setTimeout(o,2200))}return a(\"missing\",\"Đã kiểm tra 8 lần nhưng chưa thấy bài trong Sheet. Có thể dữ liệu đang cập nhật; đừng gửi lại ngay. Hãy bấm “Kiểm tra lại” sau vài giây.\"),!1})();i.busy[t]=n;try{return await n}finally{delete i.busy[t]}}c(Ta,\"checkSubmission\");function Ca(e){let t=q(e),n=new Set;return ge().forEach(a=>{let r=h(a.giftName||a.name||a.gift&&a.gift.name);if(!r||!gn(r,e))return;Number(a.quantity!=null?a.quantity:a.qty!=null?a.qty:1)>0&&n.add(q(r))}),n.size}c(Ca,\"distinctItemGroupCount\");function Sa(e){let t=h(e.req).split(\"|\").map(h).filter(Boolean),n=t.filter(a=>st(a)>0);return{have:n.length,need:t.length,matched:t.length>0&&n.length===t.length,missing:t.filter(a=>st(a)<1)}}c(Sa,\"itemSetRequirement\");function lt(){return i.exchangeReady?i.exchanges.length:0}c(lt,\"mysteryBoxUseCount\");function fn(e){if(e.type===\"COMMENT_CONTAINS\"){let t=i.subs.find(n=>n.student===i.code&&q(n.comment).includes(q(e.req)));return{have:t?1:0,need:1,matched:!!t,label:t?\"Đã tìm thấy nhận xét phù hợp.\":\"Chưa có nhận xét GVCN chứa từ “\"+e.req+\"”.\"}}if(e.type===\"SCORE_FIRST\"){let t=Number(e.req),n=i.subs.find(a=>a.student===i.code&&Number.isFinite(a.score)&&Math.abs(a.score-t)<.001);return{have:n?1:0,need:1,matched:!!n,label:n?\"Đã tìm thấy bài đạt đúng \"+t+\" điểm.\":\"Chưa có bài đạt đúng \"+t+\" điểm.\"}}if(e.type===\"ITEM_SET\"){let t=Sa(e);return t.label=t.matched?\"Đã thu thập đủ bộ đồ dùng.\":\"Còn thiếu: \"+t.missing.join(\", \"),t}if(e.type===\"UNIQUE_ITEM_GROUP\"){let t=Ca(e.req),n=Math.max(1,Number(e.qty)||3);return{have:t,need:n,matched:t>=n,label:\"Đang sở hữu \"+t+\"/\"+n+\" loại \"+e.req+\" khác nhau.\"}}if(e.type===\"MYSTERY_BOX_USE\"){let t=lt(),n=Math.max(1,Number(e.qty)||10);return{have:t,need:n,matched:t>=n,label:\"Đã sử dụng \"+t+\"/\"+n+\" Hộp quà bí ẩn.\"}}return{have:0,need:1,matched:!1,label:\"Chưa xác định được tiến độ.\"}}c(fn,\"surpriseRequirement\");function pn(e){return i.questions.filter(t=>t.quest===e.quest&&(!t.step||t.step===e.id)).sort((t,n)=>t.order-n.order)}c(pn,\"questionsFor\");function ee(e){return e.type===\"SUBMISSION\"?!!(i.evidence[e.id]&&i.evidence[e.id].matched):e.type===\"QUIZ\"||e.type===\"NPC\"?it(e):e.type===\"ITEM\"?ot(e).matched:e.type===\"SELL_ITEM\"?ct(e).matched:[\"COMMENT_CONTAINS\",\"SCORE_FIRST\",\"ITEM_SET\",\"UNIQUE_ITEM_GROUP\",\"MYSTERY_BOX_USE\"].includes(e.type)?fn(e).matched:!1}c(ee,\"stepDone\");function Ea(e){return String(e??\"\").normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g,\"\").replace(/[đĐ]/g,\"D\").toUpperCase().replace(/\\s+/g,\" \").trim()}c(Ea,\"codeKey\");function bn(e){let t=Ea(e),n=[],a=/[A-Z]+|[0-9]+/g,r,s=0;for(;r=a.exec(t);)n.push({t:r[0],sep:t.slice(s,r.index)}),s=a.lastIndex;return n}c(bn,\"codeToks\");function Ia(e,t){let n=bn(t).map(r=>r.t);if(!n.length)return!1;let a=bn(e);for(let r=0;r+n.length<=a.length;r++){let s=!0;for(let l=0;l<n.length;l++)if(a[r+l].t!==n[l]){s=!1;break}if(!s||r>0&&a[r].sep===\"\")continue;let o=a[r+n.length];if(!(o&&(o.sep===\"\"||/^[0-9]+$/.test(o.t)&&/^[-_.\\/]+$/.test(o.sep))))return!0}return!1}c(Ia,\"codeHit\");function oe(){let e={};i.steps.forEach(t=>{if(t.type===\"SUBMISSION\"){let n=tt(t),a=i.subs.slice().reverse().find(r=>r.student===i.code&&Ia(r.description,n));e[t.id]={matched:!!a,description:a?a.description:\"\",requirement:n}}}),i.evidence=e}c(oe,\"evaluate\");function Na(e){return[\"SUBMISSION\",\"QUIZ\",\"ITEM\",\"NPC\",\"SELL_ITEM\",\"COMMENT_CONTAINS\",\"SCORE_FIRST\",\"ITEM_SET\",\"UNIQUE_ITEM_GROUP\",\"MYSTERY_BOX_USE\"].includes(e.type)}c(Na,\"requiredStep\");function ut(e){let t=i.steps.filter(r=>r.quest===e.id).sort((r,s)=>r.order-s.order),n=t.filter(Na),a=n.filter(ee).length;return{steps:t,required:n,done:a,total:n.length,ready:n.length>0&&a===n.length}}c(ut,\"questState\");function ka(e){let t=i.steps.filter(a=>a.quest===e.id&&a.type===\"QUIZ\");if(t.length){let a=t.reduce((r,s)=>r+pn(s).length,0);return{correct:a,total:a}}let n=ut(e);return{correct:n.done,total:n.total}}c(ka,\"questMetrics\");function Ma(){if(!i.logged||!i.profile)return;let e=Z(),t=p(\"qProfile\"),n=p(\"qAvatarWrap\"),a=p(\"qName\"),r=p(\"qFrame\");t.classList.add(\"on\"),p(\"qCode\").textContent=i.code,a.textContent=i.info&&i.info.name||\"Học viên \"+i.code,p(\"qMeta\").textContent=[i.info&&i.info.group?\"Tổ \"+i.info.group:\"\",i.info&&i.info.course?\"Khóa \"+i.info.course:\"\"].filter(Boolean).join(\" / \");let s=i.profile.avatar||\"\",o=i.profile.avatarFrame||\"\",l=i.profile.profileBackground||\"\";try{!s&&e.getProfileAvatar&&(s=e.getProfileAvatar(ge())),!o&&e.getProfileAvatarFrame&&(o=e.getProfileAvatarFrame(ge())),!l&&e.getProfileBackground&&(l=e.getProfileBackground(ge()))}catch{}p(\"qAvatar\").innerHTML=s?'<img src=\"'+I(W(s,400))+'\" alt=\"\">':\"書\",o?(r.src=W(o,700),r.classList.add(\"on\")):(r.removeAttribute(\"src\"),r.classList.remove(\"on\")),t.style.backgroundImage=l?'linear-gradient(90deg,rgba(255,250,240,.93),rgba(255,250,240,.78)),url(\"'+W(l,1600).replace(/[\"\\\\]/g,\"\")+'\")':\"\";try{i.profile.hasMultitaskPotion&&e.applyMultitaskEffect?e.applyMultitaskEffect(n,a,{size:\"medium\"}):e.clearMultitaskEffect&&e.clearMultitaskEffect(n,a)}catch{}let d=p(\"qGems\");d.innerHTML=\"\";let T=i.profile.gems||{};(e.GEM_ORDER||[]).forEach(u=>{let m=e.GEM_TYPES[u];m&&d.insertAdjacentHTML(\"beforeend\",'<span class=\"qgem\">'+(m.image?'<img src=\"https://drive.google.com/thumbnail?id='+encodeURIComponent(m.image)+'&sz=w80\">':\"\")+\"<span>\"+Number(T[u]||0)+\"</span></span>\")});let f=new Map;ge().forEach(u=>{let m=h(u.giftName||u.name||u.gift&&u.gift.name);if(!m)return;let y=q(m);f.has(y)||f.set(y,{name:m,qty:0,image:W(u.image||u.gift&&u.gift.image||\"\",200)}),f.get(y).qty+=Math.max(1,Number(u.quantity)||1)}),p(\"qAssetCount\").textContent=f.size?\"- \"+f.size+\" loại\":\"\",p(\"qAssets\").innerHTML=[...f.values()].map(u=>'<div class=\"qasset\">'+(u.image?'<img src=\"'+I(u.image)+'\">':\"物\")+\"<span>\"+I(u.name)+\" × \"+u.qty+\"</span></div>\").join(\"\")||'<span style=\"font-size:9px\">Chưa có vật phẩm.</span>'}c(Ma,\"renderProfile\");function qa(e){return i.steps.filter(n=>{let a=i.quests.find(r=>r.id===n.quest);return n.type===\"NPC\"&&q(n.req)===q(e.name)&&a&&on(a)}).sort((n,a)=>($e(a.quest)?1:0)-($e(n.quest)?1:0))}c(qa,\"npcActiveSteps\");function Da(){let e=p(\"beastEntrySec\"),t=p(\"beastEntryBtn\"),n=p(\"beastEntryStatus\");if(!e||!t||!n)return;Fn();let a=V(),r=a.enabled||i.logged;if(e.classList.toggle(\"on\",r),t.classList.toggle(\"test\",a.enabled),!r)return;if(!i.logged){n.textContent=a.enabled?\"TEST đang bật - nhập mã học viên để tham gia\":\"Đăng nhập để kiểm tra trạng thái\",t.onclick=null;return}if(!i.beast||!i.beast.ready){n.textContent=i.beast&&i.beast.error||\"Đang tải dữ liệu Linh Thú...\",t.onclick=()=>ht();return}let s=P(),o=\"\";i.beast.completed?o=\"Bạn đã hoàn thành lượt hôm nay\":s.state===\"WAITING\"?o=i.beast.assistant?\"Bạn là Trợ giảng - chạm để mở nhiệm vụ\":\"Trợ giảng chưa mở nhiệm vụ\":s.state===\"ACTIVE\"?o=\"Đang chiến đấu - còn \"+dt(s.remainingMs):s.state===\"FINISHED\"?o=\"Lượt chiến đấu của tổ đã kết thúc\":o=\"Đã có kết quả sự kiện\",a.enabled&&(o=\"TEST - \"+o),n.textContent=o,t.classList.toggle(\"active\",s.state===\"ACTIVE\"),t.onclick=()=>ht()}c(Da,\"renderBeastEntry\");function yn(){let e=p(\"npcGrid\");p(\"npcLogin\").classList.toggle(\"on\",!i.logged),e.style.display=i.logged?\"grid\":\"none\",e.innerHTML=\"\",i.logged&&i.npcs.forEach(t=>{let n=document.createElement(\"button\"),a=ia(t)?\" event-alert\":la(t)?\" surprise-alert\":\"\";n.className=\"npccard\"+a,n.type=\"button\",n.innerHTML='<div class=\"npcrow\"><div class=\"npcslot\"></div><div><div class=\"npcname\">'+I(t.name)+'</div><div class=\"npcdesc\">'+I(t.description)+\"</div></div></div>\",n.querySelector(\".npcslot\").replaceWith(An(t)),n.onclick=()=>Tn(t),e.appendChild(n)})}c(yn,\"renderNpcs\");function dt(e){let t=Math.max(0,Math.ceil(e/1e3)),n=Math.floor(t/60);return String(n).padStart(2,\"0\")+\":\"+String(t%60).padStart(2,\"0\")}c(dt,\"beastFmtRemaining\");const vn=\"https://lh3.googleusercontent.com/d/1QSJGZr4Ux7OMPVyoFnUf2fR3hY1Fx7Mw=w1600\";function wn(){let e=p(\"nmAv\");e.className=\"nmav beast-modal-banner\",e.innerHTML=\"\";let t=new Image;if(vn)t.src=vn,t.alt=\"Chinh phục Linh Thú\",t.onerror=function(){this.dataset.fb||(this.dataset.fb=1,this.src=\"https://drive.google.com/thumbnail?id=1QSJGZr4Ux7OMPVyoFnUf2fR3hY1Fx7Mw&sz=w1600\")};else{let n=Ke();t.src=W(n.icon,600),t.alt=n.name,t.style.objectFit=\"contain\",t.style.maxHeight=\"200px\"}e.appendChild(t),p(\"nmName\").textContent=\"Chinh phục Linh Thú\",p(\"nmDialog\").innerHTML=\"\",p(\"nmQuest\").innerHTML=\"\",p(\"nModal\").classList.add(\"on\"),document.body.style.overflow=\"hidden\"}c(wn,\"beastModalBase\");function Oe(){let e=i.beast,t=e.quizRun,n=Ne(),a=p(\"nmQuest\"),r=U(F(\"beast-result\",e.eventId+\"|\"+i.code+\"|\"+(e.combatTeam||\"\")));a.innerHTML='<div class=\"beast-ui\">'+n.map((o,l)=>'<div class=\"beast-q\"><b>Câu '+(l+1)+\". \"+I(o.text)+\"</b>\"+[\"A\",\"B\",\"C\",\"D\"].map(d=>'<button class=\"beast-opt '+(t.answers[o.id]===d?\"on\":\"\")+'\" data-bqid=\"'+I(o.id)+'\" data-bqa=\"'+d+'\" type=\"button\"><strong>'+d+\".</strong> \"+I(o[d])+\"</button>\").join(\"\")+\"</div>\").join(\"\")+'<div class=\"beast-actions\"><button class=\"qbtn green\" id=\"beastSubmitBtn\" type=\"button\">'+(r?\"Kiểm tra kết quả đã gửi\":\"Nộp 5 câu trả lời\")+\"</button></div></div>\",a.querySelectorAll(\".beast-opt\").forEach(o=>{o.disabled=r,o.onclick=()=>{r||(Rt(o.dataset.bqid,o.dataset.bqa),Oe())}});let s=p(\"beastSubmitBtn\");s&&(s.onclick=async()=>{try{s.disabled=!0,s.textContent=\"Đã gửi bài. Đang chờ kiểm tra Sheet.\";let o=await Ot();p(\"nmDialog\").innerHTML='<div class=\"beast-note\">Bạn đã hoàn thành nhiệm vụ Chinh phục Linh Thú. Kết quả đã được ghi nhận.</div>',p(\"nmQuest\").innerHTML='<div class=\"beast-ui\"><span class=\"beast-badge\">Đã hoàn thành</span></div>',P()}catch(o){alert(o.message||o),Oe()}})}c(Oe,\"beastRenderQuizUI\");function J(){function e(m){let y=Ke(),S=document.createElement(\"span\"),w=document.createElement(\"img\");S.className=\"beast-entry-icon\",S.style.margin=\"2px auto 14px\",S.style.width=\"96px\",S.style.height=\"96px\",w.src=W(y.icon,400),w.alt=y.name,w.title=y.name,w.style.width=\"90px\",w.style.height=\"90px\",w.style.objectFit=\"contain\",S.appendChild(w),m.appendChild(S)}c(e,\"addDailyPet\"),wn();let t=i.beast||{},n=V(),a=p(\"nmDialog\"),r=p(\"nmQuest\");if(a.innerHTML=\"\",n.enabled){let m=document.createElement(\"div\");m.className=\"beast-test\",m.textContent=\"CHẾ ĐỘ TEST - KHÔNG PHÁT THƯỞNG\",a.appendChild(m)}if(!t.ready){let m=document.createElement(\"div\");m.className=\"beast-note\",m.textContent=t.error?\"Không tải được dữ liệu Linh Thú: \"+t.error:\"Đang tải dữ liệu Linh Thú...\",a.appendChild(m),r.innerHTML='<div class=\"beast-ui\"><div class=\"beast-actions\"><button class=\"qbtn green\" id=\"beastReloadBtn\" type=\"button\">Tải lại dữ liệu</button></div></div>';let y=p(\"beastReloadBtn\");y&&(y.onclick=async()=>{y.disabled=!0,y.textContent=\"Đang tải...\";try{await de(!0)}catch{}J()});return}let s=P(),o=At(),l=document.createElement(\"div\");if(l.className=\"beast-note\",s&&s.state===\"ACTIVE\"?l.textContent=\"Tổ \"+(t.combatTeam||\"-\")+\" đang chinh phục Linh Thú.\":l.textContent=o||\"Đang kiểm tra trạng thái Linh Thú...\",a.appendChild(l),s&&s.state===\"ACTIVE\"){let m=document.createElement(\"div\");m.className=\"beast-clock\",m.id=\"beastClock\",m.textContent=dt(s.remainingMs),a.insertBefore(m,l)}if(t.quizRun&&s&&s.state===\"ACTIVE\"&&!t.completed){Oe();return}r.innerHTML=\"\";let d=document.createElement(\"div\");d.className=\"beast-ui\";let T=document.createElement(\"span\");if(T.className=\"beast-badge\",T.textContent=\"Tổ chiến đấu: \"+(t.combatTeam||\"Chưa xác định\"),d.appendChild(T),t.assistant){let m=document.createElement(\"div\");m.className=\"beast-note\",m.textContent=\"Trợ giảng: \"+(t.assistant.name||i.code),d.appendChild(m)}let f=document.createElement(\"div\");f.className=\"beast-actions\",d.appendChild(f),r.appendChild(d);function u(m,y,S,w){let v=document.createElement(\"button\");v.className=\"qbtn\"+(S?\" green\":\"\"),v.id=m,v.type=\"button\",v.textContent=y,v.onclick=w,f.appendChild(v)}if(c(u,\"addBtn\"),t.assistant&&s&&s.canOpen&&u(\"beastOpenBtn\",U(F(\"beast-action\",t.eventId+\"|\"+t.combatTeam+\"|OPEN\"))?\"Kiểm tra trạng thái mở\":\"Mở nhiệm vụ\",!0,async function(){let m=U(F(\"beast-action\",t.eventId+\"|\"+t.combatTeam+\"|OPEN\"));this.disabled=!0,this.textContent=\"Đang kiểm tra trạng thái\";try{await Gt(()=>{this.textContent=\"Đã ghi nhận lệnh chiến đấu, Trợ giảng hãy kêu gọi học viên F5/ Tải lại trang để tranh quyền trả lời sớm\"})}catch(y){alert(y.message||y)}J()}),s&&s.state===\"ACTIVE\"&&!t.completed&&u(\"beastStartBtn\",\"Bắt đầu 5 câu hỏi\",!0,function(){try{Lt(),Oe()}catch(m){alert(m.message||m)}}),t.assistant&&s&&s.canFinish){let m=document.createElement(\"div\");m.className=\"beast-note\",m.innerHTML=\"<strong>Bạn là Trợ giảng của tổ.</strong><br>HÃY CHẮC CHẮN TẤT CẢ THÀNH VIÊN THAM GIA đã hoàn tất phần trả lời nhiệm vụ trước khi bấm vào nút “Hoàn tất nhiệm vụ” dưới đây.\",d.appendChild(m),u(\"beastFinishBtn\",U(F(\"beast-action\",t.eventId+\"|\"+t.combatTeam+\"|FINISH\"))?\"Kiểm tra trạng thái hoàn tất\":\"Hoàn tất nhiệm vụ\",!1,async function(){if(!(!U(F(\"beast-action\",t.eventId+\"|\"+t.combatTeam+\"|FINISH\"))&&!confirm(\"Bạn là Trợ giảng của tổ. Hãy chắc chắn tất cả thành viên tham gia đã hoàn tất phần trả lời nhiệm vụ. Bạn có chắc chắn muốn Hoàn tất nhiệm vụ?\"))){this.disabled=!0,this.textContent=\"Đang kiểm tra trạng thái\";try{await Vt(()=>{this.textContent=\"Đã gửi lệnh thu quân. Dữ liệu đang được ghi. Quay lại xem tổng kết sau 20:00 cùng ngày và nhận phần thưởng cho tổ.\"}),await pe()}catch(S){alert(S.message||S)}J()}})}if(t.assistant&&s&&s.state===\"FINISHED\"&&!ie()){f.innerHTML=\"\";let m=document.createElement(\"div\");m.className=\"beast-note\",m.innerHTML='<div style=\"text-align:center;padding:12px 4px\"><div style=\"font-size:11px;font-weight:900;letter-spacing:.12em;color:#8a6734;margin-bottom:7px\">NHIỆM VỤ Đà ĐÓNG</div><div style=\"font:700 23px Georgia,serif;color:#54351f;margin-bottom:8px\">Tổ '+I(t.combatTeam||\"-\")+' đã hoàn tất</div><div style=\"font-size:11px;line-height:1.7;color:#75695f\">'+(s.finish&&s.finish._local?\"Đã gửi yêu cầu hoàn tất. Trợ giảng hãy chờ đến khi hệ thống hoàn tất. Sheet chưa xác nhận lệnh.\":\"FINISH đã được hệ thống xác nhận. Trợ giảng hãy chờ đến khi hệ thống hoàn tất.\")+\" Chỉ các bài đủ 5 câu và có trạng thái COMPLETED mới được tính vào kết quả.</div></div>\",d.appendChild(m);let y=le().find(w=>w.team===t.combatTeam);if(y){let w=document.createElement(\"div\");w.className=\"beast-note\",w.innerHTML=\"<strong>Kết quả tạm thời của Tổ \"+I(t.combatTeam)+'</strong><div style=\"margin-top:9px;line-height:1.8\">Học viên hoàn thành: <strong>'+y.completed+\"</strong><br>Tổng câu trả lời đúng: <strong>\"+y.correct+\"</strong><br>Điểm Chinh phục: <strong>\"+xe(y.score)+\"</strong></div>\",d.appendChild(w)}let S=document.createElement(\"div\");S.className=\"beast-note\",S.innerHTML=\"<strong>Đang chờ các tổ còn lại</strong><br>Bảng xếp hạng chính thức chỉ được xác định sau khi cả 4 tổ kết thúc lượt chiến đấu.\",d.appendChild(S),u(\"beastFinishReloadBtn\",\"Đọc lại trạng thái\",!0,async function(){this.disabled=!0,this.textContent=\"Đang đọc lại trạng thái\";try{await de(!0)}catch(w){alert(w.message||w)}J()})}if(ie()){f.innerHTML=\"\";let m=document.createElement(\"div\");m.className=\"beast-note\";let y=xt(i.beast.eventId).sort((w,v)=>w.rank-v.rank),S=Je();if(m.innerHTML=\"<strong>Kết quả Chinh phục Linh Thú</strong>\"+y.map(w=>\"<div>Rank \"+w.rank+\" - Tổ \"+w.team+\": \"+w.completed+\" người, \"+w.correct+\" câu đúng, \"+xe(w.score)+\" điểm</div>\").join(\"\")+(S?\"\":\"<div><strong>Dữ liệu bài làm mới hơn LinhThuTongKet. Cần cập nhật tổng kết trước khi phát thưởng.</strong></div>\"),d.appendChild(m),t.assistant&&!S&&u(\"beastRefinalizeBtn\",\"Cập nhật tổng kết mới nhất\",!0,async function(){this.disabled=!0,this.textContent=\"Đang chờ Sheet đồng bộ kết quả...\";try{await We(),alert(\"Đã cập nhật snapshot tổng kết mới nhất.\")}catch(w){alert(w.message||w)}J()}),t.assistant&&S)if(Zn()){let w=document.createElement(\"div\");w.className=\"beast-note\",w.textContent=\"Đã phát thưởng. Sheet đã xác nhận đủ cho tất cả học viên.\",f.appendChild(w)}else{let w=Wn();if(u(\"beastRewardBtn\",w?\"Kiểm tra đồng bộ phần thưởng\":\"Nhận thưởng cho tất cả học viên\",!0,function(){$n(this)}),w){let v=document.createElement(\"div\");v.className=\"beast-note\",v.textContent=\"Đang chờ Sheet xác nhận phần thưởng đã gửi. Hệ thống sẽ không gửi lại các phần đang chờ để tránh trùng.\",f.appendChild(v)}}}else t.assistant&&zt()&&u(\"beastFinalizeBtn\",\"Tổng kết 4 tổ\",!0,async function(){this.disabled=!0,this.textContent=\"Đang chờ Sheet đồng bộ kết quả...\";try{await We()}catch(m){alert(m.message||m)}J()})}c(J,\"beastRenderModal\");function ht(){if(!i.logged)throw Error(\"Bạn cần nhập mã học viên trước.\");try{J()}catch(e){console.error(\"[OCD Beast] modal:\",e),wn();let t=p(\"nmDialog\"),n=p(\"nmQuest\");t.textContent=\"Không thể dựng giao diện Linh Thú: \"+String(e&&e.message||e),n.innerHTML='<button class=\"qbtn green\" id=\"beastRecoverBtn\" type=\"button\">Tải lại dữ liệu Linh Thú</button>';let a=p(\"beastRecoverBtn\");a&&(a.onclick=async()=>{a.disabled=!0;try{await de(!0),J()}catch(r){t.textContent=\"Lỗi tải dữ liệu Linh Thú: \"+String(r&&r.message||r)}})}}c(ht,\"openBeast\");function Tn(e){let t=p(\"nmAv\");if(t.className=\"nmav\",t.innerHTML=\"\",e.image){let r=new Image;r.src=e.image,r.alt=e.name,r.onerror=()=>{t.textContent=e.symbol||e.name[0]},t.appendChild(r)}else t.textContent=e.symbol||e.name[0];p(\"nmName\").textContent=e.name;let n=qa(e),a=n.find(r=>!ee(r))||n[0];if(a){let r=ha(a,e);if(ee(a)){let s=r.length?r[r.length-1]:null;De(p(\"nmDialog\"),s?s.content:a.guide||e.description),p(\"nmQuest\").innerHTML=\"<b>\"+I((i.quests.find(o=>o.id===a.quest)||{}).name||a.quest)+\"</b><br>\"+I(a.name)+'<br><span class=\"qok\">Đã hoàn thành cuộc trò chuyện với '+I(e.name)+\".</span>\"}else r.length?Cn(e,a,r,0):(De(p(\"nmDialog\"),a.guide||e.description),p(\"nmQuest\").innerHTML=\"<b>\"+I((i.quests.find(s=>s.id===a.quest)||{}).name||a.quest)+\"</b><br>\"+I(a.name)+'<button class=\"qbtn green\" id=\"npcConfirm\" type=\"button\">Xác nhận đã gặp '+I(e.name)+\"</button>\",setTimeout(()=>Sn(e,a,p(\"npcConfirm\")),0))}else De(p(\"nmDialog\"),e.description),p(\"nmQuest\").textContent=\"Hiện chưa có nhiệm vụ đang mở liên quan đến nhân vật này.\";p(\"nModal\").classList.add(\"on\"),document.body.style.overflow=\"hidden\"}c(Tn,\"openNpc\");function Cn(e,t,n,a){let r=n[a],s=a>=n.length-1;De(p(\"nmDialog\"),r.content),p(\"nmQuest\").innerHTML=\"<b>\"+I((i.quests.find(l=>l.id===t.quest)||{}).name||t.quest)+\"</b><br>\"+I(t.name);let o=document.createElement(\"button\");o.className=\"qbtn\"+(s?\" green\":\"\"),o.type=\"button\",o.textContent=r.label||(s?\"Hoàn thành cuộc trò chuyện\":\"Tiếp tục\"),p(\"nmQuest\").appendChild(o),s?Sn(e,t,o):o.onclick=()=>Cn(e,t,n,a+1)}c(Cn,\"playNpcDialogue\");function Sn(e,t,n){if(!n)return;let a=document.createElement(\"div\");a.className=\"qsync\",a.textContent=\"\",n.after(a),n.onclick=async()=>{if(!i.busy[\"activity:\"+t.id]){i.busy[\"activity:\"+t.id]=1,n.disabled=!0,n.textContent=\"Đã gửi thao tác. Đang kiểm tra Sheet.\",a.textContent=\"Đã nhận thao tác. Đang kiểm tra HoatDongNhiemVu; không bấm gửi lại.\";try{await sn(t,\"NPC:\"+e.name),R(F(\"activity\",Ae(t.quest,t.id,t.type))),i.open.add(t.quest),H(),Tn(e)}catch(r){console.error(\"[OCD Quest] NPC activity:\",r),n.disabled=!1,n.textContent=\"Kiểm tra lại trạng thái\",a.textContent=String(r&&r.message||r)}finally{i.busy[\"activity:\"+t.id]=0}}}}c(Sn,\"bindNpcComplete\");function mt(){p(\"nModal\").classList.remove(\"on\"),document.body.style.overflow=\"\"}c(mt,\"closeNpc\");function Aa(e){let t=document.createElement(\"div\");t.className=\"quiz\";let n=pn(e);if(ee(e))return t.innerHTML='<div class=\"qcomplete\">Đã hoàn thành phần câu hỏi.</div>',t;if(!n.length)return t.innerHTML='<div class=\"qnote\">Bước này chưa có câu hỏi trong Sheet CauHoi.</div>',t;n.forEach((s,o)=>{let l=document.createElement(\"div\");l.className=\"question\",l.innerHTML=\"<b>Câu \"+(o+1)+\". \"+I(s.text)+\"</b>\"+Object.entries(s.options).filter(d=>d[1]).map(d=>'<label class=\"option\"><input type=\"radio\" name=\"'+I(e.id+\"_\"+s.id)+'\" data-q=\"'+I(s.id)+'\" value=\"'+d[0]+'\"><span><b>'+d[0]+\".</b> \"+I(d[1])+\"</span></label>\").join(\"\"),t.appendChild(l)});let a=document.createElement(\"button\");a.className=\"qbtn\",a.type=\"button\",a.textContent=\"Nộp câu trả lời\";let r=document.createElement(\"div\");return r.className=\"result\",a.onclick=()=>{let s=0,o=0;if(n.forEach(l=>{let d=t.querySelector('input[data-q=\"'+CSS.escape(l.id)+'\"]:checked');d&&(s++,d.value===l.answer&&o++)}),s<n.length){r.className=\"result on fail\",r.textContent=\"Bạn chưa trả lời đủ \"+n.length+\" câu hỏi.\";return}if(o<n.length){r.className=\"result on fail\",r.textContent=\"Bạn trả lời đúng \"+o+\"/\"+n.length+\" câu. Hãy thử lại.\";return}a.disabled=!0,a.textContent=\"Đã gửi câu trả lời. Đang chờ kiểm tra.\",r.className=\"result on wait\",r.textContent=\"Đã nhận câu trả lời. Đang chờ HoatDongNhiemVu xác nhận; không bấm gửi lại.\",sn(e,o+\"/\"+n.length).then(()=>{i.open.add(e.quest),H()}).catch(l=>{console.error(\"[OCD Quest] Quiz activity:\",l),a.disabled=!1,a.textContent=\"Kiểm tra lại trạng thái\",r.className=\"result on wait\",r.textContent=String(l&&l.message||l)})},t.append(a,r),t}c(Aa,\"renderQuizStep\");function La(e,t){let n=ee(e),a=document.createElement(\"div\");a.className=\"qstep\"+(n?\" done\":\"\");let r=e.guide||e.req;if(e.type===\"SUBMISSION\"){let s=tt(e);r+=(we(e.quest)?\"<br><b>Mã Mô tả bài tập: \"+I(s)+\"</b>\":\"\")+(n?'<br><span class=\"qok\">Đã tìm thấy bài nộp \"'+I(s)+'\"</span>':e.url?'<br><a class=\"qaction\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"'+I(e.url)+'\">Mở trang Nộp bài ở tab mới</a>':\"\")}else if(e.type===\"ITEM\"){let s=ot(e);r+=s.matched?'<br><span class=\"qok\">Đã xác nhận đang sở hữu '+s.have+\" \"+I(e.req)+\".</span>\":\"<br>Hiện đang sở hữu: \"+s.have+\"/\"+s.need+\" \"+I(e.req)}else if(e.type===\"SELL_ITEM\"){let s=ct(e);r+=s.matched?'<br><span class=\"qok\">Đã xác nhận đã bán '+s.have+\" \"+I(e.req)+\" cho Minh Hồng.</span>\":\"<br>Đã xác nhận giao dịch: \"+s.have+\"/\"+s.need+\" \"+I(e.req)}else if(e.type===\"NPC\")r+=n?'<br><span class=\"qok\">Đã gặp '+I(e.req)+\" cho nhiệm vụ này.</span>\":\"<br><b>Bước này chỉ được tính khi bạn bấm vào \"+I(e.req)+\" ở mục Nhân vật và bấm Hoàn thành cuộc trò chuyện.</b>\"+(e.url?'<br><a class=\"qaction\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"'+I(e.url)+'\">Mở bài đọc ở tab mới</a>':\"\");else if(e.type===\"QUIZ\"&&n)r+='<br><span class=\"qok\">Đã trả lời đúng toàn bộ câu hỏi.</span>';else if([\"COMMENT_CONTAINS\",\"SCORE_FIRST\",\"ITEM_SET\",\"UNIQUE_ITEM_GROUP\",\"MYSTERY_BOX_USE\"].includes(e.type)){let s=fn(e);r+=\"<br>\"+(s.matched?'<span class=\"qok\">'+I(s.label)+\"</span>\":I(s.label))}if(a.innerHTML='<div class=\"qsn\">'+I(e.name)+'</div><div class=\"qstate\">'+r+\"</div>\",t.appendChild(a),e.type===\"SUBMISSION\"){let s=a.querySelector(\".qstate\"),o=i.submissionUi[e.id];if(n){let l=document.createElement(\"div\");l.className=\"qcomplete\",l.textContent=\"Đã kiểm tra: hệ thống đã tìm thấy bài nộp.\",s.appendChild(l)}else{if(o){let d=document.createElement(\"div\");d.className=o.state===\"missing\"?\"qsync\":\"qnote\",d.textContent=o.text,s.appendChild(d)}let l=document.createElement(\"button\");l.type=\"button\",l.className=\"qbtn\",l.textContent=o&&o.state===\"checking\"?\"Đang kiểm tra...\":o&&o.state===\"waiting\"?\"Đang chờ Sheet...\":o&&o.state===\"missing\"?\"Kiểm tra lại\":\"Tôi đã nộp bài - kiểm tra\",l.disabled=!!i.busy[\"submission-check:\"+e.id],l.onclick=()=>Ta(e),s.appendChild(l)}}if(e.type===\"QUIZ\"&&!n){let s=i.steps.filter(o=>o.quest===e.quest&&o.type===\"NPC\"&&o.order<e.order&&!ee(o));if(s.length){let o=document.createElement(\"div\");o.className=\"qnote\",o.textContent=\"Câu hỏi sẽ mở sau khi bạn hoàn thành: \"+s.map(l=>l.name+\" (gặp \"+l.req+\")\").join(\", \")+\".\",a.querySelector(\".qstate\").appendChild(o)}else t.appendChild(Aa(e))}}c(La,\"renderStep\");function H(){Da(),yn(),Ra()}c(H,\"renderAll\");function Ra(){let e=p(\"qList\");if(!i.quests.length){e.innerHTML='<div class=\"qempty\">Đang tải nhiệm vụ...</div>';return}if(i.logged&&!i.progressReady){e.innerHTML='<div class=\"qempty\">'+(i.progressError?\"Chưa đọc được tiến độ từ TienDoForm. Vui lòng tải lại trang.\":\"Đang đối chiếu tiến độ đã hoàn thành...\")+\"</div>\";return}e.querySelectorAll(\"details[data-id]\").forEach(a=>a.open?i.open.add(a.dataset.id):i.open.delete(a.dataset.id)),e.innerHTML=\"\";let t=Object.values(i.claimUi).filter(Boolean);if(t.length){let a=document.createElement(\"div\");a.className=\"qsync\",a.textContent=t[t.length-1],e.appendChild(a)}let n=i.quests.filter(on);n.sort((a,r)=>(qe(r)?2:he(r)?1:0)-(qe(a)?2:he(a)?1:0)),n.forEach((a,r)=>{let s=B(a.id),o=Le(a),l=ut(a),d=document.createElement(\"details\");d.className=\"qgroup\",d.dataset.id=a.id,i.open.has(a.id)&&(d.open=!0);let T=s.status===\"COMPLETED\"?\" - Đà HOÀN THÀNH\":o?l.ready?\" - ĐỦ ĐIỀU KIỆN NHẬN THƯỞNG\":\"\":\" - CHƯA MỞ\";d.innerHTML='<summary><span class=\"qnum\">'+(r+1)+'</span><div class=\"qsum\"><div class=\"qgn\">'+I(a.name)+'</div><div class=\"qgd\">'+I(a.desc)+'</div><div class=\"qgm\">Cấp '+I(a.level)+\" - Thưởng \"+a.amount+\" \"+I(wt(a.reward))+T+'</div></div></summary><div class=\"qbody\"></div>';let f=d.querySelector(\".qbody\");if(l.steps.forEach(u=>La(u,f)),s.status===\"COMPLETED\"&&Se(a))f.insertAdjacentHTML(\"beforeend\",'<div class=\"qcomplete\">Nhiệm vụ đã hoàn thành - Phần thưởng: '+a.amount+\" \"+I(wt(a.reward))+\"</div>\");else if(s.status===\"COMPLETED\"){let u=document.createElement(\"div\");u.className=\"qsync\",u.innerHTML=\"Nhiệm vụ đã ghi nhận hoàn thành nhưng chưa tìm thấy phần thưởng trong QuaTangGVCN.\";let m=document.createElement(\"button\");m.className=\"qbtn green\",m.type=\"button\",m.textContent=\"Nhận phần thưởng còn thiếu\",m.onclick=async()=>{if(!i.busy[\"repair:\"+a.id]){i.busy[\"repair:\"+a.id]=1,m.disabled=!0,m.textContent=\"Đang gửi phần thưởng...\";try{if(await z(),!i.ledgerReady)throw Error(\"Không đọc được QuaTangGVCN\");Se(a)||(await In(a),i.rewardKeys.add(ft(a))),setTimeout(async()=>{try{Z().loadSharedRewardData&&await Z().loadSharedRewardData(!0),await Promise.allSettled([z(),re(!0)]),H()}catch{}},3500),H()}catch(y){console.error(\"[OCD Quest] Repair reward:\",y),m.disabled=!1,m.textContent=\"Thử nhận phần thưởng lại\"}finally{i.busy[\"repair:\"+a.id]=0}}},u.appendChild(m),f.appendChild(u)}else if(!i.logged)f.insertAdjacentHTML(\"beforeend\",'<div class=\"qnote\">Hãy xác minh mã học viên với Minh Hồng.</div>');else if(!o)f.insertAdjacentHTML(\"beforeend\",'<div class=\"qnote\">Hoàn thành nhiệm vụ trước để mở nhiệm vụ này.</div>');else{let u=document.createElement(\"div\");u.className=\"qprogress\";let m=l.total?Math.round(l.done/l.total*100):0;u.innerHTML='<div class=\"qph\"><span>TIẾN ĐỘ NHIỆM VỤ</span><span>'+l.done+\"/\"+l.total+'</span></div><div class=\"qtrack\"><div class=\"qbar\" style=\"width:'+m+'%\"></div></div>';let y=document.createElement(\"button\");if(y.className=\"qbtn\",y.type=\"button\",y.textContent=\"Kiểm tra tiến độ\",y.onclick=async()=>{y.disabled=!0;{let S=[Ce(!0),me()];l.steps.some(w=>[\"ITEM\",\"ITEM_SET\",\"UNIQUE_ITEM_GROUP\"].includes(w.type))&&S.push(re(!0)),l.steps.some(w=>w.type===\"MYSTERY_BOX_USE\")&&S.push(Pe(!0)),l.steps.some(w=>w.type===\"SELL_ITEM\")&&S.push(He(!0)),await Promise.allSettled(S),oe(),i.open.add(a.id),H()}},u.appendChild(y),l.ready){let S=document.createElement(\"button\");S.className=\"qbtn green\",S.type=\"button\",S.textContent=i.busy[\"claim:\"+a.id]?\"Đang kiểm tra Sheet...\":\"Đã hoàn thành yêu cầu - Nhận thưởng\",S.disabled=!!i.busy[\"claim:\"+a.id],S.onclick=()=>Ba(a,S),u.appendChild(S)}f.appendChild(u)}e.appendChild(d)})}c(Ra,\"renderQuests\");const Ha=[[\"progress\",()=>E.progressForm,[\"studentCode\",\"questId\",\"status\"]],[\"activity\",()=>E.activityForm,[\"studentCode\",\"questId\",\"stepId\"]],[\"beastEvent\",()=>M.eventForm,[\"eventId\",\"team\",\"action\"]],[\"beastResult\",()=>M.resultForm,[\"eventId\",\"studentCode\"]],[\"beastFinal\",()=>M.finalForm,[\"eventId\",\"team\"]]];function te(e,t){return e===M.eventForm||e===M.resultForm||e===M.finalForm?Pa(e,t).then(n=>n||En(e,t)):En(e,t)}c(te,\"postForm\");async function Pa(e,t){let n=e===M.eventForm?\"beastEvent\":e===M.finalForm?\"beastFinal\":\"beastResult\",a=[\"\"].concat(Object.keys(e.fields).map(s=>t[s]==null?\"\":String(t[s]))),r=Date.now();try{let s=await G.post({action:\"append\",items:[{kind:n,row:a}]});return s&&s.ok?(console.info(\"[OCD Beast] ghi thẳng \"+n+\" \"+(Date.now()-r)+\"ms\",s.dup&&s.dup[n]?\"(đã có sẵn)\":\"\"),i.formOkAt=Date.now(),!0):(console.warn(\"[OCD Beast] ghi thẳng bị từ chối, gửi Form:\",s&&s.error),!1)}catch(s){return s&&/phản hồi chậm/.test(String(s.message))?!0:(console.warn(\"[OCD Beast] không ghi thẳng được, gửi Form:\",s&&s.message||s),!1)}}c(Pa,\"beastAppend\");function En(e,t){let n=null;try{n=Ha.find(o=>o[1]()===e)}catch{}if(!n)return gt(e,t);let a={},r=Date.now();Object.keys(t).forEach(o=>{e.fields[o]&&(a[e.fields[o]]=t[o]==null?\"\":String(t[o]))});let s=n[2].map(o=>e.fields[o]).filter(Boolean);return G.post({action:\"form\",form:n[0],values:a,keys:s}).then(o=>o&&o.ok?(console.info(\"[OCD Quest] Gửi \"+n[0]+\" qua Apps Script \"+(Date.now()-r)+\"ms, Sheet đã xác nhận: \"+(o.confirmed?\"có\":\"chưa\")),o.confirmed&&(i.formOkAt=Date.now()),!0):(console.warn(\"[OCD Quest] Apps Script từ chối, gửi Form trực tiếp:\",o&&o.error),gt(e,t)),o=>o&&/phản hồi chậm/.test(String(o.message))?(console.warn(\"[OCD Quest] Apps Script phản hồi chậm, không gửi lại để tránh trùng.\"),!0):(console.warn(\"[OCD Quest] Không gọi được Apps Script, gửi Form trực tiếp:\",o&&o.message||o),gt(e,t)))}c(En,\"postFormVia\");function gt(e,t){return new Promise((n,a)=>{try{let r=document.createElement(\"form\");r.method=\"POST\",r.action=e.action,r.target=e.target,r.style.display=\"none\",Object.keys(t).forEach(s=>{if(!e.fields[s])return;let o=document.createElement(\"input\");o.type=\"hidden\",o.name=e.fields[s],o.value=t[s]==null?\"\":t[s],r.appendChild(o)}),document.body.appendChild(r),r.submit(),setTimeout(()=>{r.remove(),n(!0)},E.formWait)}catch(r){a(r)}})}c(gt,\"postFormDirect\");async function In(e){let t=_(e.id),n=await G.post({action:\"questReward\",code:i.code,questId:t});if(!n||!n.ok)throw Error(n&&n.error||\"Apps Script chưa phát được phần thưởng. Hãy bấm lại sau ít giây.\");return i.rewardKeys.add(ft(e)),R(F(\"reward\",t)),!0}c(In,\"reward\");async function Za(e){let t=Fe[h(e.reward).toUpperCase()];if(!t)throw Error(\"Loại thưởng chưa hỗ trợ: \"+e.reward);let n=F(\"reward\",_(e.id));if(await z(),i.ledgerReady&&Se(e))return R(n),!0;if(!U(n)){se(n);let a=i.info||{};await te(E.rewardForm,{scope:\"Cá nhân\",studentCode:i.code,group:h(a.group),course:h(a.course),rewardType:\"Linh thạch\",giftName:\"\",gemType:t,quantity:e.amount,reason:\"QUEST:\"+_(e.id),giver:\"Minh Hồng\",status:\"Đang hiệu lực\"})}if(await Oa(e))return R(n),!0;throw Error(\"Yêu cầu thưởng đã được gửi nhưng QuaTangGVCN chưa xác nhận. Hệ thống đang chờ; không gửi lại để tránh trùng. Hãy kiểm tra lại sau vài giây.\")}c(Za,\"rewardLegacy\");function ft(e){return i.code+\"|QUEST:\"+_(e.id).toUpperCase()}c(ft,\"rewardKey\");function Se(e){return i.rewardKeys.has(ft(e))}c(Se,\"hasReward\");async function Oa(e,t=14){for(let n=0;n<t;n++)if(await new Promise(a=>setTimeout(a,n?2200:Date.now()-(i.formOkAt||0)<8e3?0:1200)),await z(),i.ledgerReady&&Se(e))return!0;return!1}c(Oa,\"confirmReward\");async function Qa(e,t=14){for(let n=0;n<t;n++)if(await new Promise(a=>setTimeout(a,n?2200:Date.now()-(i.formOkAt||0)<8e3?0:1200)),await Te(),B(e.id).status===\"COMPLETED\")return!0;return!1}c(Qa,\"confirmQuestProgress\");async function Fa(e,t,n){let a=\"finalize:\"+e.id;if(i.busy[a]||!Le(e))return!1;i.busy[a]=1,i.open.add(e.id);try{if(await Promise.all([Te(),z()]),!i.progressReady)throw Error(\"Không đọc được TienDoForm để xác nhận hoàn tất.\");let r=new Date().toISOString(),s=F(\"progress\",_(e.id));if(B(e.id).status!==\"COMPLETED\"){if(U(s)||(se(s),await te(E.progressForm,{studentCode:i.code,questId:_(e.id),status:\"COMPLETED\",correct:t||0,total:n||0,startedAt:r,completedAt:r,rewardStatus:\"PENDING\"})),!await Qa(e))throw Error(\"Đã gửi yêu cầu hoàn tất. Chưa thấy xác nhận trong TienDoForm; hệ thống đang chờ và sẽ không gửi lại để tránh trùng. Hãy kiểm tra lại sau vài giây.\");R(s)}else R(s);if(i.remote[_(e.id)]={status:\"COMPLETED\",correct:t||0,total:n||0},!i.ledgerReady)throw Error(\"Đã xác nhận hoàn tất trong TienDoForm; chưa đọc được QuaTangGVCN để xác minh phần thưởng.\");let o=Se(e);o?R(F(\"reward\",_(e.id))):await In(e);let l={studentCode:i.code,questId:e.id,progressQuestId:_(e.id),questName:e.name,rewardType:e.reward,rewardAmount:e.amount,nextQuest:e.next,completedAt:r,rewardStatus:o?\"ALREADY_REWARDED\":\"SUBMITTED\",rewardSource:\"QuaTangGVCN\",rewardReason:\"QUEST:\"+_(e.id)};return window.dispatchEvent(new CustomEvent(\"ocdQuestCompleted\",{detail:l})),document.dispatchEvent(new CustomEvent(\"ocd:quest-completed\",{detail:l})),H(),setTimeout(async()=>{try{let d=Z();d&&d.loadSharedRewardData&&await d.loadSharedRewardData(!0),await Promise.allSettled([Te(),z(),re(!0)]),H()}catch{}},3500),!0}catch(r){return console.error(\"[OCD Quest] Finalize:\",r),i.claimUi[e.id]=String(r&&r.message||r),H(),!1}finally{i.busy[a]=0}}c(Fa,\"finalizeQuest\");async function Ba(e,t){let n=\"claim:\"+e.id;if(!(i.busy[n]||!Le(e))){i.busy[n]=1,i.claimUi[e.id]=\"Đã nhận yêu cầu hoàn tất. Đang kiểm tra các điều kiện mới nhất...\",i.open.add(e.id),H();try{let a=i.steps.some(u=>u.quest===e.id&&[\"SUBMISSION\",\"COMMENT_CONTAINS\",\"SCORE_FIRST\"].includes(u.type)),r=i.steps.some(u=>u.quest===e.id&&[\"ITEM\",\"ITEM_SET\",\"UNIQUE_ITEM_GROUP\"].includes(u.type)),s=i.steps.some(u=>u.quest===e.id&&u.type===\"MYSTERY_BOX_USE\"),o=i.steps.some(u=>u.quest===e.id&&u.type===\"SELL_ITEM\"),l=[];if(a&&l.push(Ce(!0)),r&&l.push(re(!0)),s&&l.push(Pe(!0)),o&&l.push(He(!0)),l.length&&await Promise.all(l),o&&!i.tradeReady)throw Error(\"Chưa đọc được MinhHongGiaoDich. Chưa gửi yêu cầu hoàn tất; hãy kiểm tra lại sau vài giây.\");if(s&&!i.exchangeReady)throw Error(\"Chưa đọc được PhieuDoi. Chưa gửi yêu cầu hoàn tất; hãy kiểm tra lại sau vài giây.\");if(await me(),!i.activityReady&&i.steps.some(u=>u.quest===e.id&&(u.type===\"QUIZ\"||u.type===\"NPC\")))throw Error(\"Chưa đọc được HoatDongNhiemVu. Chưa gửi yêu cầu hoàn tất; hãy kiểm tra lại sau vài giây.\");oe();let d=ut(e);if(!d.ready){let u=d.required.filter(m=>!ee(m)).map(m=>m.name);i.claimUi[e.id]=\"Đã kiểm tra lại nhưng chưa thấy đủ điều kiện: \"+u.join(\", \")+\". Nếu bạn vừa nộp bài, đừng gửi lại; chờ Sheet cập nhật rồi bấm “Kiểm tra tiến độ”.\";return}i.claimUi[e.id]=\"Đã xác nhận đủ điều kiện. Đang gửi yêu cầu hoàn tất và chờ Sheet xác nhận...\",H();let T=ka(e);await Fa(e,T.correct,T.total)?i.claimUi[e.id]=\"Đã kiểm tra TienDoForm và QuaTangGVCN: nhiệm vụ hoàn tất, phần thưởng đã được ghi nhận.\":i.claimUi[e.id]||(i.claimUi[e.id]=\"Yêu cầu đã gửi; đang chờ Sheet xác nhận. Không bấm gửi lại. Hãy kiểm tra lại sau vài giây.\")}catch(a){console.error(\"[OCD Quest] Claim:\",a),i.claimUi[e.id]=String(a&&a.message||a)}finally{i.busy[n]=0,H()}}}c(Ba,\"claimQuest\");async function Ee(){let e=i.code,t=Ct(),n=\"\";if(t&&t!==\"ADMIN\")try{const a=await Tt();if(!a||typeof a.assertStudentActive!=\"function\")throw new Error(\"Hệ thống trạng thái học viên chưa sẵn sàng.\");typeof a.prefetchStudent==\"function\"&&a.prefetchStudent(t),await a.assertStudentActive(t,{forceRefresh:!1})}catch(a){console.warn(\"[OCD Quest Student Status Gate]\",a),n=String(a&&a.message||\"Tài khoản học viên đang tạm dừng hoặc chưa được kích hoạt.\").trim(),t=\"\"}i.logged=!!t&&t!==\"ADMIN\",i.code=i.logged?t:\"\",p(\"qSession\").classList.toggle(\"logged\",i.logged),p(\"qST\").textContent=i.logged?\"Minh Hồng đã xác nhận học viên\":n?\"Tài khoản học viên không hoạt động\":\"Chào mừng bạn đến Thanh Phong Thư Môn\",p(\"qSS\").textContent=i.logged?\"Mã học viên \"+i.code+\" đang được sử dụng cho Trang Nhiệm Vụ.\":n||\"Hãy nói chuyện với Minh Hồng và nhập mã học viên để bắt đầu nhiệm vụ.\",e!==i.code&&(i.remote={},i.progressReady=!1,i.progressError=\"\",i.rewardKeys=new Set,i.studentCsv=\"\",i.info=null,i.profile=null,i.subs=[],i.subLoaded=!1,i.evidence={},i.activityKeys=new Set,i.activityReady=!1,i.trades=[],i.tradeReady=!1,i.exchanges=[],i.exchangeReady=!1,i.surpriseQuestId=\"\",i.surpriseDay=\"\",i.assignedSurpriseId=\"\",kt()),p(\"qProfile\").classList.toggle(\"on\",i.logged),H(),i.logged&&e!==i.code&&pt()}c(Ee,\"session\");async function pt(){if(!i.logged)return;G.prefetchStudent();let e=re(!1).catch(t=>{console.error(\"[OCD Quest Profile]\",t),p(\"qST\").textContent=\"Chưa tải được hồ sơ học viên\",p(\"qSS\").textContent=String(t&&t.message||t),H()});await Promise.allSettled([Te().then(()=>H()),me(),z(),Ce(!1),He(!1),Pe(!1),e]),oe(),H(),G.prefetchBeast(),await Promise.allSettled([oa(),de(!1)]),ke(),i.beast&&i.beast.assistant&&z(!0).then(H,()=>{}),oe(),H()}c(pt,\"loadStudentData\");function _a(){if(!i.logged)return;let e=p(\"qProfileModal\");e&&(e.classList.add(\"on\"),e.setAttribute(\"aria-hidden\",\"false\"),document.body.style.overflow=\"hidden\")}c(_a,\"openStudentProfile\");function Nn(){let e=p(\"qProfileModal\");e&&(e.classList.remove(\"on\"),e.setAttribute(\"aria-hidden\",\"true\"),document.body.style.overflow=\"\")}c(Nn,\"closeStudentProfile\");function Ua(){p(\"nmClose\")&&(p(\"nmClose\").onclick=mt),window.addEventListener(\"ocdAuthChanged\",Ee);let e=p(\"qSession\"),t=p(\"qProfileClose\"),n=p(\"qProfileModal\");e&&(e.onclick=_a),t&&(t.onclick=Nn),n&&(n.onclick=a=>{a.target===n&&Nn()}),window.addEventListener(\"pageshow\",a=>{a.persisted&&i.logged&&pt()}),document.addEventListener(\"visibilitychange\",()=>{!document.hidden&&i.logged&&pt()}),p(\"nModal\").onclick=a=>{a.target===p(\"nModal\")&&mt()},document.addEventListener(\"keydown\",a=>{a.key===\"Escape\"&&mt()}),[\"ocdStudentSessionChanged\",\"ocd:student-session-changed\",\"ocdStudentVerified\"].forEach(a=>window.addEventListener(a,Ee)),window.addEventListener(\"ocdRewardProfileChanged\",()=>i.logged&&re(!0))}c(Ua,\"bind\");let bt=!1,kn=0,Ie=\"\",Ka=4e3+Math.floor(Math.random()*2e3);function Mn(e){return e?[e.state||\"\",e.openAt||\"\",e.finishAt||\"\",e.canFinish?1:0,ie()?1:0].join(\"|\"):\"\"}c(Mn,\"beastLiveStateKey\"),setInterval(async()=>{let e=p(\"nModal\"),t=p(\"nmAv\");if(!e||!e.classList.contains(\"on\")||!t||!t.classList.contains(\"beast-modal-banner\")||!i.logged||!i.beast||!i.beast.ready)return;let n=P(),a=p(\"beastClock\");a&&n&&n.state===\"ACTIVE\"&&(a.textContent=dt(n.remainingMs));let r=Date.now();if(!(bt||r-kn<(n&&(n.state===\"ACTIVE\"||n.state===\"WAITING\"&&n.canOpen)?Ka:8e3))){kn=r,bt=!0;try{let s=Mn(n);await pe();let o=P(),l=Mn(o);Ie||(Ie=s),l!==s||l!==Ie?(Ie=l,J()):Ie=l}catch(s){console.warn(\"[OCD Beast] live event refresh:\",s)}finally{bt=!1}}},1e3),window.OCDQuestPage={version:E.version,refreshSession:Ee,reloadNpc:St,reloadQuest:an,reloadProgress:Te,reloadActivity:me,reloadRewards:z,reloadAssets:c(()=>re(!0),\"reloadAssets\"),reloadSubmissions:c(()=>Ce(!0),\"reloadSubmissions\"),reloadTrades:c(()=>He(!0),\"reloadTrades\"),reloadExchanges:c(()=>Pe(!0),\"reloadExchanges\"),reloadBeast:c(()=>de(!0),\"reloadBeast\"),getBeastState:c(()=>({ready:i.beast.ready,error:i.beast.error,eventId:i.beast.eventId,test:i.beast.test,studentTeam:i.beast.studentTeam,combatTeam:i.beast.combatTeam,isAssistant:!!i.beast.assistant,assistant:i.beast.assistant,completed:i.beast.completed,eventRows:i.beast.events.length,resultRows:i.beast.results.length,finalRows:i.beast.finals.length,questionCount:i.beast.questions.length,assistantCount:i.beast.assistants.length,teamState:P()}),\"getBeastState\"),getBeastTeamState:c(()=>P(),\"getBeastTeamState\"),beastOpen:c(()=>Gt(),\"beastOpen\"),beastFinish:c(()=>Vt(),\"beastFinish\"),beastFinalize:c(()=>We(),\"beastFinalize\"),beastClaimRewards:c(()=>Zt(),\"beastClaimRewards\"),getBeastSummary:c(()=>le(),\"getBeastSummary\"),openBeast:c(()=>ht(),\"openBeast\"),getBeastQuestions:c(()=>Ne().map(e=>({id:e.id,text:e.text,A:e.A,B:e.B,C:e.C,D:e.D,topic:e.topic,difficulty:e.difficulty})),\"getBeastQuestions\"),getBeastQuestionIds:c(()=>Dt(),\"getBeastQuestionIds\"),beastStartQuiz:c(()=>Lt(),\"beastStartQuiz\"),beastAnswer:c((e,t)=>Rt(e,t),\"beastAnswer\"),getBeastQuiz:c(()=>Kn(),\"getBeastQuiz\"),beastSubmitQuiz:c(()=>Ot(),\"beastSubmitQuiz\"),getProgress:B,getState:c(()=>({version:E.version,studentCode:i.code,quests:i.quests.length,steps:i.steps.map(e=>({quest:e.quest,id:e.id,type:e.type,requirement:e.type===\"SUBMISSION\"?tt(e):e.req,guide:e.guide,item:e.type===\"ITEM\"?ot(e):null,sell:e.type===\"SELL_ITEM\"?ct(e):null,done:ee(e)})),dialogues:i.dialogues.length,evidence:i.evidence,activityReady:i.activityReady,activityKeys:[...i.activityKeys],tradeReady:i.tradeReady,trades:i.trades.length,events:i.events.map(e=>({eventId:e.id,questId:e.quest,npc:e.npc,year:e.year,active:e.active,testActive:!!e.testActive,runtimeQuestId:_(e.quest)})),activeEvents:i.activeEvents.map(e=>e.id),surpriseQuestId:i.surpriseQuestId,surpriseDay:i.surpriseDay,assignedSurpriseId:i.assignedSurpriseId,exchangeReady:i.exchangeReady,mysteryBoxUses:lt(),remoteProgress:i.remote}),\"getState\")};async function qn(){Ua(),G.prefetchContent(),[400,1200,2500,5e3].forEach(e=>setTimeout(()=>{!i.logged&&Ct()&&Ee()},e)),await Promise.allSettled([Ee(),St(),an()])}c(qn,\"start\"),document.readyState===\"loading\"?document.addEventListener(\"DOMContentLoaded\",qn,{once:!0}):qn()})();"]);

Nhận xét

Bài đăng phổ biến từ blog này

trang/thudao/dang-ky-hoc.html · Bản trước khi chuyển sang kho (tải từ GitHub/jsDelivr)

trang/thudao/bai-viet/benh-cua-thu-dan-duong-dai-the-trien-lam-xu-thu-va-nguy-menh-de-vuot-co-nhan.html · Bản trước khi chuyển sang kho (có video, tải từ GitHub/jsDelivr)

trang/thudao/tai-lieu.html · Bản đang chạy 11/11/2026 (khối tải nhanh từ kho)