DUOLINGO INTEGRATION

Duolingo hack - XP/Gem/Streak/Super/Max

Before you install, Greasy Fork would like you to know that this script contains antifeatures, which are things there for the script author's benefit, rather than yours.

This script is only fully functional after you sign up for something, like joining a group, subscribing to a channel, or liking a page.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         DUOLINGO INTEGRATION
// @namespace    http://tampermonkey.net/
// @version      2026.08.13
// @description  Duolingo hack - XP/Gem/Streak/Super/Max
// @author       orgorakasumi
// @match        https://*.duolingo.com/*
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @connect      duolingo.com
// @connect      stories.duolingo.com
// @connect      greasyfork.org
// @antifeature  membership
// @run-at       document-idle
// @license      MIT
// ==/UserScript==
(function(){
'use strict';

console.log('[DUO] v2026.08.15.1 loaded');

// ===== CONFIG =====
var FREE_KEY='Auto-Super';
var ADMIN_PW='ADMIN KEY SUPER';
var ADMIN_DOB='280714';
var ZALO='https://zalo.me/g/omtyaxafze06b2f7fefb';

// ===== HELPERS =====
function S(k,v){try{GM_setValue(k,v)}catch(e){}}
function G(k,d){try{return GM_getValue(k,d)}catch(e){return d}}
function Q(id){return document.getElementById(id)}
function slp(ms){return new Promise(function(r){setTimeout(r,ms)})}

var _jwt=null,_sub=null,_hdrs=null,_user=null;
var _hr=false,_ht=null,_act=false;
var _solverEl=null,_isAuto=false;

// ===== CSS =====
GM_addStyle([
'*{box-sizing:border-box}',
'#du-btn{position:fixed;right:16px;bottom:16px;z-index:2147483647;padding:8px 16px;background:#0a0a0a;border:1.5px solid rgba(255,215,0,.3);border-radius:99px;color:#FFD700;font-size:12px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:6px;font-family:sans-serif;box-shadow:0 2px 12px rgba(255,215,0,.15)}',
'#du-btn:hover{transform:translateY(-2px)}',
'#du-panel{display:none;width:400px;background:#0a0a0a;border:2px solid #FFD700;border-radius:14px;position:fixed;right:16px;bottom:60px;z-index:2147483647;color:#fff;font-family:sans-serif;flex-direction:column;max-height:85vh;overflow:hidden;box-shadow:0 8px 32px rgba(255,215,0,.15)}',
'#du-hd{background:linear-gradient(135deg,#1a1a0a,#0a0a1a);padding:12px 14px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,215,0,.2)}',
'#du-hd .t{font-size:15px;font-weight:900;color:#FFD700}',
'#du-hd .g{font-size:14px;cursor:pointer}',
'.du-badge{display:inline-flex;padding:3px 10px;border-radius:99px;font-size:10px;font-weight:800;text-transform:uppercase}',
'#du-tabs{display:flex;gap:4px;padding:8px 14px}',
'.du-tab{flex:1;height:36px;border:none;border-radius:8px;font-size:12px;font-weight:800;cursor:pointer;background:#1a1a1a;color:#888;transition:all .2s}',
'.du-tab.on{background:#FFD700;color:#000}',
'#du-body{flex:1;overflow-y:auto;padding:0 14px 12px;display:flex;flex-direction:column;gap:12px}',
'#du-body::-webkit-scrollbar{width:4px}',
'#du-body::-webkit-scrollbar-thumb{background:#333;border-radius:4px}',
'.du-card{background:#1a1a1a;border:1.5px solid #333;border-radius:12px;padding:14px;display:flex;flex-direction:column;gap:10px}',
'.du-card-t{font-size:14px;font-weight:900;color:#FFD700}',
'.du-s3{background:rgba(255,107,0,.08);border:1.5px solid rgba(255,149,0,.3);border-radius:12px;padding:14px;display:flex;flex-direction:column;gap:10px}',
'.du-s3t{font-size:14px;font-weight:900;color:#FFA500}',
'.du-s3d{font-size:11px;color:#888}',
'.du-ht{font-size:13px;font-weight:800;color:#FFD700}',
'.du-hr{display:flex;gap:8px;align-items:center}',
'.du-in{flex:1;height:36px;border:1.5px solid #333;border-radius:8px;padding:0 10px;background:#0a0a0a;color:#fff;font-size:13px;font-weight:700;outline:none}.du-in:focus{border-color:#00ff64}',
'.du-btn{height:36px;padding:0 14px;border-radius:8px;border:none;font-size:12px;font-weight:800;cursor:pointer;white-space:nowrap;transition:all .15s}.du-btn:hover{transform:translateY(-2px)}.du-btn:disabled{opacity:.4;cursor:not-allowed}',
'.du-go{background:linear-gradient(135deg,#00ff64,#00cc50);color:#000}',
'.du-stp{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff}',
'.du-prog{height:6px;background:rgba(0,255,100,.08);border-radius:99px;overflow:hidden;border:1px solid rgba(0,255,100,.2)}',
'.du-fill{height:100%;border-radius:99px;background:linear-gradient(90deg,#00ff64,#00cc50);width:0%;transition:width .5s}',
'.du-log{background:#0a0a0a;border:1.5px solid #333;border-radius:10px;padding:10px 12px;font-size:11px;font-family:monospace;color:#adff2f;max-height:100px;overflow-y:auto;white-space:pre-wrap;line-height:1.6}',
'.du-log::-webkit-scrollbar{width:4px}.du-log::-webkit-scrollbar-thumb{background:#333}',
'.du-conn{display:flex;align-items:center;gap:6px;padding:6px 14px;font-size:11px;color:#888}',
'@keyframes du-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}',
'.du-stats{background:#1a1a1a;border:1.5px solid #333;border-radius:10px;padding:10px 14px;display:flex;justify-content:space-around;text-align:center;margin:0 14px}',
'.du-sv{font-size:18px;font-weight:900;color:#fff}',
'.du-sl{font-size:10px;color:#888;text-transform:uppercase;margin-top:2px}',
'.du-dv{height:1px;background:#333;margin:4px 14px}',
'.du-ft{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;font-size:10px;color:#888}',
'.du-tw{position:absolute;bottom:50px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;align-items:center;gap:5px;pointer-events:none;width:calc(100% - 30px)}',
'.du-tst{padding:8px 14px;border-radius:10px;font-size:12px;font-weight:700;color:#fff;animation:du-pop .3s ease;transition:opacity .3s}',
'.du-tst-ok{background:rgba(15,25,15,.9)}.du-tst-err{background:rgba(30,10,10,.9)}.du-tst-info{background:rgba(8,18,30,.9)}',
'@keyframes du-pop{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}',
'#du-auth{padding:12px 14px;display:flex;flex-direction:column;gap:8px}',
'.du-lb{font-size:11px;font-weight:700;color:#FFD700;text-transform:uppercase;letter-spacing:1px}',
'.du-sm{font-size:12px;font-weight:600;color:#888}',
'.du-rw{display:flex;align-items:center;gap:8px}',
'.du-iw{display:flex;align-items:center;gap:8px;border:1.5px solid #333;border-radius:10px;padding:0 12px;background:#1a1a1a;height:44px;flex:1}.du-iw:focus-within{border-color:#FFD700}',
'.du-txt{flex:1;border:none;background:none;outline:none;font-size:13px;font-weight:700;color:#fff;height:44px}.du-txt::placeholder{color:#888}',
'.du-b{display:inline-flex;align-items:center;justify-content:center;height:44px;padding:0 16px;border-radius:10px;border:none;font-size:13px;font-weight:800;cursor:pointer;transition:all .15s;text-decoration:none}.du-b:hover{transform:translateY(-2px);filter:brightness(1.1)}.du-b:disabled{opacity:.4}',
'.du-bp{background:linear-gradient(135deg,#FFD700,#FFA500);color:#000}',
'.du-bg{background:linear-gradient(135deg,#58cc02,#2d9e00);color:#fff}',
'.du-bpk{background:linear-gradient(135deg,#7c3aed,#ec4899);color:#fff}',
'.du-bo{background:linear-gradient(135deg,#ff6b00,#ff9500);color:#fff}',
'.du-bd{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff}',
'.du-bf{width:100%}',
'#du-dob{display:none;position:fixed;inset:0;z-index:2147483647;background:rgba(0,0,0,.9);justify-content:center;align-items:center}',
'.du-dbox{background:#0a0a0a;border:2px solid #ff4b4b;border-radius:16px;padding:24px;display:flex;flex-direction:column;align-items:center;gap:14px;max-width:340px;width:90%}',
'.du-dtitle{font-size:16px;font-weight:900;color:#ff4b4b}',
'.du-ddesc{font-size:12px;color:#888}',
'#du-di{width:100%;height:44px;border:1.5px solid #333;border-radius:10px;padding:0 14px;background:#1a1a1a;color:#fff;font-size:16px;font-weight:700;text-align:center;letter-spacing:4px;outline:none}',
'#du-de{font-size:11px;color:#ff4b4b;display:none}',
'#du-so{display:none;position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:2147483646}',
'#du-sm{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:380px;background:#0a0a0a;border:2px solid #FFD700;border-radius:16px;z-index:2147483647;flex-direction:column;overflow:hidden;color:#fff}',
'.du-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-bottom:1px solid rgba(255,255,255,.05)}.du-row:last-child{border-bottom:none}',
'.du-row-l{display:flex;flex-direction:column;gap:2px}',
'.du-row-t{font-size:13px;font-weight:700;color:#fff}',
'.du-row-d{font-size:10px;color:#888;opacity:.6}',
'.du-sw{width:44px;height:24px;background:#333;border-radius:12px;cursor:pointer;position:relative;transition:background .25s}',
'.du-sw.on{background:#FFD700}',
'.du-sw::after{content:"";position:absolute;width:20px;height:20px;background:#fff;border-radius:50%;top:2px;left:2px;transition:transform .25s}',
'.du-sw.on::after{transform:translateX(20px)}',
'.du-sw-g.on{background:#58cc02}',
'.du-sw-b.on{background:#1cb0f3}',
'.du-sbtn{display:flex;gap:8px;padding:8px 0;border-top:1px solid rgba(255,255,255,.05)}'
].join('\n'));

// ===== SUPER/MAX HOOK =====
(function(){
var s=document.createElement('script');
s.textContent='(function(){var KS="dh_super";var KM="dh_max";var RX=/duolingo\\.com\\/\\d{4}-\\d{2}-\\d{2}\\/users\\/\\d+/;var I={gold_subscription:{itemName:"gold_subscription",subscriptionInfo:{vendor:"STRIPE",renewing:true,isFamilyPlan:true,expectedExpiration:9999999999000}}};function m(j,tier){try{var d=JSON.parse(j);d.hasPlus=true;if(!d.trackingProperties)d.trackingProperties={};d.trackingProperties.has_item_gold_subscription=true;d.shopItems=Object.assign({},d.shopItems,I);if(tier==="MAX"){d.hasMax=true;if(!d.trackingProperties.has_item_gold_subscription_plus) d.trackingProperties.has_item_gold_subscription_plus=true}return JSON.stringify(d)}catch(e){return j}}function getTier(){var s2=localStorage.getItem(KS)==="true";var mx=localStorage.getItem(KM)==="true";if(mx)return"MAX";if(s2)return"SUPER";return null}var OF=window.fetch;window.fetch=function(r,o){var u=r instanceof Request?r.url:String(r||"");var mt=r instanceof Request?r.method:((o&&o.method)||"GET");if(mt.toUpperCase()==="GET"&&RX.test(u)&&u.indexOf("/shop-items")===-1){var tier=getTier();if(tier)return OF.apply(this,arguments).then(function(resp){return resp.clone().text().then(function(t){var h={};try{resp.headers.forEach(function(v,k){h[k]=v})}catch(e){}h["content-type"]="application/json";return new Response(m(t,tier),{status:resp.status,statusText:resp.statusText,headers:h})})})}return OF.apply(this,arguments)};var OO=XMLHttpRequest.prototype.open,OS=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(m2,u){this._dg=m2.toUpperCase()==="GET"&&RX.test(u);OO.apply(this,arguments)};XMLHttpRequest.prototype.send=function(){var x=this;if(x._dg){var oc=x.onreadystatechange;x.onreadystatechange=function(){if(x.readyState===4&&x.status>=200&&x.status<300){try{var r=x.responseText;var tier=getTier();if(tier)r=m(r,tier);Object.defineProperty(x,"responseText",{value:r});Object.defineProperty(x,"response",{value:r})}catch(e){}}if(oc)oc.apply(this,arguments)}}OS.apply(this,arguments)}})();';
document.documentElement.appendChild(s);
s.remove();
console.log('[DUO] Super/Max hook OK');
})();

// ===== AUTH =====
function getJwt(){var m=document.cookie.match(/(^| )jwt_token=([^;]+)/);return m?m[2]:null}
function decJwt(t){try{var b=t.split('.')[1].replace(/-/g,'+').replace(/_/g,'/');var pad=b+'==='.slice(b.length%4||4);return JSON.parse(atob(pad))}catch(e){return null}}
function gm(m,u,d){return new Promise(function(ok){GM_xmlhttpRequest({method:m,url:u,headers:_hdrs||{},data:d?JSON.stringify(d):null,onload:function(r){ok(r)},onerror:function(){ok({status:0})},timeout:15000})})}

function getTier(){
var s=localStorage.getItem('dh_super')==='true';
var mx=localStorage.getItem('dh_max')==='true';
if(mx) return 'MAX';
if(s) return 'SUPER';
return null;
}

function updateBadge(){
var tier=getTier();
var badge=Q('du-badge');
var hd=Q('du-hd');
if(!badge) return;
if(tier==='MAX'){
badge.innerHTML='<span class="du-badge" style="background:rgba(255,215,0,.15);color:#FFD700;border:1px solid rgba(255,215,0,.3)">MAX</span>';
if(hd) hd.style.borderColor='rgba(255,215,0,.4)';
} else if(tier==='SUPER'){
badge.innerHTML='<span class="du-badge" style="background:rgba(88,204,2,.15);color:#58cc02;border:1px solid rgba(88,204,2,.3)">SUPER</span>';
if(hd) hd.style.borderColor='rgba(88,204,2,.3)';
} else {
badge.innerHTML='';
if(hd) hd.style.borderColor='rgba(255,215,0,.2)';
}
}

async function connect(){
var ico=Q('du-ico'),txt=Q('du-txt');
if(ico)ico.style.animation='du-spin 1s linear infinite';
if(txt){txt.textContent='Connecting...';txt.style.color='#888'}
_jwt=getJwt();
if(!_jwt){if(ico){ico.textContent='X';ico.style.animation=''}if(txt){txt.textContent='Not logged in';txt.style.color='#ff4b4b'}return}
var dec=decJwt(_jwt);
if(!dec||!dec.sub){if(ico){ico.textContent='X';ico.style.animation=''}if(txt){txt.textContent='Invalid token';txt.style.color='#ff4b4b'}return}
_sub=dec.sub;
_hdrs={'Content-Type':'application/json','Authorization':'Bearer '+_jwt};
try{
var r=await gm('GET','https://www.duolingo.com/2017-06-30/users/'+_sub+'?fields=id,username,fromLanguage,learningLanguage,streak,totalXp,gems,streakData,timezone');
if(r.status!==200)throw new Error('HTTP '+r.status);
_user=JSON.parse(r.responseText);
if(ico){ico.textContent='V';ico.style.animation=''}if(txt){txt.textContent='Connected: '+_user.username;txt.style.color='#00ff64'}
var un=Q('du-un');if(un)un.textContent=_user.username||'';
var xp=Q('du-xp');if(xp)xp.textContent=(_user.totalXp||0).toLocaleString();
var gm2=Q('du-gm');if(gm2)gm2.textContent=(_user.gems||0).toLocaleString();
var st=Q('du-st');if(st)st.textContent=_user.streak||0;
Q('du-s3').disabled=false;
Q('du-xpb').disabled=false;
Q('du-gmb').disabled=false;
Q('du-stb').disabled=false;
updateBadge();
var sk=G('key','');
if(sk&&sk===FREE_KEY)_unlock(FREE_KEY);
console.log('[DUO] Connected:',_user.username);
}catch(e){if(ico){ico.textContent='X';ico.style.animation=''}if(txt){txt.textContent='Error';txt.style.color='#ff4b4b'}console.error('[DUO]',e);setTimeout(connect,8000)}
}

// ===== HELPERS =====
function toast(m,t){
t=t||'info';var w=Q('du-tw');if(!w)return;
if(w.children.length>=2)w.firstChild.remove();
var d=document.createElement('div');d.className='du-tst du-tst-'+t;d.textContent=m;
w.appendChild(d);setTimeout(function(){d.style.opacity='0';setTimeout(function(){if(d.parentNode)d.remove()},300)},2500);
}
function alog(m,p){var e=Q('du-hlog');if(!e)return;var s=document.createElement('span');s.style.color=p==='o'?'#adff2f':p==='e'?'#ff4b4b':'#1cb0f3';s.textContent='['+ts()+'] '+m;e.appendChild(s);e.appendChild(document.createTextNode('\n'));e.scrollTop=e.scrollHeight}
function alogC(){var e=Q('du-hlog');if(e)e.textContent=''}
function ts(){var n=new Date(Date.now()+7*36e5);return n.getUTCHours().toString().padStart(2,'0')+':'+n.getUTCMinutes().toString().padStart(2,'0')+':'+n.getUTCSeconds().toString().padStart(2,'0')}
function uhp(id,pct){var f=Q('du-f-'+id);if(f)f.style.width=Math.min(100,Math.max(0,pct))+'%'}

// ===== SUPER 3 DAYS =====
async function activateSuper(){
if(_act||!_user||!_sub){if(!_user)toast('Not connected!','err');return}
_act=true;var b=Q('du-s3');if(b){b.disabled=true;b.textContent='ACTIVATING...'}
alogC();alog('Account: '+_user.username,'o');
try{var r=await gm('POST','https://www.duolingo.com/2017-06-30/users/'+_sub+'/shop-items',{itemName:'immersive_subscription',isFree:true,consumed:true,fromLanguage:_user.fromLanguage||'en',learningLanguage:_user.learningLanguage||'es',productId:'com.duolingo.immersive_free_trial_subscription'});
if(r.status===200||r.status===201){alog('SUCCESS!','o');toast('Super 3 days!','ok')}
else if(r.status===409){alog('Already have Super!','w')}
else{alog('Error HTTP '+r.status,'e')}}catch(e){alog(e.message,'e')}
setTimeout(function(){_act=false;if(b){b.disabled=false;b.textContent='ACTIVATE SUPER 3 DAYS'}},500)
}

// ===== XP HACK =====
async function hackXP(amt){
if(!_user||!_sub)throw new Error('Not connected!');
var earned=0,fail=0;
while(_hr&&_ht==='xp'){if(earned>=amt)break;
try{var now=Math.floor(Date.now()/1000);var r=await gm('POST','https://stories.duolingo.com/api2/stories/fr-en-le-passeport/complete',{awardXp:true,completedBonusChallenge:true,fromLanguage:'fr',learningLanguage:'en',hasXpBoost:false,illustrationFormat:'svg',isFeaturedStoryInPracticeHub:true,isLegendaryMode:true,isV2Redo:false,isV2Story:false,masterVersion:true,maxScore:0,score:0,happyHourBonusXp:469,startTime:now,endTime:now+300});
if(r.status===200){var d=JSON.parse(r.responseText);var xp=typeof d.awardedXp==='number'?d.awardedXp:499;fail=0;earned+=xp;alog('+'+xp+' XP','o');if(_user)_user.totalXp=(_user.totalXp||0)+xp}
else if(r.status===429){fail++;if(fail>=5){alog('Rate limit!','e');break}await slp(3000);continue}
else{fail++;if(fail>=5)break;await slp(2000);continue}}catch(e){fail++;if(fail>=5)break}
uhp('xp',Math.min(100,Math.floor(earned/amt*100)));await slp(1000)}return earned}

// ===== GEM HACK =====
async function hackGem(){
if(!_user||!_sub)throw new Error('Not connected!');
var total=0,fail=0;
while(_hr&&_ht==='gem'){
try{var rr=await gm('GET','https://www.duolingo.com/2023-05-23/users/'+_sub+'?fields=rewardBundles{rewards}');
if(rr.status!==200){fail++;if(fail>=5)break;await slp(3000);continue}
var rd=JSON.parse(rr.responseText);var gems=[];
(rd.rewardBundles||[]).forEach(function(b){(b.rewards||[]).forEach(function(rw){if(!rw.consumed&&(rw.id||'').match(/^SKILL_COMPLETION/))gems.push({id:rw.id,amount:rw.amount||0})})});
if(!gems.length){await slp(500);continue}fail=0;
var res=await Promise.all(gems.map(function(g){return gm('PATCH','https://www.duolingo.com/2023-05-23/users/'+_sub+'/rewards/'+g.id,{consumed:true,fromLanguage:_user.fromLanguage||'en',learningLanguage:_user.learningLanguage||'en'})}));
var bat=0;res.forEach(function(ok,i){if(ok.status===200)bat+=gems[i].amount||0});
if(bat>0){total+=bat;alog('+'+bat+' Gems','o');if(_user)_user.gems=(_user.gems||0)+bat}}catch(e){fail++}
uhp('gem',total>0?50:0);await slp(400)}return total}

// ===== STREAK HACK =====
async function hackStreak(days){
if(!_user||!_sub)throw new Error('Not connected!');
var done=0,fail=0;var tz=_user.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone;
var base,ds=_user.streakData&&_user.streakData.currentStreak&&_user.streakData.currentStreak.startDate;
if(ds&&/^\d{4}-\d{2}-\d{2}$/.test(ds)){var p=ds.split('-');base={y:+p[0],m:+p[1],d:+p[2]}}
else{var dtf=new Intl.DateTimeFormat('en-US',{timeZone:tz,year:'numeric',month:'2-digit',day:'2-digit'});var parts={};dtf.formatToParts(new Date()).forEach(function(x){if(x.type!=='literal')parts[x.type]=x.value});base={y:+parts.year,m:+parts.month,d:+parts.day}}
function w2s(y,m,d,hh,mn,s){var g=Date.UTC(y,m-1,d,hh,mn,s);var dtf2=new Intl.DateTimeFormat('en-US',{timeZone:tz,hourCycle:'h23',year:'numeric',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit',second:'2-digit'});var o={};dtf2.formatToParts(new Date(g)).forEach(function(x){if(x.type!=='literal')o[x.type]=x.value});var la=Date.UTC(+o.year,+o.month-1,+o.day,+o.hour,+o.minute,+o.second);return Math.floor((g-(la-g))/1000)}
var CH=['assist','completeReverseTranslation','dialogue','form','judge','listen','listenMatch','match','select','translate','tapComplete'];
while(_hr&&_ht==='streak'){if(done>=days)break;
var es=w2s(base.y,base.m,base.d-1-done,12,0,0);var sess=null;
try{var sr=await gm('POST','https://www.duolingo.com/2017-06-30/sessions',{challengeTypes:CH,fromLanguage:_user.fromLanguage||'en',learningLanguage:_user.learningLanguage||'en',type:'GLOBAL_PRACTICE',isFinalLevel:false,isV2:true,juicy:true,smartTipsVersion:2});if(sr.status===200){var sd=JSON.parse(sr.responseText);if(sd.id)sess=sd}}catch(e){}
if(!sess){fail++;if(fail>=5)break;await slp(2000);continue}
try{var ur=await gm('PUT','https://www.duolingo.com/2017-06-30/sessions/'+sess.id,Object.assign({},sess,{heartsLeft:5,startTime:es-1,endTime:es,enableBonusPoints:false,failed:false,maxInLessonStreak:9,shouldLearnThings:true}));
if(ur.status===200){fail=0;done++;alog('+'+done+' Streak','o');if(_user)_user.streak=(_user.streak||0)+1}else{fail++;if(fail>=5)break}}catch(e){fail++}
uhp('streak',Math.min(100,Math.floor(done/days*100)));await slp(1000)}return done}

// ===== AUTO SOLVER =====
function solveOnce(){
try{
var skips=document.querySelectorAll('[data-test="practice-hub-ad-no-thanks-button"],.vpDIE,[data-test="plus-no-thanks"],[data-test="story-start"]');
skips.forEach(function(e){if(e)e.click()});
var me=document.querySelector('[data-test="challenge"]')||document.querySelector('[data-test="stories-choice"]');
if(!me){var nb=document.querySelector('[data-test="player-next"]')||document.querySelector('[data-test="stories-player-done"]');if(nb&&!nb.disabled)nb.click();return}
var key=Object.keys(me).find(function(k){return k.startsWith('__reactFiber$')});
if(!key){var nb2=document.querySelector('[data-test="player-next"]');if(nb2&&!nb2.disabled)nb2.click();return}
var fiber=me[key];var comp=fiber;
for(var i=0;i<3;i++){var p=comp.return;while(p&&typeof p.type==='string')p=p.return;if(p)comp=p}
var sol=comp.stateNode&&comp.stateNode.props&&comp.stateNode.props.currentChallenge;
if(!sol){var nb3=document.querySelector('[data-test="player-next"]');if(nb3&&!nb3.disabled)nb3.click();return}
var t=sol.type;
if(t==='speak'||t==='listenSpeak'){var sk2=document.querySelector('[data-test="player-skip"]');if(sk2)sk2.click()}
else if(t==='translate'){var ct=sol.correctTokens,cs=sol.correctSolutions;if(ct&&ct.length){var tk=document.querySelectorAll('[data-test$="challenge-tap-token"]');var u=[];ct.forEach(function(w){for(var j=0;j<tk.length;j++){if(u.indexOf(j)<0&&tk[j].innerText.trim()===w.trim()&&!tk[j].disabled){tk[j].click();u.push(j);break}}})}else if(cs){var ta=document.querySelector('textarea[data-test="challenge-translate-input"]');if(ta){var setter=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,'value').set;setter.call(ta,cs[0]);ta.dispatchEvent(new Event('input',{bubbles:true}))}}}
else if(t==='completeReverseTranslation'){var blanks=sol.displayTokens?sol.displayTokens.filter(function(t2){return t2.isBlank}):[];var inp=document.querySelector('[data-test="challenge-text-input"]');if(blanks[0]&&inp){var s2=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value').set;s2.call(inp,blanks[0].text);inp.dispatchEvent(new Event('input',{bubbles:true}))}}
else if(t==='judge'||t==='dialogue'||t==='characterIntro'){var ci=sol.correctIndices?sol.correctIndices[0]:sol.correctIndex||0;var jt=document.querySelectorAll('[data-test="challenge-judge-text"]');if(jt.length&&jt[ci])jt[ci].click();else{var ch=document.querySelectorAll('[data-test="challenge-choice"]');if(ch[ci])ch[ci].click()}}
else if(t==='select'||t==='characterSelect'||t==='form'||t==='readComprehension'){var si=sol.correctIndex||0;var cards=document.querySelectorAll('[data-test="challenge-choice-card"]');if(cards.length&&cards[si])cards[si].click();else{var ch2=document.querySelectorAll('[data-test="challenge-choice"]');if(ch2[si])ch2[si].click()}}
else if(t==='listenTap'||t==='listen'){var lt=document.querySelectorAll('[data-test$="challenge-tap-token"]');var lu=[];(sol.correctTokens||[]).forEach(function(w){for(var j=0;j<lt.length;j++){if(lu.indexOf(j)<0&&lt[j].innerText.trim()===w.trim()&&!lt[j].disabled){lt[j].click();lu.push(j);break}}})}
else if(t==='match'){var pb=document.querySelectorAll('[data-test*="challenge-tap-token"]:not(span)');var pt=document.querySelectorAll('[data-test="challenge-tap-token-text"]');(sol.pairs||[]).forEach(function(pair){for(var j=0;j<pb.length;j++){if(pb[j].disabled)continue;var tx=pt[j].innerText.toLowerCase().trim();if(tx===(pair.learningToken||'').toLowerCase()||tx===(pair.fromToken||'').toLowerCase()){pb[j].click();break}}})}
var next=document.querySelector('[data-test="player-next"]')||document.querySelector('[data-test="stories-player-continue"]')||document.querySelector('[data-test="stories-player-done"]');
if(next&&!next.disabled&&next.getAttribute('aria-disabled')!=='true')next.click()
}catch(e){var n=document.querySelector('[data-test="player-next"]');if(n&&!n.disabled)n.click()}
}
function checkSolver(){var inL=location.pathname.includes('/lesson')||location.pathname.includes('/practice');var on=G('solver',false);if(inL&&on&&!_solverEl){_solverEl=document.createElement('div');_solverEl.style.cssText='position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:2147483647;display:flex;gap:12px';_solverEl.innerHTML='<button id="du-ss" style="padding:12px 24px;background:#58cc02;border:none;border-bottom:4px solid #2d9e00;border-radius:12px;color:#fff;font-weight:700;font-size:14px;cursor:pointer">SOLVE</button><button id="du-sa" style="padding:12px 24px;background:#ffc800;border:none;border-bottom:4px solid #ff9600;border-radius:12px;color:#fff;font-weight:700;font-size:14px;cursor:pointer">SOLVE ALL</button>';document.body.appendChild(_solverEl);Q('du-ss').onclick=function(){solveOnce()};Q('du-sa').onclick=function(){_isAuto=!_isAuto;var b=Q('du-sa');b.textContent=_isAuto?'STOP':'SOLVE ALL';b.style.background=_isAuto?'#ff4b4b':'#ffc800';b.style.borderBottomColor=_isAuto?'#cc0000':'#ff9600';if(_isAuto){(async function(){while(_isAuto){solveOnce();await slp(200)}})()}}}else if((!inL||!on)&&_solverEl){_solverEl.remove();_solverEl=null;_isAuto=false}}
setInterval(checkSolver,1000);

// ===== UNLOCK =====
function _unlock(key){if(!key)return;key=key.trim();if(key===ADMIN_PW){Q('du-dob').style.display='flex';setTimeout(function(){Q('du-di').focus()},100);return}if(key!==FREE_KEY){toast('Invalid key!','err');return}S('key',key);Q('du-auth').style.display='none';Q('du-main').style.display='flex';var dtb=Q('du-dtb');if(dtb){dtb.textContent='FREE';dtb.style.background='#d7ffb8';dtb.style.color='#2d6a00'}updateBadge();toast((_user?_user.username:'User')+' [FREE]','ok')}

// ===== BUILD UI =====
var el=document.createElement('div');
el.innerHTML='<div id="du-btn">&#128065; <span class="txt">HIDE</span></div><div id="du-panel"><div class="du-tw" id="du-tw"></div><div id="du-hd"><div style="display:flex;align-items:center;gap:10px"><span class="t">Duolingo INTEGRATION</span><span id="du-badge"></span></div><span class="g" id="du-gear">&#9881;</span></div><div id="du-auth"><div class="du-lb">ENTER KEY</div><div class="du-rw"><div class="du-iw"><input id="du-ki" class="du-txt" type="password" placeholder="Enter key..." autocomplete="off"></div><button class="du-b du-bp" id="du-ubtn">SUBMIT</button></div><button class="du-b du-bg du-bf" id="du-fbtn">FREE USE</button><div style="display:flex;justify-content:space-between;align-items:center"><span class="du-sm">VIP = No limits</span><a href="'+ZALO+'" target="_blank" class="du-b du-bpk" style="height:36px;font-size:12px;padding:0 12px">GET VIP KEY</a></div></div><div id="du-main" style="display:none;flex-direction:column;flex:1;min-height:0"><div style="display:flex;justify-content:space-between;align-items:center;padding:8px 14px;background:rgba(28,176,243,.08);border:1.5px solid rgba(28,176,243,.2);border-radius:10px;margin:12px 14px 0"><span style="font-size:13px;font-weight:800;color:#1cb0f3" id="du-un">...</span><span class="du-badge" id="du-dtb" style="background:#d7ffb8;color:#2d6a00">FREE</span></div><div class="du-conn"><span id="du-ico">&#9679;</span><span id="du-txt">Connecting...</span></div><div class="du-stats"><div><div class="du-sv" id="du-xp">-</div><div class="du-sl">XP</div></div><div><div class="du-sv" id="du-gm">-</div><div class="du-sl">GEMS</div></div><div><div class="du-sv" id="du-st">-</div><div class="du-sl">STREAK</div></div></div><div id="du-tabs"><button class="du-tab on" id="du-t1">SUPER</button><button class="du-tab" id="du-t2">HACK</button></div><div id="du-body"><div id="du-p1" style="display:flex;flex-direction:column;gap:12px"><div class="du-card"><div class="du-s3"><div class="du-s3t">Activate Super 3 Days</div><div class="du-s3d">Free Super Duolingo ~3 days</div><button class="du-b du-bo du-bf" id="du-s3" disabled>ACTIVATE SUPER</button></div><div class="du-log" id="du-log">Click button...</div></div></div><div id="du-p2" style="display:none;flex-direction:column;gap:12px"><div class="du-card"><div class="du-ht">Farm XP (~499XP)</div><div class="du-hr"><input type="number" class="du-in" id="du-xpi" value="5000"><button class="du-btn du-go" id="du-xpb" disabled>FARM</button></div><div class="du-prog"><div class="du-fill" id="du-f-xp"></div></div></div><div class="du-card"><div class="du-ht">Hack Gems</div><div class="du-hr"><button class="du-btn du-go du-bf" id="du-gmb" disabled>FARM GEMS</button></div><div class="du-prog"><div class="du-fill" id="du-f-gem"></div></div></div><div class="du-card"><div class="du-ht">Hack Streak</div><div class="du-hr"><input type="number" class="du-in" id="du-sti" value="100"><button class="du-btn du-go" id="du-stb" disabled>FARM</button></div><div class="du-prog"><div class="du-fill" id="du-f-streak"></div></div></div><div class="du-card"><div class="du-card-t">ACTIVITY LOG</div><div class="du-log" id="du-hlog">Ready...</div></div></div></div><div class="du-dv"></div><div class="du-ft"><span>v2026.08.15.1</span><a href="'+ZALO+'" target="_blank" style="color:#FFD700;text-decoration:none">Zalo</a></div></div></div><div id="du-dob"><div class="du-dbox"><div class="du-dtitle">ADMIN AUTH</div><div class="du-ddesc">Enter DOB (ddMMyy)</div><input type="password" id="du-di" placeholder="******" maxlength="6"><div id="du-de">Wrong!</div><div style="display:flex;gap:8px;width:100%"><button class="du-b du-bd" style="flex:1" id="du-dc">CANCEL</button><button class="du-b du-bg" style="flex:1" id="du-dk">CONFIRM</button></div></div></div><div id="du-so"></div><div id="du-sm"><div style="display:flex;justify-content:space-between;align-items:center;padding:14px;border-bottom:1px solid #333;background:linear-gradient(135deg,#1a1a0a,#0a0a1a)"><div class="du-lb" style="font-size:14px">&#9881; SETTINGS</div><button class="du-b du-bd" style="height:36px;font-size:12px;padding:0 12px" id="du-csm">&#10005;</button></div><div style="padding:12px 14px;display:flex;flex-direction:column"><div class="du-row"><div class="du-row-l"><span class="du-row-t">Custom Theme</span><span class="du-row-d">Dark red theme</span></div><div class="du-sw" id="du-swr"></div></div><div class="du-row"><div class="du-row-l"><span class="du-row-t">Super Duolingo</span><span class="du-row-d">API mod - hasPlus:true</span></div><div class="du-sw du-sw-g" id="du-sws"></div></div><div class="du-row"><div class="du-row-l"><span class="du-row-t">Max Duolingo</span><span class="du-row-d">API mod - hasPlus + hasMax</span></div><div class="du-sw du-sw-g" id="du-swm"></div></div><div class="du-row"><div class="du-row-l"><span class="du-row-t">Auto Solver</span><span class="du-row-d">Show SOLVE in lessons</span></div><div class="du-sw du-sw-b" id="du-swv"></div></div><div class="du-sbtn"><button class="du-b du-bpk" style="flex:1;height:38px;font-size:12px" id="du-ck">CHANGE KEY</button><button class="du-b du-bd" style="flex:1;height:38px;font-size:12px" id="du-rk">REMOVE KEY</button></div></div></div>';
document.body.appendChild(el);

// ===== INIT STATES =====
var sws=Q('du-sws'),swm=Q('du-swm'),swv=Q('du-swv'),swr=Q('du-swr');
if(sws)sws.classList.toggle('on',localStorage.getItem('dh_super')==='true');
if(swm)swm.classList.toggle('on',localStorage.getItem('dh_max')==='true');
if(swv)swv.classList.toggle('on',G('solver',false));
if(G('red',false)&&swr)swr.classList.add('on');
updateBadge();

// ===== EVENTS =====
Q('du-btn').onclick=function(){var p=Q('du-panel');var t=this.querySelector('.txt');if(!p||!t)return;if(t.textContent==='HIDE'){p.style.display='none';t.textContent='SHOW'}else{p.style.display='flex';t.textContent='HIDE'}};
Q('du-gear').onclick=function(){Q('du-so').style.display='block';Q('du-sm').style.display='flex'};
Q('du-csm').onclick=function(){Q('du-so').style.display='none';Q('du-sm').style.display='none'};
Q('du-so').onclick=function(){Q('du-so').style.display='none';Q('du-sm').style.display='none'};
Q('du-t1').onclick=function(){Q('du-t1').classList.add('on');Q('du-t2').classList.remove('on');Q('du-p1').style.display='flex';Q('du-p2').style.display='none'};
Q('du-t2').onclick=function(){Q('du-t2').classList.add('on');Q('du-t1').classList.remove('on');Q('du-p2').style.display='flex';Q('du-p1').style.display='none'};
Q('du-fbtn').onclick=function(){_unlock(FREE_KEY)};
Q('du-ubtn').onclick=function(){var k=Q('du-ki').value.trim();if(k)_unlock(k)};
Q('du-ki').onkeydown=function(e){if(e.key==='Enter'){var k=this.value.trim();if(k)_unlock(k)}};
Q('du-s3').onclick=function(){activateSuper()};
Q('du-ck').onclick=function(){Q('du-so').style.display='none';Q('du-sm').style.display='none';S('key','');Q('du-main').style.display='none';Q('du-auth').style.display='';Q('du-ki').value='';Q('du-ki').focus();toast('Enter new key','info')};
Q('du-rk').onclick=function(){if(!confirm('Remove key?'))return;Q('du-so').style.display='none';Q('du-sm').style.display='none';S('key','');Q('du-main').style.display='none';Q('du-auth').style.display='';Q('du-ki').value='';toast('Key removed','ok')};
Q('du-dk').onclick=function(){var di=Q('du-di');if(di.value.trim()===ADMIN_DOB){Q('du-dob').style.display='none';di.value='';Q('du-de').style.display='none';S('key',ADMIN_PW);Q('du-auth').style.display='none';Q('du-main').style.display='flex';var dtb=Q('du-dtb');if(dtb){dtb.textContent='ADMIN';dtb.style.background='linear-gradient(135deg,#ff4b4b,#ff0000)';dtb.style.color='#fff'}updateBadge();toast('ADMIN','ok')}else{Q('du-de').style.display='';di.value='';toast('Wrong!','err')}};
Q('du-di').onkeydown=function(e){if(e.key==='Enter')Q('du-dk').click()};
Q('du-dc').onclick=function(){Q('du-dob').style.display='none';Q('du-di').value='';Q('du-de').style.display='none'};

// ===== SUPER/MAX TOGGLES - INDEPENDENT =====
Q('du-sws').onclick=function(){
var on=localStorage.getItem('dh_super')==='true';
var next=!on;
localStorage.setItem('dh_super',next?'true':'false');
this.classList.toggle('on',next);
updateBadge();
toast(next?'Super ON':'Super OFF',next?'ok':'info');
if(on!==next){setTimeout(function(){location.reload()},800)}
};

Q('du-swm').onclick=function(){
var on=localStorage.getItem('dh_max')==='true';
var next=!on;
localStorage.setItem('dh_max',next?'true':'false');
this.classList.toggle('on',next);
updateBadge();
toast(next?'Max ON':'Max OFF',next?'ok':'info');
if(on!==next){setTimeout(function(){location.reload()},800)}
};

Q('du-swv').onclick=function(){var next=!G('solver',false);S('solver',next);this.classList.toggle('on',next);toast(next?'Solver ON':'Solver OFF','ok')};
Q('du-swr').onclick=function(){var on=this.classList.toggle('on');S('red',on)};

// ===== HACK BUTTONS =====
Q('du-xpb').onclick=async function(){var btn=this;if(_hr&&_ht==='xp'){_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go';return}var v=parseInt(Q('du-xpi').value)||5000;_hr=true;_ht='xp';btn.textContent='STOP';btn.className='du-btn du-stp';alogC();alog('Farming XP...','i');uhp('xp',0);try{var e=await hackXP(v);if(e>0){alog('+'+e+' XP!','o');toast('+'+e+' XP!','ok');uhp('xp',100);var x=Q('du-xp');if(x&&_user)x.textContent=(_user.totalXp||0).toLocaleString()}}catch(ex){alog(ex.message,'e');toast(ex.message,'err')}_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go'};
Q('du-gmb').onclick=async function(){var btn=this;if(_hr&&_ht==='gem'){_hr=false;_ht=null;btn.textContent='FARM GEMS';btn.className='du-btn du-go';return}_hr=true;_ht='gem';btn.textContent='STOP';btn.className='du-btn du-stp';alogC();alog('Hacking Gems...','i');uhp('gem',0);try{var g=await hackGem();if(g>0){alog('+'+g+' Gems!','o');toast('+'+g+' Gems!','ok');uhp('gem',100);var x=Q('du-gm');if(x&&_user)x.textContent=(_user.gems||0).toLocaleString()}}catch(ex){alog(ex.message,'e');toast(ex.message,'err')}_hr=false;_ht=null;btn.textContent='FARM GEMS';btn.className='du-btn du-go'};
Q('du-stb').onclick=async function(){var btn=this;if(_hr&&_ht==='streak'){_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go';return}var v=parseInt(Q('du-sti').value)||100;_hr=true;_ht='streak';btn.textContent='STOP';btn.className='du-btn du-stp';alogC();alog('Hacking Streak...','i');uhp('streak',0);try{var s2=await hackStreak(v);if(s2>0){alog('+'+s2+' Streak!','o');toast('+'+s2+'!','ok');uhp('streak',100);var x=Q('du-st');if(x&&_user)x.textContent=_user.streak||0}}catch(ex){alog(ex.message,'e');toast(ex.message,'err')}_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go'};

// ===== START =====
console.log('[DUO] UI mounted');
toast('v2026.08.15.1 Ready','info');
connect();

})();