Blooket Gui by TheRealGliz

script ported over from https://github.com/therealgliz/blooket-hacks

// ==UserScript==
// @name         Blooket Gui by TheRealGliz
// @namespace    http://tampermonkey.net/
// @version      2024-05-04
// @description  script ported over from https://github.com/therealgliz/blooket-hacks
// @author       TheRealGliz
// @match        https://*.blooket.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    (() => {
        let n = document.createElement('iframe');
        document.body.append(n);
        window.alert = n.contentWindow.alert.bind(window);
        window.prompt = n.contentWindow.prompt.bind(window);
        window.confirm = n.contentWindow.confirm.bind(window);
        n.remove();
    })();
    (() => {
        let style = document.createElement('style');
        style.innerHTML = (`details > summary {
    cursor: pointer;
    transition: 0.15s;
    list-style: none;
}
details > summary:hover {
    color: hsl(0, 0%, 50%)
}
details > summary::-webkit-details-marker {
    display: none;
}
details summary ~ * {
    animation: sweep .5s ease-in-out;
}

@keyframes sweep {
    0%    {opacity: 0; transform: translateY(-10px)}
    100%  {opacity: 1; transform: translateY(0)}
}
.cheat {
    border: none;
    background: hsl(0, 0%, 20%);
    padding: 5px;
    margin: 3px;
    width: 60%;
    color: hsl(0, 0%, 100%);
    transition: 0.2s;
    border-radius: 5px;
    cursor: pointer;
}
.cheat:hover {
    background: hsl(0, 0%, 30%);
}`);

        const GUI = document.createElement('div');
        GUI.appendChild(style);
        GUI.style.width = '400px';
        //GUI.style.height = '500px';
        GUI.style.background = 'hsl(0, 0%, 10%)';
        GUI.style.borderRadius = '10px';
        GUI.style.position = 'absolute';
        GUI.style.textAlign = 'center';
        GUI.style.fontFamily = 'Nunito';
        GUI.style.color = 'white';
        GUI.style.overflow = 'hidden';
        GUI.style.top = '50px';
        GUI.style.left = '50px';

        var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
        GUI.onmousedown = ((e = window.event) => {
            e.preventDefault();
            pos3 = e.clientX;
            pos4 = e.clientY;
            document.onmouseup = (() => {
                document.onmouseup = null;
                document.onmousemove = null;
            });
            document.onmousemove = ((e) => {
                e = e || window.event;
                e.preventDefault();
                pos1 = pos3 - e.clientX;
                pos2 = pos4 - e.clientY;
                pos3 = e.clientX;
                pos4 = e.clientY;
                GUI.style.top = (GUI.offsetTop - pos2) + "px";
                GUI.style.left = (GUI.offsetLeft - pos1) + "px";
            });
        });

        let header = document.createElement('div');
        GUI.appendChild(header);
        header.style.width = '100%';
        header.style.height = '35px';
        header.style.paddingTop = '2px';
        header.style.fontSize = '1.5rem';
        header.style.textAlign = 'center'
        header.innerHTML = `Blooket Cheats <span style="font-size: 0.75rem">v4.10.22</span>`;

        let loop;

        let close = document.createElement('button');
        header.appendChild(close);
        close.style.background = 'red';
        close.style.height = '45px';
        close.style.width = '45px';
        close.style.border = 'none';
        close.style.cursor = 'pointer';
        close.style.position = 'absolute';
        close.style.top = '-10px';
        close.style.right = '-10px';
        close.style.fontSize = '1.5rem';
        close.style.borderRadius = '10px';
        close.style.fontFamily = 'Nunito';
        close.style.fontWeight = 'bolder';
        close.style.paddingTop = '10px';
        close.style.paddingRight = '15px';
        close.innerText = 'X';
        close.onclick = () => {
            GUI.remove();
            clearInterval(loop);
            removeEventListener('keypress', toggleHidden)
        }

        let minimize = document.createElement('button');
        header.appendChild(minimize);
        minimize.style.background = '#444444';
        minimize.style.height = '45px';
        minimize.style.width = '45px';
        minimize.style.border = 'none';
        minimize.style.cursor = 'pointer';
        minimize.style.position = 'absolute';
        minimize.style.top = '-10px';
        minimize.style.left = '-10px';
        minimize.style.fontSize = '1.5rem';
        minimize.style.borderRadius = '10px';
        minimize.style.fontFamily = 'Nunito';
        minimize.style.fontWeight = 'bolder';
        minimize.style.paddingTop = '10px';
        minimize.style.paddingLeft = '15px';
        minimize.innerText = '-';
        minimize.onclick = () => {
            bodyDiv.hidden = !bodyDiv.hidden;
        }
        let bodyDiv = document.createElement('div');
        let body = document.createElement('div');
        bodyDiv.appendChild(body);
        GUI.appendChild(bodyDiv);

        body.innerHTML = (`<span id="curPageEl">${getSite(true) ? `Current gamemode: ${getSite(true)}` : 'No game detected'}</span><br><span>(Press E to hide)</span><br>`);
        body.style.display = 'block';
        body.style.margin = '10px';
        //body.style.background = 'white';
        body.style.minHeight = '70px';

        let activeCheats = document.createElement('span');
        body.appendChild(activeCheats);

        document.body.append(GUI);

        let footer = document.createElement('div');
        bodyDiv.appendChild(footer);
        footer.style.fontSize = '0.9rem';
        footer.style.paddingBottom = '5px';
        footer.innerHTML = (`<span>GUI by @n0t_raf on Discord <br>Cheats by <a style="color: lightblue" href="https://twitter.com/glizuwu">gliz</a></span>`);

        var getValues = () => new Promise((e, t) => {
            try {
                let n = window.webpackJsonp.map(e => Object.keys(e[1]).map(t => e[1][t])).reduce((e, t) => [...e, ...t], []).find(e => /\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/.test(e.toString()) && /\(new TextEncoder\)\.encode\(\"(.+?)\"\)/.test(e.toString())).toString();
                e({
                    blooketBuild: n.match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)[0],
                    secret: n.match(/\(new TextEncoder\)\.encode\(\"(.+?)\"\)/)[1]
                })
            } catch {
                t("Could not fetch auth details")
            }
        })
        var encodeValues = async (e, t) => {
            let d = window.crypto.getRandomValues(new Uint8Array(12));
            return window.btoa(Array.from(d).map(e => String.fromCharCode(e)).join("") + Array.from(new Uint8Array(await window.crypto.subtle.encrypt({
                name: "AES-GCM",
                iv: d
            }, await window.crypto.subtle.importKey("raw", await window.crypto.subtle.digest("SHA-256", (new TextEncoder).encode(t)), {
                name: "AES-GCM"
            }, !1, ["encrypt"]), (new TextEncoder).encode(JSON.stringify(e))))).map(e => String.fromCharCode(e)).join(""))
        };

        function reactHandler() {
            return Object.values(document.querySelector('#app > div > div'))[1].children[1]._owner;
        }

        let autoAnswer, highlightAnswers, choiceESP, autoPassword, chestESP;

        let cheats = {
            global: {
                'Get Daily Rewards': () => {
                    fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
                        getValues().then(async e => {
                            fetch("https://api.blooket.com/api/users/add-rewards", {
                                method: "put",
                                credentials: "include",
                                headers: {
                                    "content-type": "application/json",
                                    "X-Blooket-Build": e.blooketBuild
                                },
                                body: await encodeValues({
                                    name: x.name,
                                    addedTokens: 250,
                                    addedXp: 300
                                }, e.secret)
                            });
                            fetch("https://api.blooket.com/api/users/add-rewards", {
                                method: "put",
                                credentials: "include",
                                headers: {
                                    "content-type": "application/json",
                                    "X-Blooket-Build": e.blooketBuild
                                },
                                body: await encodeValues({
                                    name: x.name,
                                    addedTokens: 250,
                                    addedXp: 300
                                }, e.secret)
                            }).then(() => alert('Added daily rewawrds!')).catch(() => alert('There was an error when adding rewards!'));;
                        }).catch(() => alert('There was an error encoding requests!'));
                    }).catch(() => alert('There was an error getting username!'));
                },
                'Spoof Blooks': () => {
                    if (!window.location.pathname.split('/').includes('lobby')) return alert('You must be in a game lobby! (e.g. https://www.blooket.com/play/lobby)');
                    reactHandler().stateNode.setState({ lockedBlooks: [], takenBlooks: [] });
                },
                'Toggle Auto Answer': () => { autoAnswer = !autoAnswer },
                'Toggle Highlight Answers': () => { highlightAnswers = !highlightAnswers },
                'Spam Open Boxes': () => {
                    let box = prompt(`Which box do you want to open? (e.g. Space)`);
                    let boxes = {
                        safari: 25,
                        aquatic: 20,
                        bot: 20,
                        space: 20,
                        breakfast: 15,
                        medieval: 15,
                        wonderland: 15
                    }
                    if (!Object.keys(boxes).includes(box.toLowerCase())) return alert('I could not find that box!');
                    let amount = prompt('How many boxes do you want to open?');
                    fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
                        if (x.tokens < boxes[box.toLowerCase()] * amount) amount = Math.floor(x.tokens / boxes[box.toLowerCase()]);
                        if (!amount) return alert('You do not have enough tokens!');
                        let wait = ms => new Promise(r => setTimeout(r, ms));
                        getValues().then(async e => {
                            let error = false,
                                blooks = [];
                            for (let i = 0; i < amount; i++) {
                                fetch("https://api.blooket.com/api/users/unlockblook", {
                                    method: "put",
                                    credentials: "include",
                                    headers: {
                                        "content-type": "application/json",
                                        "X-Blooket-Build": e.blooketBuild
                                    },
                                    body: await encodeValues({
                                        name: x.name,
                                        box: box.charAt(0).toUpperCase() + box.slice(1).toLowerCase()
                                    }, e.secret)
                                }).then(async x => {
                                    let blook = await x.json();
                                    blooks.push(blook.unlockedBlook);
                                    alert(`${blook.unlockedBlook} (${i + 1}/${amount})`);
                                }).catch(() => { error = true });
                                await wait(750);
                                if (error) break;
                            }
                            let count = {};
                            blooks.forEach(blook => { count[blook] = (count[blook] || 0) + 1 });
                            alert(`Results:\n` + Object.entries(count).map((x) => `    ${x[1]} ${x[0]}`).join(`\n`));
                        }).catch(() => alert('There was an error encoding requests!'));
                    }).catch(() => alert('There was an error getting username!'));
                },
                'Auto Sell Dupes': () => {
                    fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
                        let blooks = Object.entries(x.unlocks).map(x => [x[0], x[1] - 1]).filter(x => x[1] > 0);
                        let wait = ms => new Promise(r => setTimeout(r, ms));
                        getValues().then(async e => {
                            let error = false;
                            alert('Selling duplicate blooks, please wait');
                            for (let [blook, numSold] of blooks) {
                                fetch("https://api.blooket.com/api/users/sellblook", {
                                    method: "put",
                                    credentials: "include",
                                    headers: {
                                        "content-type": "application/json",
                                        "X-Blooket-Build": e.blooketBuild
                                    },
                                    body: await encodeValues({
                                        name: x.name,
                                        blook,
                                        numSold
                                    }, e.secret)
                                }).catch(() => { error = true });
                                await wait(750);
                                if (error) break;
                            }
                            alert(`Results:\n` + blooks.map((x) => `    ${x[1]} ${x[0]}`).join(`\n`));
                        }).catch(() => alert('There was an error encoding requests!'));
                    }).catch(() => alert('There was an error getting user data!'));
                }
            },
            cafe: {
                'Infinite Food': () => {
                    if (document.location.pathname != "/cafe") return alert("This cheat doesn't work in the shop!");
                    reactHandler().stateNode.state.foods.forEach(e => e.stock = 99999);
                    reactHandler().stateNode.forceUpdate();
                },
                'Max Levels': () => {
                    if (document.location.pathname != "/cafe/shop") return alert("This cheat only works in the shop!");
                    Object.keys(reactHandler().stateNode.state.items).forEach(x => reactHandler().stateNode.state.items[x] = 5);
                    reactHandler().stateNode.forceUpdate();
                },
                'Set Cash': () => {
                    reactHandler().stateNode.setState({ cafeCash: Number(parseFloat(prompt('How much cash would you like?'))) });
                },
                'Reset Abilities': () => {
                    Object.keys(reactHandler().stateNode.state.abilities).forEach(x => reactHandler().stateNode.state.abilities[x] = 5);
                    reactHandler().stateNode.forceUpdate();
                }
            },
            kingdom: {
                'Choice ESP': () => { choiceESP = !choiceESP },
                'Max Stats': () => {
                    reactHandler().stateNode.setState({ materials: 100, people: 100, happiness: 100, gold: 100 });
                },
                'Disable Toucan': () => {
                    reactHandler().stateNode.taxCounter = Number.MAX_VALUE;
                },
                'Set Guests': () => {
                    let guestScore = Number(parseFloat(prompt('How many guests do you want?')));
                    reactHandler().stateNode.setState({ guestScore });
                },
                'Skip Guest': () => {
                    reactHandler().stateNode.nextGuest();
                }
            },
            crypto: {
                'Auto Hack': () => { autoPassword = !autoPassword },
                'Set Crypto': () => {
                    let amount = Number(parseFloat(prompt('How much crypto do you want?')));
                    reactHandler().stateNode.setState({ crypto2: amount, crypto: amount });
                },
                'Custom Password': () => {
                    let password = Number(parseFloat(prompt('What do you want to set your password to?')));
                    reactHandler().stateNode.setState({ password });
                },
                'Remove Hack': () => {
                    reactHandler().stateNode.setState({ hack: '' })
                },
                'Reset Player\'s Crypto': () => {
                    let target = prompt("Name of player");
                    let e = reactHandler();
                    !target || e.memoizedProps.firebase.getDatabaseVal(e.memoizedProps.client.hostId, "c", (...o) => {
                        let data = Object.keys(o[0]);
                        if (data.some(e => e == target)) data.forEach(player => {
                            if (player == target) {
                                e.memoizedProps.firebase.setVal({
                                    id: e.memoizedProps.client.hostId,
                                    path: "c/" + e.memoizedProps.client.name,
                                    val: {
                                        p: e.stateNode.state.password,
                                        b: e.memoizedProps.client.blook,
                                        cr: e.stateNode.state.crypto,
                                        tat: player + ":" + (o[0][player].cr || 0)
                                    }
                                }); alert('Reset player\'s crypto')
                            };
                        });
                        else alert("Player does not exist");
                    })
                }
            },
            factory: {
                'All Mega Bot': () => {
                    let blooks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].fill({ name: "Mega Bot", color: "#d71f27", class: "🤖", rarity: "Legendary", cash: [80000, 430000, 4200000, 62000000, 1000000000], time: [5, 5, 3, 3, 3], price: [7000000, 120000000, 1900000000, 35000000000], active: false, level: 4, bonus: 5.5 })
                    reactHandler().stateNode.setState({ blooks });
                },
                'Remove Glitches': () => {
                    reactHandler().stateNode.setState({
                        glitch: "",
                        bites: 0,
                        ads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                        hazards: ["", "", "", "", ""],
                        lol: false,
                        joke: false,
                        slow: false,
                        dance: false,
                        popUpAmount: 0,
                    });
                },
                'Max Blooks': () => {
                    reactHandler().stateNode.state.blooks.forEach(blook => { blook.level = 4 });
                },
                'Set Cash': () => {
                    let cash = Number(parseFloat(prompt('How much cash do you want?')));
                    reactHandler().stateNode.setState({ cash });
                },
            },
            fishing: {
                'Set Weight': () => {
                    let weight = Number(parseFloat(prompt('How much weight do you want?')));
                    reactHandler().stateNode.setState({ weight2: weight, weight });
                },
                'Set Lure': () => {
                    let lure = Number(parseFloat(prompt('What do you want to set your lure to? (1 - 5)'))) - 1;
                    reactHandler().stateNode.setState({ lure: lure < 0 ? 0 : lure > 4 ? 4 : lure });
                }
            },
            gold: {
                'Set Gold': () => {
                    let gold = Number(parseFloat(prompt('How much gold do you want?')));
                    reactHandler().stateNode.setState({ gold2: gold, gold });
                },
                'Chest ESP': () => { chestESP = !chestESP },
                "Set Player's Gold": () => {
                    let e = reactHandler(),
                        player = prompt("Player to set gold"),
                        amount = Number(parseFloat(prompt("Amount to set gold to")));
                    e.memoizedProps.firebase.setVal({
                        id: e.memoizedProps.client.hostId,
                        path: "c/" + e.memoizedProps.client.name,
                        val: {
                            b: e.memoizedProps.client.blook,
                            g: e.stateNode.state.gold,
                            tat: player + ":swap:" + amount
                        }
                    })
                }
            },
            racing: {
                'Instant Win': () => {
                    reactHandler().stateNode.setState({ progress: reactHandler().stateNode.state.goalAmount });
                    setTimeout(() => {
                        try {
                            Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedState.question.correctAnswers[0])[0].click();
                        } catch {
                            try {
                                Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedProps.client.question.correctAnswers[0])[0].click();
                            } catch { };
                        };
                    }, 100);
                }
            },
            defense: {
                'Clear Enemies': () => {
                    reactHandler().stateNode.enemies = [];
                },
                'Max Towers': () => {
                    reactHandler().stateNode.towers.forEach(tower => {
                        tower.damage = 99999999;
                        tower.range = 99999999;
                        tower.fullCd = 0;
                    });
                },
                'Remove Ducks': () => {
                    data = reactHandler().stateNode;
                    data.ducks.forEach(x => { data.tiles[x.y][x.x] = 0; });
                    data.ducks.length = 0;
                },
                'Place Towers Anywhere': () => {
                    reactHandler().stateNode.tiles = reactHandler().stateNode.tiles.map(x => x.map(e => e == 2 ? 0 : e));
                },
                'Set Damage': () => {
                    let dmg = Number(parseFloat(prompt('How much damage do you want?')));
                    reactHandler().stateNode.dmg = dmg;
                },
                'Set Round': () => {
                    let round = Number(parseFloat(prompt('What round do you want to set it to?')));
                    reactHandler().stateNode.setState({ round });
                },
                'Set Tokens': () => {
                    let tokens = Number(parseFloat(prompt('How many tokens do you want?')));
                    reactHandler().stateNode.setState({ tokens });
                }
            },
            doom: {
                'Set Coins': () => {
                    try {
                        reactHandler().stateNode.props.setTowerCoins(Number(parseFloat(prompt('How many coins do you want?'))));
                    } catch { }
                },
                'Lower Enemy Stats': () => {
                    let data = reactHandler().stateNode.state;
                    if (data.phase != 'select') return alert('You must be on the attribute selection page!');
                    reactHandler().stateNode.setState({ enemyCard: { ...data.enemyCard, strength: 0, charisma: 0, wisdom: 0 } })
                },
                'Max Player Stats': () => {
                    let data = reactHandler().stateNode.state;
                    if (data.phase != 'select') return alert('You must be on the attribute selection page!');
                    reactHandler().stateNode.setState({ myCard: { ...data.myCard, strength: 20, charisma: 20, wisdom: 20 } })
                },
                'Heal Player': () => {
                    reactHandler().stateNode.setState({ myLife: 100 });
                }
            },
            rush: {
                'Set Defense': () => {
                    let e = reactHandler();
                    e.stateNode.props.firebase.setVal({
                        id: e.stateNode.props.client.hostId,
                        path: 'c/' + e.stateNode.props.client.name + '/d',
                        val: Number(parseFloat(prompt('How much defense do you want?')))
                    });
                },
                'Set Blooks': () => {
                    let e = reactHandler();
                    e.stateNode.props.firebase.setVal({
                        id: e.stateNode.props.client.hostId,
                        path: 'c/' + e.stateNode.props.client.name + '/bs',
                        val: Number(parseFloat(prompt('How many blooks do you want?')))
                    });
                }
            }
        };

        let global = document.createElement('details');
        global.innerHTML = (`<summary style="padding: 10px; font-size: 1.5em; font-weight: bolder">Global</summary>`);
        for (var i = 0; i < Object.keys(cheats.global).length; i++) {
            let cheat = createButton(Object.keys(cheats.global)[i]);
            cheat.onclick = cheats.global[Object.keys(cheats.global)[i]];
            global.appendChild(cheat);
        }
        global.open = true;
        global.style.paddingBottom = '10px';
        body.appendChild(global);

        let cheatDiv = document.createElement('div');
        body.appendChild(cheatDiv);

        loop = setInterval(() => {
            if (curPage != getSite()) {
                curPage = getSite();
                curPageEl.innerText = getSite(true) ? `Current gamemode: ${getSite(true)}` : 'No game detected'
                Array.from(cheatDiv.children).forEach(x => x.remove());
                if (curPage && cheats[curPage]) Object.keys(cheats[curPage]).forEach(cheat => {
                    let button = createButton(cheat);
                    button.onclick = cheats[curPage][cheat];
                    cheatDiv.appendChild(button);
                    cheatDiv.appendChild(document.createElement('br'));
                })
            };
            let activeCheatsText = (`Auto Answer: ${autoAnswer ? 'Enabled' : 'Disabled'}\nHighlight Answers: ${highlightAnswers ? 'Enabled' : 'Disabled'}${curPage == 'kingdom' ? `\nChoice ESP: ${choiceESP ? 'Enabled' : 'Disabled'}` : curPage == 'crypto' ? `\nAuto Hack: ${autoPassword ? 'Enabled' : 'Disabled'}` : curPage == 'gold' ? `\nChest ESP: ${chestESP ? 'Enabled' : 'Disabled'}` : ''}`);
            activeCheats.innerText != activeCheatsText && (activeCheats.innerText = activeCheatsText);
            if (autoAnswer) {
                try {
                    Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedState.question.correctAnswers[0])[0].click();
                } catch {
                    try {
                        Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedProps.client.question.correctAnswers[0])[0].click();
                    } catch { };
                };
            };
            if (highlightAnswers) {
                try {
                    Array.from(document.querySelector('div[class*="answersHolder"').children).forEach(x => {
                        if (reactHandler().memoizedState.question.correctAnswers.includes(x.innerText) || reactHandler().memoizedProps.client.question.correctAnswers.includes(x.innerText)) x.firstChild.style = 'background-color: rgb(0, 207, 119);';
                        else x.firstChild.style = 'background-color: rgb(225, 40, 33);';
                    });
                } catch { }
            };
            if (curPage == 'kingdom') {
                Array.from(document.getElementsByClassName('choiceESP')).forEach(x => x.remove())
                if (choiceESP) {
                    try {
                        let elements = {
                            materials: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('tree'))),
                            people: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('users') && e.parentElement.className.includes('statContainer'))),
                            happiness: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('grin'))),
                            gold: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('coins')))
                        }
                        let data = reactHandler().stateNode.state.guest;
                        Object.entries(data.yes).forEach(x => {
                            if (x[0] == 'msg') return;
                            let element = document.createElement('div');
                            element.className = 'choiceESP';
                            element.style = 'font-size: 24px; color: rgb(75, 194, 46); font-weight: bolder;';
                            element.innerText = String(x[1])
                            elements[x[0]].appendChild(element);
                        })
                        Object.entries(data.no).forEach(x => {
                            if (x[0] == 'msg') return;
                            let element = document.createElement('div');
                            element.className = 'choiceESP';
                            element.style = 'font-size: 24px; color: darkred; font-weight: bolder;';
                            element.innerText = String(x[1])
                            elements[x[0]].appendChild(element);
                        })
                    } catch (e) { }
                };
            }
            if (curPage == 'crypto' && autoPassword) {
                let { stage, correctPassword } = Object.values(document.querySelector('#app > div > div'))[1].children[1]._owner.stateNode.state;
                if (stage == "hack") Array.from(document.querySelectorAll('div')).filter(x => x.innerHTML == correctPassword)[0].click();
            };
            if (curPage == 'gold' && chestESP) {
                try {
                    if (reactHandler().stateNode.state.stage == 'prize') {
                        let { choices } = reactHandler().stateNode.state;
                        let div = document.querySelector("div[class*='regularBody']").children[1];
                        if (div) {
                            if (!document.querySelectorAll(".chest-esp").length) choices.forEach((box, i) => {
                                textElement = document.createElement('p');
                                textElement.className = "chest-esp";
                                textElement.innerText = box.text;
                                textElement.style = `text-align: center;
                    font-size: 30px;
                    color: white;
                    font-family:Titan One;
                    sans-serif;
                    border-color: black;
                    margin-top: 200px;`
                                try { div.children[i].appendChild(textElement); } catch (e) { console.log(e) }
                            });
                            else choices.forEach((box, i) => {
                                if (div.children.length == 3 && div.children[i].children[1].innerText != box.text) div.children[i].children[1].innerText = box.text;
                            })
                        }
                    }
                } catch (e) { console.log(e) }
            };
        });

        let curPage = getSite();
        if (curPage && cheats[curPage]) Object.keys(cheats[curPage]).forEach(cheat => {
            let button = createButton(cheat);
            button.onclick = cheats[curPage][cheat];
            cheatDiv.appendChild(button);
            cheatDiv.appendChild(document.createElement('br'));
        })

        function createButton(cheat) {
            let button = document.createElement('button');
            button.classList.add('cheat');
            button.innerText = cheat;
            return button
        }
        function getSite(capitalize) {
            switch (window.location.pathname.split('/')[2]) {
                case 'rush': return capitalize ? 'Blook Rush' : 'rush';
                case 'gold': return capitalize ? 'Gold Quest' : 'gold';
                case 'fishing': return capitalize ? 'Fishing Frenzy' : 'fishing';
                case 'hack': return capitalize ? 'Crypto Hack' : 'crypto';
                case 'battle-royale': return capitalize ? 'Battle Royale' : 'royale';
                case 'factory': return capitalize ? 'Factory' : 'factory';
                case 'racing': return capitalize ? 'Racing' : 'racing';
                case 'classic': return capitalize ? 'Classic' : 'classic';
                default: switch (window.location.pathname.split('/')[1]) {
                    case 'defense': return capitalize ? 'Tower Defense' : 'defense';
                    case 'cafe': return capitalize ? 'Café' : 'cafe';
                    case 'tower': return capitalize ? 'Tower of Doom' : 'doom';
                    case 'kingdom': return capitalize ? 'Crazy Kingdom' : 'kingdom';
                    default: return false;
                }
            };
        };
        function toggleHidden(e) {
            e.code == 'KeyE' && (GUI.hidden = !GUI.hidden)
        };
        addEventListener('keypress', toggleHidden);
    })()
})();