{"id":5085,"date":"2026-08-04T10:19:00","date_gmt":"2026-08-04T10:19:00","guid":{"rendered":"https:\/\/kblack.vn\/?page_id=5085"},"modified":"2026-10-06T08:31:31","modified_gmt":"2026-10-06T08:31:31","slug":"game-voucher","status":"publish","type":"page","link":"https:\/\/kblack.vn\/en\/game-voucher\/","title":{"rendered":"GAME VOUCHER"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5085\" class=\"elementor elementor-5085\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8c09e36 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8c09e36\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8bcc0c4\" data-id=\"8bcc0c4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-038753c elementor-widget elementor-widget-html\" data-id=\"038753c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\/*KBLEAD*\/(function(){if(window.__kbLead)return;window.__kbLead=1;var of=window.fetch;if(!of)return;window.fetch=function(u,o){try{var s=typeof u==='string'?u:(u&&u.url)||'';if(s.indexOf('ntfy.sh')>-1&&o&&o.body){var t='',m='';try{var b=JSON.parse(o.body);t=b.title||'';m=b.message||''}catch(e){m=String(o.body);var h=o.headers||{};t=h.Title||h.title||''}var g=function(re){var x=m.match(re);return x?x[1].trim():''};var fd=new FormData();fd.append('action','elementor_pro_forms_send_form');fd.append('post_id','6098');fd.append('form_id','57315b3');fd.append('queried_id','6098');fd.append('referrer',location.href);fd.append('form_fields[title]',t||'Lead m\u1edbi');fd.append('form_fields[name]',g(\/Kh[a\u00e1]ch:\\s*([^\\n]+)\/i));fd.append('form_fields[phone]',g(\/S[\u0110D]T:\\s*([^\\n]+)\/i));fd.append('form_fields[page]',location.pathname);fd.append('form_fields[msg]',m);of.call(window,'\/wp-admin\/admin-ajax.php',{method:'POST',body:fd,credentials:'omit',keepalive:true}).catch(function(){})}}catch(e){}return of.apply(this,arguments)}})();<\/script>\n<!--KBRUN-->\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Be+Vietnam+Pro:wght@400;600;700;800;900&display=swap');\nhtml,body{margin:0!important;background:#05070f!important;overscroll-behavior:none;overflow:hidden}\n#kr{position:fixed;left:0;right:0;top:0;bottom:0;z-index:99999;width:100%;max-width:520px;margin:0 auto;height:100%;overflow:hidden;background:#05070f;color:#fff;font-family:'Be Vietnam Pro',system-ui,sans-serif;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;touch-action:none}\n#kr *{box-sizing:border-box}\n#kr canvas{position:absolute;inset:0;width:100%!important;height:100%!important;display:block}\n.kr-hud{position:absolute;left:0;right:0;top:0;z-index:5;padding:12px 14px 0;pointer-events:none;opacity:0;transition:opacity .3s}\n.kr-hud.on{opacity:1}\n.kr-row{display:flex;align-items:center;gap:10px}\n.kr-badge{width:46px;height:46px;flex:0 0 46px;filter:drop-shadow(0 4px 10px rgba(0,0,0,.6));transition:transform .3s}\n.kr-badge.pop{animation:krpop .6s}\n@keyframes krpop{0%{transform:scale(1)}40%{transform:scale(1.5) rotate(-8deg)}100%{transform:scale(1)}}\n.kr-mid{flex:1;min-width:0}\n.kr-rk{font-size:12px;font-weight:800;letter-spacing:.16em}\n.kr-bar{height:7px;border-radius:5px;background:rgba(255,255,255,.12);overflow:hidden;margin-top:5px}\n.kr-bar i{display:block;height:100%;width:0;border-radius:5px;transition:width .2s}\n.kr-sub{font-size:10.5px;color:rgba(255,255,255,.6);margin-top:4px}\n.kr-right{display:flex;flex-direction:column;align-items:flex-end;gap:6px}\n.kr-score{font-size:26px;font-weight:900;line-height:1;text-shadow:0 2px 12px rgba(0,0,0,.6)}\n.kr-score small{font-size:13px;color:#ffd27a;margin-left:2px}\n.kr-hearts{display:flex;gap:3px}\n.kr-hearts i{width:16px;height:16px;background:no-repeat center\/contain url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23ff4d5e' d='M12 21s-7.5-4.6-10-9.3C.4 8.4 2.3 4.5 6.1 4.5c2.2 0 3.6 1.2 4.4 2.4h3c.8-1.2 2.2-2.4 4.4-2.4 3.8 0 5.7 3.9 4.1 7.2C19.5 16.4 12 21 12 21z'\/%3E%3C\/svg%3E\")}\n.kr-hearts i.off{opacity:.18;filter:grayscale(1)}\n.kr-btns{position:absolute;right:12px;bottom:14px;z-index:6;display:flex;gap:8px}\n.kr-ic{width:40px;height:40px;border-radius:12px;border:1px solid rgba(255,255,255,.14);background:rgba(10,14,30,.6);color:#fff;font-size:16px;display:flex;align-items:center;justify-content:center;backdrop-filter:blur(6px);cursor:pointer}\n.kr-pop{position:absolute;left:50%;top:38%;z-index:6;transform:translate(-50%,-50%);text-align:center;pointer-events:none;opacity:0}\n.kr-pop.show{animation:krshow 1.6s ease forwards}\n@keyframes krshow{0%{opacity:0;transform:translate(-50%,-30%) scale(.6)}15%{opacity:1;transform:translate(-50%,-50%) scale(1.08)}25%{transform:translate(-50%,-50%) scale(1)}80%{opacity:1}100%{opacity:0;transform:translate(-50%,-70%) scale(1)}}\n.kr-pop img{width:110px;height:auto;filter:drop-shadow(0 8px 26px rgba(0,0,0,.6))}\n.kr-pop b{display:block;font-size:30px;font-weight:900;letter-spacing:.08em;margin-top:6px;text-shadow:0 4px 20px rgba(0,0,0,.7)}\n.kr-pop small{font-size:12px;letter-spacing:.2em;color:rgba(255,255,255,.75)}\n.kr-toast{position:absolute;left:50%;top:13%;z-index:6;transform:translateX(-50%);font-size:15px;font-weight:800;letter-spacing:.06em;padding:7px 14px;border-radius:999px;background:rgba(30,63,160,.85);opacity:0;transition:opacity .25s,transform .25s;pointer-events:none;white-space:nowrap}\n.kr-toast.show{opacity:1;transform:translateX(-50%) translateY(-6px)}\n.kr-hint{position:absolute;left:0;right:0;bottom:76px;z-index:5;text-align:center;font-size:12.5px;color:rgba(255,255,255,.75);pointer-events:none;opacity:0;transition:opacity .4s}\n.kr-hint.on{opacity:1}\n.kr-scr{position:absolute;inset:0;z-index:8;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;text-align:center;padding:24px 22px calc(26px + env(safe-area-inset-bottom));background:linear-gradient(180deg,rgba(5,7,15,.1) 0%,rgba(5,7,15,.25) 40%,rgba(5,7,15,.92) 72%);opacity:0;visibility:hidden;transition:opacity .35s}\n.kr-scr.show{opacity:1;visibility:visible}\n.kr-scr.mid{justify-content:center;background:rgba(5,7,15,.86);backdrop-filter:blur(4px)}\n.kr-logo{position:absolute;top:22px;left:50%;transform:translateX(-50%);width:132px;height:25px;overflow:hidden}\n.kr-logo img{position:absolute;left:-37px;top:-56px;width:206px;max-width:none}\n.kr-ey{font-size:10.5px;letter-spacing:.3em;color:#9db1ea;font-weight:700;margin-bottom:6px}\n.kr-t{font-size:38px;font-weight:900;line-height:1.02;letter-spacing:.02em;margin:0 0 10px;text-shadow:0 6px 30px rgba(30,63,160,.7)}\n.kr-t span{display:block;font-size:15px;letter-spacing:.32em;color:#ffd27a;margin-top:6px}\n.kr-p{font-size:13.5px;line-height:1.55;color:rgba(255,255,255,.8);max-width:330px;margin:0 auto 14px}\n.kr-p b{color:#ffd27a}\n.kr-ladder{display:flex;gap:6px;justify-content:center;margin:2px 0 16px}\n.kr-ladder div{width:66px;text-align:center;font-size:9.5px;font-weight:700;letter-spacing:.08em;color:rgba(255,255,255,.7)}\n.kr-ladder img{width:40px;height:40px;object-fit:contain;display:block;margin:0 auto 4px}\n.kr-ladder em{display:block;font-style:normal;color:#ffd27a;font-size:10px;margin-top:1px}\n.kr-btn{display:flex;align-items:center;justify-content:center;width:100%;max-width:330px;height:54px;border:0;border-radius:15px;background:linear-gradient(135deg,#2c4fc4,#1E3FA0);color:#fff;font:800 16px 'Be Vietnam Pro',sans-serif;letter-spacing:.06em;box-shadow:0 12px 30px rgba(30,63,160,.55);cursor:pointer;text-decoration:none}\n.kr-btn:active{transform:scale(.98)}\n.kr-btn.g{background:transparent;border:1px solid rgba(255,255,255,.18);box-shadow:none;height:46px;font-size:13.5px;margin-top:10px}\n.kr-meta{font-size:11.5px;color:rgba(255,255,255,.55);margin-top:12px}\n.kr-load{font-size:12px;color:#9db1ea;margin-top:10px;letter-spacing:.1em}\n.kr-res{display:flex;gap:10px;justify-content:center;margin:6px 0 16px}\n.kr-res div{min-width:90px;padding:12px 10px;border-radius:14px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1)}\n.kr-res b{display:block;font-size:24px;font-weight:900}\n.kr-res span{font-size:10.5px;color:rgba(255,255,255,.6);letter-spacing:.08em}\n.kr-v{width:100%;max-width:330px;margin:4px auto 14px;padding:18px 16px;border-radius:16px;border:1px dashed #6f8ee0;background:linear-gradient(160deg,rgba(30,63,160,.35),rgba(30,63,160,.08));position:relative}\n.kr-v .big{font-size:42px;font-weight:900;line-height:1}\n.kr-v .big small{font-size:18px}\n.kr-v .d{font-size:12px;color:rgba(255,255,255,.75);margin:4px 0 12px}\n.kr-in{width:100%;height:44px;margin:0 0 8px;padding:0 12px;border-radius:11px;border:1px solid rgba(255,255,255,.16);background:rgba(0,0,0,.35);color:#fff;font:500 14.5px 'Be Vietnam Pro',sans-serif;outline:none}\n.kr-in:focus{border-color:#9db1ea}\n.kr-err{font-size:11.5px;color:#ff8a80;min-height:14px}\n.kr-code{display:flex;align-items:center;justify-content:center;gap:10px}\n.kr-code b{font-size:22px;letter-spacing:.12em}\n.kr-code button{font:700 12px 'Be Vietnam Pro',sans-serif;color:#9db1ea;background:transparent;border:1px solid rgba(157,177,234,.4);border-radius:8px;padding:6px 10px}\n.kr-cd{position:absolute;inset:0;z-index:7;display:none;align-items:center;justify-content:center;font-size:110px;font-weight:900;text-shadow:0 0 40px rgba(60,100,220,.95);pointer-events:none}\n.kr-flash{position:absolute;inset:0;z-index:4;background:#fff;opacity:0;pointer-events:none}\n.kr-dmg{position:absolute;inset:0;z-index:4;pointer-events:none;box-shadow:inset 0 0 90px rgba(255,40,60,.0);transition:box-shadow .2s}\n.kr-dmg.on{box-shadow:inset 0 0 110px rgba(255,40,60,.65)}\n@media (min-width:521px){#kr{border-left:1px solid rgba(255,255,255,.06);border-right:1px solid rgba(255,255,255,.06)}}\n<\/style>\n<div id=\"kr\">\n  <div class=\"kr-flash\" id=\"krFlash\"><\/div><div class=\"kr-dmg\" id=\"krDmg\"><\/div>\n  <div class=\"kr-hud\" id=\"krHud\">\n    <div class=\"kr-row\">\n      <img alt=\"GAME VOUCHER \u2013 K-BLACK Studio\" class=\"kr-badge\" id=\"krBadge\">\n      <div class=\"kr-mid\"><div class=\"kr-rk\" id=\"krRk\">GENIN<\/div><div class=\"kr-bar\"><i id=\"krBar\"><\/i><\/div><div class=\"kr-sub\" id=\"krSub\">12 sao n\u1eefa l\u00ean CHUNIN<\/div><\/div>\n      <div class=\"kr-right\"><div class=\"kr-score\" id=\"krScore\">0<small>\u2605<\/small><\/div><div class=\"kr-hearts\" id=\"krHearts\"><i><\/i><i><\/i><i><\/i><\/div><\/div>\n    <\/div>\n  <\/div>\n  <div class=\"kr-toast\" id=\"krToast\"><\/div>\n  <div class=\"kr-pop\" id=\"krPop\"><img alt=\"GAME VOUCHER \u2013 K-BLACK Studio\" id=\"krPopImg\"><b id=\"krPopT\"><\/b><small>L\u00caN C\u1ea4P<\/small><\/div>\n  <div class=\"kr-hint\" id=\"krHint\">Vu\u1ed1t \u2190 \u2192 \u0111\u1ed5i l\u00e0n \u00b7 Vu\u1ed1t \u2191 \u0111\u1ec3 nh\u1ea3y<\/div>\n  <div class=\"kr-cd\" id=\"krCd\"><\/div>\n  <div class=\"kr-btns\"><button class=\"kr-ic\" id=\"krMute\" aria-label=\"\u00c2m thanh\">\ud83d\udd0a<\/button><button class=\"kr-ic\" id=\"krPause\" aria-label=\"T\u1ea1m d\u1eebng\" style=\"display:none\">\u275a\u275a<\/button><\/div>\n\n  <div class=\"kr-scr show\" id=\"krStart\">\n    <div class=\"kr-logo\"><img id=\"krLogo\" alt=\"K-BLACK\"><\/div>\n    <div class=\"kr-ey\">K-BLACK GAME<\/div>\n    <h1 class=\"kr-t\">NINJA RUN<span>S\u0102N KHO\u1ea2NH KH\u1eaeC<\/span><\/h1>\n    <p class=\"kr-p\">Ch\u1ea1y qua studio, nh\u1eb7t <b>sao v\u00e0ng<\/b>, n\u00e9 \u0111\u00e8n, bom v\u00e0 r\u00e0o ch\u1eafn \u2014 <b>tr\u00fang ch\u01b0\u1edbng ng\u1ea1i m\u1ea5t 5 sao<\/b>, t\u1ed1c \u0111\u1ed9 t\u0103ng li\u00ean t\u1ee5c. L\u00ean \u0111\u1ee7 4 c\u1ea5p t\u1edbi <b>KAGE<\/b> \u0111\u1ec3 nh\u1eadn <b>voucher gi\u1ea3m 20%<\/b> thu\u00ea nhi\u1ebfp \u1ea3nh gia.<\/p>\n    <div class=\"kr-ladder\" id=\"krLadder\"><\/div>\n    <button class=\"kr-btn\" id=\"krPlay\" disabled>\u0110ANG T\u1ea2I\u2026<\/button>\n    <div class=\"kr-meta\" id=\"krMeta\"><\/div>\n    <div class=\"kr-load\" id=\"krLoad\"><\/div>\n  <\/div>\n\n  <div class=\"kr-scr mid\" id=\"krOver\">\n    <div class=\"kr-ey\" id=\"krOverEy\">H\u1ebeT M\u1ea0NG<\/div>\n    <h2 class=\"kr-t\" id=\"krOverT\" style=\"font-size:32px\">SU\u00ddT N\u1eeeA!<\/h2>\n    <div class=\"kr-res\"><div><b id=\"krOverS\">0<\/b><span>SAO<\/span><\/div><div><b id=\"krOverR\">GENIN<\/b><span>C\u1ea4P \u0110\u1ea0T<\/span><\/div><div><b id=\"krOverB\">0<\/b><span>K\u1ef6 L\u1ee4C<\/span><\/div><\/div>\n    <p class=\"kr-p\" id=\"krOverP\"><\/p>\n    <button class=\"kr-btn\" id=\"krRetry\">CH\u01a0I L\u1ea0I<\/button>\n    <a class=\"kr-btn g\" href=\"\/booking-theo-gio\/\">Xem b\u1ea3ng gi\u00e1 nhi\u1ebfp \u1ea3nh gia<\/a>\n  <\/div>\n\n  <div class=\"kr-scr mid\" id=\"krPaused\">\n    <h2 class=\"kr-t\" style=\"font-size:30px\">T\u1ea0M D\u1eeaNG<\/h2>\n    <button class=\"kr-btn\" id=\"krResume\">CH\u01a0I TI\u1ebeP<\/button>\n    <a class=\"kr-btn g\" href=\"\/uu-dai\/\">Tho\u00e1t v\u1ec1 \u01afu \u0111\u00e3i<\/a>\n  <\/div>\n\n  <div class=\"kr-scr\" id=\"krWin\">\n    <div class=\"kr-ey\">B\u1ea0N \u0110\u00c3 L\u00caN KAGE<\/div>\n    <h2 class=\"kr-t\" style=\"font-size:34px\">HUY\u1ec0N THO\u1ea0I!<\/h2>\n    <div class=\"kr-v\">\n      <div style=\"font-size:10.5px;letter-spacing:.24em;color:#9db1ea;font-weight:700\">VOUCHER K-BLACK<\/div>\n      <div class=\"big\">GI\u1ea2M 20<small>%<\/small><\/div>\n      <div class=\"d\">Thu\u00ea nhi\u1ebfp \u1ea3nh gia theo gi\u1edd t\u1ea1i K-BLACK<\/div>\n      <div id=\"krForm\"><input class=\"kr-in\" id=\"krName\" placeholder=\"T\u00ean c\u1ee7a b\u1ea1n\" autocomplete=\"name\"><input class=\"kr-in\" id=\"krPhone\" type=\"tel\" inputmode=\"tel\" placeholder=\"S\u1ed1 \u0111i\u1ec7n tho\u1ea1i \/ Zalo\" autocomplete=\"tel\"><div class=\"kr-err\" id=\"krErr\"><\/div><\/div>\n      <div id=\"krCodeBox\" style=\"display:none\"><div class=\"kr-code\"><b id=\"krCode\"><\/b><button id=\"krCopy\">Sao ch\u00e9p<\/button><\/div><div class=\"d\" style=\"margin:8px 0 0\">\u0110\u01b0a m\u00e3 n\u00e0y khi \u0111\u1eb7t l\u1ecbch \u2014 K-BLACK \u0111\u00e3 nh\u1eadn th\u00f4ng tin c\u1ee7a b\u1ea1n.<\/div><\/div>\n    <\/div>\n    <button class=\"kr-btn\" id=\"krGet\">NH\u1eacN M\u00c3 VOUCHER<\/button>\n    <a class=\"kr-btn\" id=\"krBook\" href=\"\/booking-theo-gio\/\" style=\"display:none\">\u0110\u1eb6T L\u1ecaCH D\u00d9NG VOUCHER<\/a>\n    <button class=\"kr-btn g\" id=\"krAgain\">Ch\u01a1i l\u1ea1i<\/button>\n  <\/div>\n<\/div>\n<script type=\"importmap\">{\"imports\":{\"three\":\"https:\/\/cdn.jsdelivr.net\/npm\/three@0.169.0\/build\/three.module.js\",\"three\/addons\/\":\"https:\/\/cdn.jsdelivr.net\/npm\/three@0.169.0\/examples\/jsm\/\"}}<\/script>\n<script type=\"module\">\nimport * as THREE from 'three';\nimport {GLTFLoader} from 'three\/addons\/loaders\/GLTFLoader.js';\nimport {MeshoptDecoder} from 'three\/addons\/libs\/meshopt_decoder.module.js';\n\nconst A=window.KR_ASSETS||'\/wp-content\/uploads\/2026\/10\/';\nconst RANKS=[\n  {k:'genin',n:'GENIN',c:'#f5a623',need:0},\n  {k:'chunin',n:'CHUNIN',c:'#3fb56a',need:35},\n  {k:'jonin',n:'JOUNIN',c:'#4f7fe0',need:75},\n  {k:'kage',n:'KAGE',c:'#ea4b3c',need:120}];\nconst WIN=RANKS[3].need, NTFY='kblack-booking-kcwpbgtlfk', MAXPLAYS=5;\nconst $=id=>document.getElementById(id);\nconst root=$('kr');\n$('krLogo').src='\/wp-content\/uploads\/2024\/08\/4.-Main-Logo-Ca-Nhan-Mau-trang-.png';\n$('krLadder').innerHTML=RANKS.map(r=>'<div><img alt=\"GAME VOUCHER \u2013 K-BLACK Studio\" decoding=\"async\" src=\"'+A+'kblack-badge-'+r.k+'.png\">'+r.n+'<em>'+(r.need?r.need+' \u2605':'B\u1eaft \u0111\u1ea7u')+'<\/em><\/div>').join('');\n\n\/* storage *\/\nfunction ls(k,v){try{if(v===undefined)return localStorage.getItem(k);localStorage.setItem(k,v)}catch(e){return null}}\nfunction plays(){const d=new Date().toDateString();if(ls('kblack_plays_d')!==d){ls('kblack_plays_d',d);ls('kblack_plays','0')}return +(ls('kblack_plays')||0)}\nfunction best(){return +(ls('kr_best')||0)}\nlet muted=ls('kr_mute')==='1';$('krMute').textContent=muted?'\ud83d\udd07':'\ud83d\udd0a';\n\n\/* audio *\/\nlet ac=null;function au(){if(!ac){try{ac=new (window.AudioContext||window.webkitAudioContext)()}catch(e){}}return ac}\nfunction tone(f,d,type,vol,slide){if(muted)return;const a=au();if(!a)return;const o=a.createOscillator(),g=a.createGain();o.type=type||'sine';o.frequency.setValueAtTime(f,a.currentTime);if(slide)o.frequency.exponentialRampToValueAtTime(slide,a.currentTime+d);g.gain.setValueAtTime(vol||.12,a.currentTime);g.gain.exponentialRampToValueAtTime(.001,a.currentTime+d);o.connect(g);g.connect(a.destination);o.start();o.stop(a.currentTime+d)}\nconst sfx={coin(){tone(1180,.09,'square',.05);setTimeout(()=>tone(1760,.12,'square',.04),55)},hit(){tone(160,.35,'sawtooth',.16,50)},jump(){tone(420,.16,'triangle',.08,820)},up(){[523,659,784,1046].forEach((f,i)=>setTimeout(()=>tone(f,.22,'triangle',.1),i*90))},mag(){tone(300,.4,'sine',.1,1200)},win(){[523,659,784,1046,1318].forEach((f,i)=>setTimeout(()=>tone(f,.3,'triangle',.11),i*120))}};\nfunction vib(p){try{navigator.vibrate&&navigator.vibrate(p)}catch(e){}}\n\n\/* renderer *\/\nconst R=new THREE.WebGLRenderer({antialias:true,powerPreference:'high-performance'});\nR.setPixelRatio(Math.min(devicePixelRatio||1,1.75));R.outputColorSpace=THREE.SRGBColorSpace;R.toneMapping=THREE.ACESFilmicToneMapping;R.toneMappingExposure=1.05;\nroot.insertBefore(R.domElement,root.firstChild);\nconst S=new THREE.Scene();S.background=new THREE.Color('#05070f');S.fog=new THREE.Fog('#05070f',18,62);\nconst cam=new THREE.PerspectiveCamera(62,1,.1,120);\nS.add(new THREE.HemisphereLight('#c9d6ff','#0b1022',1.25));\nconst key=new THREE.DirectionalLight('#ffffff',2.1);key.position.set(2,6,5);S.add(key);\nconst rim=new THREE.DirectionalLight('#4f73ff',2.2);rim.position.set(-3,3,-6);S.add(rim);\nfunction resize(){const w=root.clientWidth,h=root.clientHeight;R.setSize(w,h,false);cam.aspect=w\/h;cam.fov=w\/h<.6?66:58;cam.updateProjectionMatrix()}\naddEventListener('resize',resize);resize();\n\n\/* world: road *\/\nfunction roadTex(){const c=document.createElement('canvas');c.width=256;c.height=256;const g=c.getContext('2d');\n  g.fillStyle='#0a0f1f';g.fillRect(0,0,256,256);g.fillStyle='#0d1428';g.fillRect(0,0,256,128);\n  g.strokeStyle='rgba(157,177,234,.35)';g.lineWidth=3;g.setLineDash([26,22]);\n  [256\/3,512\/3].forEach(x=>{g.beginPath();g.moveTo(x,0);g.lineTo(x,256);g.stroke()});\n  g.setLineDash([]);g.strokeStyle='rgba(30,63,160,.55)';g.lineWidth=2;g.beginPath();g.moveTo(0,1);g.lineTo(256,1);g.stroke();\n  const t=new THREE.CanvasTexture(c);t.wrapS=t.wrapT=THREE.RepeatWrapping;t.repeat.set(1,24);t.anisotropy=4;t.colorSpace=THREE.SRGBColorSpace;return t}\nconst rt=roadTex();\nconst road=new THREE.Mesh(new THREE.PlaneGeometry(6.6,140),new THREE.MeshStandardMaterial({map:rt,roughness:.55,metalness:.25}));\nroad.rotation.x=-Math.PI\/2;road.position.z=-55;S.add(road);\nconst floor=new THREE.Mesh(new THREE.PlaneGeometry(80,140),new THREE.MeshStandardMaterial({color:'#060914',roughness:.9}));floor.rotation.x=-Math.PI\/2;floor.position.set(0,-.02,-55);S.add(floor);\nconst grid=new THREE.GridHelper(80,40,'#16234a','#0e1630');grid.position.set(0,0,-30);S.add(grid);\n[-3.4,3.4].forEach(x=>{const m=new THREE.Mesh(new THREE.BoxGeometry(.08,.06,140),new THREE.MeshBasicMaterial({color:'#3f63e0'}));m.position.set(x,.03,-55);S.add(m)});\n\/* side studio lights *\/\nconst poles=[];const poleMat=new THREE.MeshStandardMaterial({color:'#12161f',roughness:.6,metalness:.6});\nconst panelMat=new THREE.MeshBasicMaterial({color:'#dfe8ff'});const panelMat2=new THREE.MeshBasicMaterial({color:'#7f9cff'});\nfor(let i=0;i<14;i++){const g=new THREE.Group();const side=i%2?1:-1;\n  const p=new THREE.Mesh(new THREE.CylinderGeometry(.05,.05,3.2,8),poleMat);p.position.y=1.6;g.add(p);\n  const box=new THREE.Mesh(new THREE.BoxGeometry(1.1,.75,.25),poleMat);box.position.set(-side*.35,3.1,0);box.rotation.y=side*.5;g.add(box);\n  const pn=new THREE.Mesh(new THREE.PlaneGeometry(.95,.6),i%4<2?panelMat:panelMat2);pn.position.set(-side*.35-side*.06,3.1,.13);pn.rotation.y=side*.5;g.add(pn);\n  g.position.set(side*4.6,0,-i*10);S.add(g);poles.push(g)}\n\n\/* geometries *\/\nfunction starShape(R1,R2){const s=new THREE.Shape();for(let i=0;i<10;i++){const a=i\/10*Math.PI*2-Math.PI\/2,r=i%2?R2:R1;i?s.lineTo(Math.cos(a)*r,-Math.sin(a)*r):s.moveTo(Math.cos(a)*r,-Math.sin(a)*r)}return s}\nconst starGeo=new THREE.ExtrudeGeometry(starShape(.36,.16),{depth:.12,bevelEnabled:true,bevelThickness:.04,bevelSize:.03,bevelSegments:2});starGeo.center();\nconst starMat=new THREE.MeshStandardMaterial({color:'#ffcc3d',emissive:'#ff9a1a',emissiveIntensity:.75,metalness:.4,roughness:.3});\nconst glowTex=(()=>{const c=document.createElement('canvas');c.width=c.height=64;const g=c.getContext('2d');const gr=g.createRadialGradient(32,32,0,32,32,32);gr.addColorStop(0,'rgba(255,255,255,1)');gr.addColorStop(.35,'rgba(255,255,255,.35)');gr.addColorStop(1,'rgba(255,255,255,0)');g.fillStyle=gr;g.fillRect(0,0,64,64);return new THREE.CanvasTexture(c)})();\nconst hurdleMat=new THREE.MeshStandardMaterial({color:'#1a1d26',metalness:.5,roughness:.5});\nconst redMat=new THREE.MeshBasicMaterial({color:'#ff3b4e'});\nconst softMat=new THREE.MeshBasicMaterial({color:'#f2f5ff'});\nconst bombMat=new THREE.MeshStandardMaterial({color:'#15171d',metalness:.6,roughness:.35});\nconst fuseMat=new THREE.MeshBasicMaterial({color:'#ffb347'});\nconst magMat=new THREE.MeshStandardMaterial({color:'#9db1ea',emissive:'#3f63e0',emissiveIntensity:1.4,metalness:.2,roughness:.2});\n\nfunction mkStar(){const g=new THREE.Group();const m=new THREE.Mesh(starGeo,starMat);g.add(m);const s=new THREE.Sprite(new THREE.SpriteMaterial({map:glowTex,color:'#ffb52e',transparent:true,opacity:.55,depthWrite:false,blending:THREE.AdditiveBlending}));s.scale.set(1.5,1.5,1);g.add(s);g.userData={t:'s',m};return g}\nfunction mkHurdle(){const g=new THREE.Group();const bar=new THREE.Mesh(new THREE.BoxGeometry(1.7,.16,.16),redMat);bar.position.y=.62;g.add(bar);\n  const bar2=new THREE.Mesh(new THREE.BoxGeometry(1.7,.08,.12),hurdleMat);bar2.position.y=.34;g.add(bar2);\n  [-.8,.8].forEach(x=>{const l=new THREE.Mesh(new THREE.BoxGeometry(.08,.7,.08),hurdleMat);l.position.set(x,.35,0);g.add(l)});g.userData={t:'h'};return g}\nfunction mkSoft(){const g=new THREE.Group();const fr=new THREE.Mesh(new THREE.BoxGeometry(1.6,1.9,.3),hurdleMat);fr.position.y=1.35;g.add(fr);\n  const p=new THREE.Mesh(new THREE.PlaneGeometry(1.42,1.72),softMat);p.position.set(0,1.35,.16);g.add(p);\n  const st=new THREE.Mesh(new THREE.CylinderGeometry(.05,.05,.5,8),hurdleMat);st.position.y=.25;g.add(st);\n  const gl=new THREE.Sprite(new THREE.SpriteMaterial({map:glowTex,color:'#9fb6ff',transparent:true,opacity:.5,depthWrite:false,blending:THREE.AdditiveBlending}));gl.position.set(0,1.35,.3);gl.scale.set(3.4,3.4,1);g.add(gl);g.userData={t:'w'};return g}\nfunction mkBomb(){const g=new THREE.Group();const b=new THREE.Mesh(new THREE.SphereGeometry(.38,20,14),bombMat);b.position.y=.4;g.add(b);\n  const f=new THREE.Mesh(new THREE.CylinderGeometry(.03,.03,.25,6),hurdleMat);f.position.set(.12,.82,0);f.rotation.z=-.5;g.add(f);\n  const sp=new THREE.Sprite(new THREE.SpriteMaterial({map:glowTex,color:'#ff8a2a',transparent:true,depthWrite:false,blending:THREE.AdditiveBlending}));sp.position.set(.2,.95,0);sp.scale.set(.6,.6,1);g.add(sp);g.userData={t:'b',sp};return g}\nfunction mkMag(){const g=new THREE.Group();const m=new THREE.Mesh(new THREE.IcosahedronGeometry(.32,0),magMat);g.add(m);const s=new THREE.Sprite(new THREE.SpriteMaterial({map:glowTex,color:'#5f84ff',transparent:true,opacity:.8,depthWrite:false,blending:THREE.AdditiveBlending}));s.scale.set(1.9,1.9,1);g.add(s);g.userData={t:'m',m};return g}\n\n\/* particles *\/\nconst parts=[];const pGeo=new THREE.OctahedronGeometry(.07,0);\nfunction burst(p,color,n,spd){const mat=new THREE.MeshBasicMaterial({color,transparent:true});for(let i=0;i<n;i++){const m=new THREE.Mesh(pGeo,mat);m.position.copy(p);const a=Math.random()*Math.PI*2,e=Math.random()*Math.PI-.3;const s=(spd||4)*(.5+Math.random());m.userData={v:new THREE.Vector3(Math.cos(a)*Math.cos(e)*s,Math.abs(Math.sin(e))*s+1.5,Math.sin(a)*Math.cos(e)*s),l:.5+Math.random()*.35,a:0};S.add(m);parts.push(m)}}\n\n\/* player *\/\nconst player=new THREE.Group();S.add(player);\nconst shadow=new THREE.Mesh(new THREE.CircleGeometry(.45,24),new THREE.MeshBasicMaterial({color:'#000',transparent:true,opacity:.45,depthWrite:false}));shadow.rotation.x=-Math.PI\/2;shadow.position.y=.01;S.add(shadow);\nconst aura=new THREE.Sprite(new THREE.SpriteMaterial({map:glowTex,color:'#f5a623',transparent:true,opacity:0,depthWrite:false,blending:THREE.AdditiveBlending}));aura.scale.set(3,3,1);S.add(aura);\nconst models={};let loaded=0;\nconst loader=new GLTFLoader();loader.setMeshoptDecoder(MeshoptDecoder);\nfunction prep(scene,anims){const box=new THREE.Box3().setFromObject(scene);const h=box.max.y-box.min.y;const s=1.75\/h;scene.scale.setScalar(s);\n  const b2=new THREE.Box3().setFromObject(scene);scene.position.y-=b2.min.y;const c=b2.getCenter(new THREE.Vector3());scene.position.x-=c.x;scene.position.z-=c.z;\n  scene.traverse(o=>{if(o.isMesh){o.frustumCulled=false;if(o.material){o.material.side=THREE.FrontSide}}});const g=new THREE.Group();g.add(scene);\n  const mx=new THREE.AnimationMixer(scene),acts={};(anims||[]).forEach(a=>{acts[a.name]=mx.clipAction(a)});\n  if(acts.jump){acts.jump.setLoop(THREE.LoopOnce);acts.jump.clampWhenFinished=true}\n  g.userData={mx,acts,cur:null};return g}\nfunction anim(name,fade){const m=player.children[0];if(!m)return;const u=m.userData,a=u.acts&&u.acts[name];if(!a||u.cur===a)return;\n  a.reset();a.setEffectiveWeight(1);a.play();if(u.cur)u.cur.crossFadeTo(a,fade==null?.15:fade,false);u.cur=a}\nfunction loadRank(i){return new Promise(res=>{loader.load(A+'kblack-ninja-'+RANKS[i].k+'-rig.glb',g=>{models[i]=prep(g.scene,g.animations);loaded++;$('krLoad').textContent='';res()},x=>{if(x.total&&i===0)$('krLoad').textContent='\u0110ang t\u1ea3i nh\u00e2n v\u1eadt '+Math.round(x.loaded\/x.total*100)+'%'},()=>{loaded++;res()})})}\nlet rank=0;function setModel(i){player.children.slice().forEach(c=>player.remove(c));if(models[i]){const m=models[i];if(m.userData.cur){m.userData.cur.stop();m.userData.cur=null}player.add(m);anim(st==='run'?'run':'idle',0)}aura.material.color.set(RANKS[i].c)}\n\n\/* state *\/\nconst LANES=[-2,0,2];\nlet st='menu',lane=1,px=0,py=0,vy=0,speed=0,dist=0,stars=0,lives=3,inv=0,mag=0,slow=1,shake=0,nextRow=0,clock=0,combo=0,menuT=0,winT=0,fovPunch=0;\nconst objs=[];\nfunction clearObjs(){objs.forEach(o=>S.remove(o));objs.length=0;parts.forEach(p=>S.remove(p));parts.length=0}\nfunction add(o,ln,z,y){o.position.set(LANES[ln],y||0,z);o.userData.lane=ln;o.userData.y0=y||0;S.add(o);objs.push(o)}\nfunction row(z){const d=Math.min(1,dist\/1600);const r=Math.random();const L=Math.floor(Math.random()*3);const gap=11.5-d*3.5;\n  const o2=a=>(a+1+Math.floor(Math.random()*2))%3,trap=()=>Math.random()<.5?mkHurdle():mkBomb();\n  const arc=(ln,zz)=>{for(let i=0;i<3;i++)add(mkStar(),ln,zz-.6+i*.6,1.9+Math.sin(i\/2*Math.PI)*.5)};\n  if(r<.05&&mag<=0&&dist>350){add(mkMag(),L,z,1);add(mkSoft(),o2(L),z);return gap}\n  if(r<.16-d*.06){for(let i=0;i<3;i++)add(mkStar(),L,z-i*1.7,1);add(trap(),L,z-6.2);add(mkSoft(),o2(L),z-6.2);return gap+3}\n  if(r<.36){const a=L,b=o2(L),f=3-a-b;add(mkHurdle(),a,z);add(mkSoft(),b,z);add(mkBomb(),f,z);arc(a,z);return gap}\n  if(r<.56){for(let k=0;k<3;k++)if(k!==L)add(mkSoft(),k,z);add(mkBomb(),L,z-3.4);add(mkStar(),L,z,1);add(mkStar(),L,z-1.6,1);add(mkStar(),L,z-3.4,2.1);return gap+2.5}\n  if(r<.76){const o=mkBomb();add(o,1,z);o.userData.mv=Math.random()*6.28;o.userData.mvs=1.4+d*1.4;const b=o2(L);add(mkSoft(),L,z-5.5);for(let i=0;i<3;i++)add(mkStar(),b,z-5.5-i*1.7,1);return gap+4}\n  const a=L,b=o2(L),f=3-a-b;for(let i=0;i<3;i++)add(mkHurdle(),i,z);add(mkSoft(),a,z-4.6);add(mkSoft(),b,z-4.6);arc(f,z);add(mkStar(),f,z-4.6,1);return gap+4}\n\n\/* hud *\/\nfunction hud(){$('krScore').innerHTML=stars+'<small>\u2605<\/small>';const r=RANKS[rank],n=RANKS[rank+1];\n  $('krRk').textContent=r.n;$('krRk').style.color=r.c;$('krBadge').src=A+'kblack-badge-'+r.k+'.png';\n  const p=n?(stars-r.need)\/(n.need-r.need):1;$('krBar').style.width=Math.min(100,p*100)+'%';$('krBar').style.background=r.c;\n  $('krSub').textContent=n?(n.need-stars)+' sao n\u1eefa l\u00ean '+n.n:'Gi\u1eef v\u1eefng phong \u0111\u1ed9!';\n  [...$('krHearts').children].forEach((h,i)=>h.classList.toggle('off',i>=lives))}\nfunction toast(t){const e=$('krToast');e.textContent=t;e.classList.add('show');clearTimeout(e._t);e._t=setTimeout(()=>e.classList.remove('show'),900)}\nfunction flash(a){const f=$('krFlash');f.style.transition='none';f.style.opacity=a;requestAnimationFrame(()=>{f.style.transition='opacity .5s';f.style.opacity=0})}\nfunction show(id){['krStart','krOver','krPaused','krWin'].forEach(s=>$(s).classList.toggle('show',s===id))}\nfunction meta(){const left=Math.max(0,MAXPLAYS-plays());$('krMeta').textContent='C\u00f2n '+left+'\/'+MAXPLAYS+' l\u01b0\u1ee3t h\u00f4m nay \u00b7 K\u1ef7 l\u1ee5c: '+best()+' \u2605'}\n\n\/* controls *\/\nlet sx=0,sy=0,sw=false;\nfunction left(){if(st==='run'&&lane>0){lane--;tone(600,.05,'sine',.04)}}function right(){if(st==='run'&&lane<2){lane++;tone(600,.05,'sine',.04)}}\nfunction jump(){if(st==='run'&&py<=.001){vy=10.4;sfx.jump();anim('jump',.08)}}\nroot.addEventListener('pointerdown',e=>{if(e.target.closest('button,a,input'))return;sx=e.clientX;sy=e.clientY;sw=true});\nroot.addEventListener('pointermove',e=>{if(!sw)return;const dx=e.clientX-sx,dy=e.clientY-sy;if(Math.abs(dx)>28||Math.abs(dy)>28){sw=false;if(Math.abs(dx)>Math.abs(dy))dx<0?left():right();else if(dy<0)jump()}});\nroot.addEventListener('pointerup',e=>{if(!sw)return;sw=false;if(st!=='run')return;const w=root.clientWidth,x=e.clientX-root.getBoundingClientRect().left;if(x<w*.33)left();else if(x>w*.67)right();else jump()});\naddEventListener('keydown',e=>{if(e.key==='ArrowLeft'||e.key==='a')left();if(e.key==='ArrowRight'||e.key==='d')right();if(e.key==='ArrowUp'||e.key==='w'||e.key===' ')jump();if(e.key==='Escape'||e.key==='p')pause()});\n$('krMute').onclick=()=>{muted=!muted;ls('kr_mute',muted?'1':'0');$('krMute').textContent=muted?'\ud83d\udd07':'\ud83d\udd0a'};\nfunction pause(){if(st!=='run')return;st='pause';show('krPaused')}\n$('krPause').onclick=pause;$('krResume').onclick=()=>{show(null);countdown(()=>{st='run';anim('run',.2)})};\ndocument.addEventListener('visibilitychange',()=>{if(document.hidden)pause()});\n\n\/* flow *\/\nfunction countdown(cb){const el=$('krCd');let n=3;el.style.display='flex';el.textContent=n;tone(440,.12,'square',.06);const iv=setInterval(()=>{n--;if(n>0){el.textContent=n;tone(440,.12,'square',.06)}else{clearInterval(iv);el.textContent='GO!';tone(880,.25,'square',.08);setTimeout(()=>el.style.display='none',420);cb()}},620)}\nfunction start(){au();const p=plays();if(p>=MAXPLAYS){$('krOverEy').textContent='H\u1ebeT L\u01af\u1ee2T H\u00d4M NAY';$('krOverT').textContent='MAI QUAY L\u1ea0I NH\u00c9';$('krOverP').innerHTML='B\u1ea1n \u0111\u00e3 ch\u01a1i \u0111\u1ee7 '+MAXPLAYS+' l\u01b0\u1ee3t h\u00f4m nay. Trong l\u00fac ch\u1edd, gh\u00e9 xem b\u1ea3ng gi\u00e1 nhi\u1ebfp \u1ea3nh gia theo gi\u1edd c\u1ee7a K-BLACK.';$('krRetry').style.display='none';show('krOver');return}\n  ls('kblack_plays',String(p+1));clearObjs();lane=1;px=0;py=0;vy=0;speed=15;dist=0;stars=0;lives=3;inv=0;mag=0;slow=1;combo=0;rank=0;setModel(0);player.rotation.set(0,Math.PI,0);nextRow=-26;\n  for(let z=-30;z>-62;){z-=row(z)}nextRow=-62;\n  hud();show(null);$('krHud').classList.add('on');$('krPause').style.display='';$('krHint').classList.add('on');setTimeout(()=>$('krHint').classList.remove('on'),3500);\n  st='count';countdown(()=>{st='run';anim('run',.2)})}\n$('krPlay').onclick=start;$('krRetry').onclick=start;$('krAgain').onclick=()=>{$('krForm').style.display='';start()};\nfunction hit(){if(inv>0)return;lives--;combo=0;inv=1.1;shake=.5;slow=.6;const lost=Math.min(stars,5);stars-=lost;if(lost)toast('\u2212'+lost+' \u2605');sfx.hit();vib([80,40,80]);$('krDmg').classList.add('on');setTimeout(()=>$('krDmg').classList.remove('on'),300);burst(player.position.clone().setY(1),'#ff4d5e',18,5);hud();if(lives<=0)over()}\nfunction over(){st='over';$('krHud').classList.remove('on');$('krPause').style.display='none';const b=Math.max(best(),stars);ls('kr_best',String(b));\n  $('krOverEy').textContent='H\u1ebeT M\u1ea0NG';$('krOverT').textContent=rank>=2?'G\u1ea6N L\u1eaeM R\u1ed2I!':'SU\u00ddT N\u1eeeA!';$('krOverS').textContent=stars;$('krOverR').textContent=RANKS[rank].n;$('krOverB').textContent=b;\n  $('krOverP').innerHTML='C\u00f2n <b>'+Math.max(0,WIN-stars)+' sao<\/b> n\u1eefa l\u00e0 l\u00ean KAGE nh\u1eadn voucher 20%. C\u00f2n '+Math.max(0,MAXPLAYS-plays())+' l\u01b0\u1ee3t h\u00f4m nay.';$('krRetry').style.display='';\n  setTimeout(()=>show('krOver'),700)}\nfunction rankUp(i){rank=i;setModel(i);player.rotation.y=Math.PI*3;slow=.25;fovPunch=1;flash(.55);sfx.up();vib([30,30,30]);burst(player.position.clone().setY(1),RANKS[i].c,40,7);\n  $('krPopImg').src=A+'kblack-badge-'+RANKS[i].k+'.png';$('krPopT').textContent=RANKS[i].n;$('krPopT').style.color=RANKS[i].c;const p=$('krPop');p.classList.remove('show');void p.offsetWidth;p.classList.add('show');\n  const b=$('krBadge');b.classList.remove('pop');void b.offsetWidth;b.classList.add('pop');speed+=2;if(i===3)setTimeout(win,900)}\nfunction win(){st='win';winT=0;objs.forEach(o=>S.remove(o));objs.length=0;$('krHud').classList.remove('on');$('krPause').style.display='none';ls('kr_best',String(Math.max(best(),stars)));sfx.win();vib([60,40,60,40,120]);\n  const v=(()=>{try{return JSON.parse(ls('kblack_voucher')||'null')}catch(e){return null}})();\n  if(v&&v.code){$('krCode').textContent=v.code;$('krForm').style.display='none';$('krCodeBox').style.display='';$('krGet').style.display='none';$('krBook').style.display=''}\n  else{$('krForm').style.display='';$('krCodeBox').style.display='none';$('krGet').style.display='';$('krBook').style.display='none'}\n  setTimeout(()=>show('krWin'),1200)}\n$('krGet').onclick=()=>{const n=$('krName').value.trim(),p=$('krPhone').value.trim();if(n.length<2||p.replace(\/\\D\/g,'').length<9){$('krErr').textContent='Nh\u1eadp t\u00ean v\u00e0 s\u1ed1 \u0111i\u1ec7n tho\u1ea1i h\u1ee3p l\u1ec7 gi\u00fap K-BLACK nh\u00e9';return}\n  $('krErr').textContent='';const code='KB20-'+Math.random().toString(36).slice(2,6).toUpperCase();ls('kblack_voucher',JSON.stringify({code,name:n,phone:p,time:Date.now()}));\n  try{fetch('https:\/\/ntfy.sh\/',{method:'POST',body:JSON.stringify({topic:NTFY,title:'\ud83c\udf81 Kh\u00e1ch l\u00ean KAGE \u2014 Ninja Run',message:'M\u00e3: '+code+' (gi\u1ea3m 20% thu\u00ea nhi\u1ebfp \u1ea3nh gia)\\nKh\u00e1ch: '+n+'\\nS\u0110T: '+p+'\\nSao: '+stars+'\\n'+new Date().toLocaleString('vi-VN'),tags:['gift'],priority:4})}).catch(()=>{})}catch(e){}\n  $('krCode').textContent=code;$('krForm').style.display='none';$('krCodeBox').style.display='';$('krGet').style.display='none';$('krBook').style.display=''};\n$('krCopy').onclick=function(){const c=$('krCode').textContent;try{navigator.clipboard.writeText(c)}catch(e){}this.textContent='\u0110\u00e3 ch\u00e9p \u2713'};\n\n\/* loop *\/\nconst tmp=new THREE.Vector3();let last=performance.now();\nfunction mixUp(t){const m=player.children[0];if(m&&m.userData.mx)m.userData.mx.update(t)}\nfunction loop(now){requestAnimationFrame(loop);let dt=Math.min(.05,(now-last)\/1000);last=now;clock+=dt;\n  if(st==='menu'||st==='over'||st==='pause'&&false){menuT+=dt;anim('idle',.3);mixUp(dt);player.scale.set(1,1,1);player.rotation.x=player.rotation.z=0;player.rotation.y=Math.sin(menuT*.6)*.5;player.position.set(0,0,0);\n    cam.position.set(0,1.05,3.7);cam.lookAt(0,.42,0);aura.position.set(0,1,-.4);aura.material.opacity=.35;shadow.position.set(0,.01,0);\n    poles.forEach(p=>{p.position.z+=dt*2;if(p.position.z>8)p.position.z-=140});rt.offset.y+=dt*.5;R.render(S,cam);return}\n  if(st==='win'){winT+=dt;anim('cheer',.2);mixUp(dt);player.rotation.x=player.rotation.z=0;player.rotation.y+=(0-player.rotation.y)*Math.min(1,dt*4);player.position.y=0;\n    cam.position.lerp(tmp.set(player.position.x,1.05,3.6),dt*2.5);cam.lookAt(player.position.x,.42,0);\n    if(Math.random()<.3)burst(tmp.set(player.position.x+(Math.random()-.5)*3,2.5+Math.random(),player.position.z-1),['#f5a623','#3fb56a','#4f7fe0','#ea4b3c'][Math.floor(Math.random()*4)],3,3);\n    stepParts(dt);R.render(S,cam);return}\n  if(st==='pause'){R.render(S,cam);return}\n  slow+=(1-slow)*Math.min(1,dt*2.2);const gdt=dt*(st==='run'?slow:0);\n  if(st==='run'){speed=Math.min(34,speed+gdt*.42);dist+=speed*gdt}\n  const mv=speed*gdt;\n  rt.offset.y+=mv\/(140\/24);grid.position.z=((grid.position.z+mv)%2)-30;\n  poles.forEach(p=>{p.position.z+=mv;if(p.position.z>8)p.position.z-=140});\n  nextRow+=mv;while(nextRow>-62){nextRow-=row(nextRow)}\n  \/* player *\/\n  const tx=LANES[lane];const dx=tx-px;px+=dx*Math.min(1,dt*13);\n  if(py>0||vy>0){vy-=33*gdt;py+=vy*gdt;if(py<0){py=0;vy=0;if(st==='run')anim('run',.12)}}\n  const run=clock*speed*.55;\n  player.position.set(px,py,0);\n  player.rotation.y+=(Math.PI-player.rotation.y)*Math.min(1,dt*6);\n  player.rotation.z=-dx*.12;player.rotation.x=py>0?-.08:.1;\n  player.scale.set(1,1,1);mixUp(gdt*(py>0?1:speed\/16));\n  player.visible=inv>0?(Math.floor(clock*14)%2===0):true;inv=Math.max(0,inv-dt);mag=Math.max(0,mag-gdt);\n  shadow.position.set(px,.01,0);shadow.scale.setScalar(1-py*.25);\n  aura.position.set(px,1+py,-.3);aura.material.opacity=mag>0?.8:.22;if(mag>0)aura.material.color.set('#5f84ff');else aura.material.color.set(RANKS[rank].c);\n  \/* objects *\/\n  for(let i=objs.length-1;i>=0;i--){const o=objs[i],u=o.userData;o.position.z+=mv;\n    if(u.t==='s'){u.m.rotation.y+=dt*3.4;o.position.y=u.y0+Math.sin(clock*4+o.position.z)*.08;\n      if(mag>0&&o.position.z>-9&&o.position.z<1.5){o.position.x+=(px-o.position.x)*Math.min(1,dt*9);o.position.y+=(py+1-o.position.y)*Math.min(1,dt*9);o.position.z+=(0-o.position.z)*Math.min(1,dt*6)}}\n    if(u.t==='m'){u.m.rotation.x+=dt*2;u.m.rotation.y+=dt*3;o.position.y=1+Math.sin(clock*3)*.15}\n    if(u.t==='b'){u.sp.scale.setScalar(.45+Math.random()*.35);if(u.mv!==undefined&&o.position.z>-40){u.mv+=gdt*u.mvs;o.position.x=Math.sin(u.mv)*2}}\n    const dz=Math.abs(o.position.z),dxo=Math.abs(o.position.x-px);\n    if(st==='run'&&dz<.7&&dxo<.95){\n      if(u.t==='s'&&Math.abs(o.position.y-(py+1))<1.1){gain();burst(o.position.clone(),'#ffcc3d',8,3);S.remove(o);objs.splice(i,1);continue}\n      if(u.t==='m'){mag=7;sfx.mag();toast('NAM CH\u00c2M SAO \u00b7 7s');burst(o.position.clone(),'#7f9cff',16,4);S.remove(o);objs.splice(i,1);continue}\n      if(u.t==='w'){hit();S.remove(o);objs.splice(i,1);continue}\n      if((u.t==='h'||u.t==='b')&&py<.72){hit();S.remove(o);objs.splice(i,1);continue}}\n    if(o.position.z>7){if(u.t==='s')combo=0;S.remove(o);objs.splice(i,1)}}\n  stepParts(dt);\n  \/* camera *\/\n  shake=Math.max(0,shake-dt);fovPunch=Math.max(0,fovPunch-dt*1.6);\n  cam.position.set(px*.55+(Math.random()-.5)*shake*.5,3.05+py*.35+(Math.random()-.5)*shake*.4,6.4);\n  cam.lookAt(px*.35,1.05+py*.2,-7);\n  const bf=(root.clientWidth\/root.clientHeight)<.6?66:58;cam.fov=bf+fovPunch*10+Math.max(0,speed-12)*.25;cam.updateProjectionMatrix();\n  R.render(S,cam)}\nfunction gain(){stars++;combo++;sfx.coin();vib(8);if(combo&&combo%10===0)toast('COMBO \u00d7'+combo+'!');for(let k=RANKS.length-1;k>rank;k--){if(stars>=RANKS[k].need){rankUp(k);break}}hud()}\nif(location.hash==='#krdev'){window.__krGain=n=>{for(let i=0;i<n;i++)gain()};window.__kr=()=>({objs,px,py,lane,stars,lives,speed,st,dist,left,right,jump})}\nfunction stepParts(dt){for(let i=parts.length-1;i>=0;i--){const p=parts[i],u=p.userData;u.a+=dt;u.v.y-=9*dt;p.position.addScaledVector(u.v,dt);p.rotation.x+=dt*6;p.material.opacity=Math.max(0,1-u.a\/u.l);if(u.a>u.l){S.remove(p);parts.splice(i,1)}}}\nrequestAnimationFrame(loop);\n\n\/* boot *\/\nmeta();\nloadRank(0).then(()=>{setModel(0);player.rotation.y=0;$('krPlay').disabled=false;$('krPlay').textContent='B\u1eaeT \u0110\u1ea6U';return Promise.all([1,2,3].map(loadRank))});\n<\/script>\n<!--\/KBRUN-->\n\n<style>\/*KBSTAGE*\/@media (min-width:768px){html,body{background:radial-gradient(1100px 650px at 50% 115%,rgba(30,63,160,.30),transparent 62%),radial-gradient(800px 420px at 50% -12%,rgba(58,107,255,.13),transparent 60%),#05070f!important}#kr{top:20px!important;bottom:20px!important;height:auto!important;max-width:460px!important;border-radius:26px;border:1px solid rgba(255,255,255,.09)!important;box-shadow:0 40px 120px rgba(0,0,0,.65),0 0 0 8px rgba(255,255,255,.02)}}\n.kbst{display:none}\n@media (min-width:1100px) and (min-height:600px){\n.kbst{display:block;position:fixed;top:50%;transform:translateY(-50%);width:min(290px,calc(50vw - 262px - 40px));z-index:99998;font-family:'Be Vietnam Pro',Montserrat,system-ui,sans-serif;color:#fff;-webkit-font-smoothing:antialiased}\n.kbst.l{right:calc(50% + 262px)}.kbst.r{left:calc(50% + 262px)}\n.kbst .cap{font-size:11px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;color:#7f9cff;margin:0 0 10px;display:flex;align-items:center;gap:8px}\n.kbst .cap:before{content:\"\";width:18px;height:1px;background:#3a6bff}\n.kbst h4{font-size:22px;line-height:1.25;font-weight:800;margin:0 0 16px;letter-spacing:-.01em}\n.kbst .rw{display:flex;align-items:center;gap:12px;padding:10px 0;border-top:1px solid rgba(255,255,255,.07);font-size:13.5px;color:rgba(235,240,255,.82)}\n.kbst .ks{display:flex;gap:5px;flex:0 0 auto}\n.kbst kbd{min-width:30px;height:30px;padding:0 8px;border-radius:8px;border:1px solid rgba(255,255,255,.18);border-bottom-width:3px;background:rgba(255,255,255,.05);display:inline-flex;align-items:center;justify-content:center;font-weight:600;font-size:12px;line-height:1;color:#fff}\n.kbst p{font-size:13px;line-height:1.65;color:rgba(220,228,250,.6);margin:14px 0 0}\n.kbst .rk{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.035);border:1px solid rgba(255,255,255,.06);margin-bottom:8px;font-size:13.5px}\n.kbst .rk b{font-weight:800;letter-spacing:.06em}\n.kbst .rk span{color:rgba(235,240,255,.6);font-size:12.5px}\n.kbst .rk.top{border-color:rgba(58,107,255,.6);background:linear-gradient(90deg,rgba(30,63,160,.35),rgba(30,63,160,.08))}\n.kbst a.go{display:inline-flex;margin-top:16px;font-size:13px;font-weight:600;color:#9db4ff;text-decoration:none}\n}\n<\/style>\n<div class=\"kbst l\" aria-hidden=\"true\"><div class=\"cap\">C\u00e1ch ch\u01a1i<\/div><h4>Ch\u1ea1y, n\u00e9 &amp; s\u0103n sao<\/h4><div class=\"rw\"><span class=\"ks\"><kbd>\u2190<\/kbd><kbd>\u2192<\/kbd><\/span>\u0110\u1ed5i l\u00e0n<\/div><div class=\"rw\"><span class=\"ks\"><kbd>\u2191<\/kbd><kbd>Space<\/kbd><\/span>Nh\u1ea3y qua ch\u01b0\u1edbng ng\u1ea1i<\/div><div class=\"rw\"><span class=\"ks\"><kbd>P<\/kbd><\/span>T\u1ea1m d\u1eebng<\/div><p>\u0110i\u1ec7n tho\u1ea1i: vu\u1ed1t tr\u00e1i \/ ph\u1ea3i \u0111\u1ec3 \u0111\u1ed5i l\u00e0n, vu\u1ed1t l\u00ean \u0111\u1ec3 nh\u1ea3y. Nh\u1eb7t sao v\u00e0ng, n\u00e9 \u0111\u00e8n, bom v\u00e0 r\u00e0o ch\u1eafn \u2014 t\u1ed1c \u0111\u1ed9 t\u0103ng d\u1ea7n.<\/p><\/div><div class=\"kbst r\" aria-hidden=\"true\"><div class=\"cap\">Ph\u1ea7n th\u01b0\u1edfng<\/div><h4>L\u00ean KAGE nh\u1eadn voucher 20%<\/h4><div class=\"rk\"><b>GENIN<\/b><span>B\u1eaft \u0111\u1ea7u<\/span><\/div><div class=\"rk\"><b>CHUNIN<\/b><span>35 \u2605<\/span><\/div><div class=\"rk\"><b>JONIN<\/b><span>75 \u2605<\/span><\/div><div class=\"rk top\"><b>KAGE<\/b><span>120 \u2605 \u00b7 \u221220%<\/span><\/div><p>Voucher gi\u1ea3m 20% khi thu\u00ea nhi\u1ebfp \u1ea3nh gia theo gi\u1edd t\u1ea1i K-BLACK.<\/p><a class=\"go\" href=\"\/booking-theo-gio\/\">Xem b\u1ea3ng gi\u00e1 nhi\u1ebfp \u1ea3nh gia \u203a<\/a><\/div>\n<!--KBK back--><style>.kbk{display:inline-flex;align-items:center;justify-content:center;flex:0 0 var(--kbs,36px);box-sizing:border-box;width:var(--kbs,36px)!important;min-width:var(--kbs,36px);max-width:var(--kbs,36px);height:var(--kbs,36px)!important;padding:0!important;margin:0;border-radius:calc(var(--kbs,36px)*.34);background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.16);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff!important;text-decoration:none!important;cursor:pointer;transition:background .2s,transform .15s;-webkit-tap-highlight-color:transparent}.kbk:hover{background:rgba(255,255,255,.15)}.kbk:active{transform:scale(.92)}.kbk svg{width:calc(var(--kbs,36px)*.46)!important;height:calc(var(--kbs,36px)*.46)!important;max-width:none;flex:none;display:block}.kbk.lt{background:rgba(0,0,0,.05);border-color:rgba(0,0,0,.12);color:#111!important}.kbk.fx{position:absolute;left:max(14px,env(safe-area-inset-left));z-index:2147483000}.kbk-w{display:inline-flex!important;align-items:center;gap:10px;vertical-align:middle;max-width:100%;flex-wrap:nowrap}<\/style>\n<script>(function(){var SEL='.kr-logo',FB='\/uu-dai\/',n=0;\nfunction lum(e){while(e&&e.nodeType===1){var c=getComputedStyle(e).backgroundColor,m=c.match(\/[\\d.]+\/g);if(m&&(m.length<4||+m[3]>.5))return(.2126*m[0]+.7152*m[1]+.0722*m[2])\/255;e=e.parentElement}return 0}\nfunction fixedHost(e){while(e&&e!==document.body){if(getComputedStyle(e).position==='fixed')return e;e=e.parentElement}return null}\nfunction mk(){var a=document.createElement('a');a.className='kbk';a.href=FB;a.setAttribute('aria-label','Quay l\u1ea1i');a.innerHTML='<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 5l-7 7 7 7\"\/><\/svg>';a.onclick=function(e){var r=document.referrer;if(r&&r.indexOf(location.host)>-1&&history.length>1){e.preventDefault();history.back()}};return a}\nfunction later(f){f();[120,400,1000,2500].forEach(function(t){setTimeout(f,t)});addEventListener('load',f);addEventListener('resize',f);try{new ResizeObserver(f).observe(document.body)}catch(e){}}\nfunction go(){if(document.querySelector('.kbk'))return;var t=SEL&&document.querySelector(SEL);if(SEL&&!t&&n++<40){setTimeout(go,150);return}\nvar b=mk();if(t){var vis=t;t=t.closest('a')||t;var r=t.getBoundingClientRect();b.style.setProperty('--kbs',Math.max(32,Math.min(40,Math.round(r.height+12)))+'px');if(lum(t)>.55)b.classList.add('lt');\nif(r.left<70){var w=document.createElement('span');w.className='kbk-w';t.parentNode.insertBefore(w,t);w.appendChild(b);w.appendChild(t);\nlater(function(){b.style.top='0px';b.style.position='relative';w.style.marginLeft='';var q=vis.getBoundingClientRect(),p=b.getBoundingClientRect();if(q.height>4)b.style.top=Math.round((q.top+q.height\/2)-(p.top+p.height\/2))+'px';if(p.left<12)w.style.marginLeft=Math.round(12-p.left)+'px'});return}\nvar host=fixedHost(t);b.classList.add('fx');(host||document.body).appendChild(b);\nlater(function(){var q=vis.getBoundingClientRect(),h=host?host.getBoundingClientRect():{top:-scrollY,left:-scrollX};if(q.height<4)q=t.getBoundingClientRect();b.style.top=Math.round(q.top-h.top+q.height\/2-b.offsetHeight\/2)+'px';b.style.left=Math.max(14,Math.round(q.left-h.left-b.offsetWidth-12))+'px'});return}\nif(lum(document.body)>.55)b.classList.add('lt');b.classList.add('fx');b.style.top='calc(max(14px,env(safe-area-inset-top)) + var(--wp-admin--admin-bar--height,0px))';document.body.appendChild(b)}\nvar mo=0;function watch(){if(mo)return;mo=new MutationObserver(function(){if(!document.querySelector('.kbk')){clearTimeout(watch.t);watch.t=setTimeout(function(){n=0;go()},120)}});mo.observe(document.body,{childList:true,subtree:true})}\nfunction start(){go();watch()}\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',start);else start()})();<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>GENIN12 sao n\u1eefa l\u00ean CHUNIN 0\u2605 L\u00caN C\u1ea4P Vu\u1ed1t \u2190 \u2192 \u0111\u1ed5i l\u00e0n \u00b7 Vu\u1ed1t \u2191 \u0111\u1ec3 nh\u1ea3y \ud83d\udd0a\u275a\u275a K-BLACK GAME NINJA RUNS\u0102N KHO\u1ea2NH KH\u1eaeC Ch\u1ea1y qua studio, nh\u1eb7t sao v\u00e0ng, n\u00e9 \u0111\u00e8n, bom v\u00e0 r\u00e0o ch\u1eafn \u2014 tr\u00fang ch\u01b0\u1edbng ng\u1ea1i m\u1ea5t 5 sao, t\u1ed1c \u0111\u1ed9 t\u0103ng li\u00ean t\u1ee5c. L\u00ean \u0111\u1ee7 4 c\u1ea5p t\u1edbi KAGE [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-5085","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/kblack.vn\/en\/wp-json\/wp\/v2\/pages\/5085","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kblack.vn\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kblack.vn\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kblack.vn\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kblack.vn\/en\/wp-json\/wp\/v2\/comments?post=5085"}],"version-history":[{"count":0,"href":"https:\/\/kblack.vn\/en\/wp-json\/wp\/v2\/pages\/5085\/revisions"}],"wp:attachment":[{"href":"https:\/\/kblack.vn\/en\/wp-json\/wp\/v2\/media?parent=5085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}