Skribbl.io Cheats

Updated as of 2025 April 11th CHECK BACK DAILY FOR UPDATES!

目前為 2025-04-11 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Skribbl.io Cheats
// @namespace    https://nohesi.lol
// @version      2025-04-12
// @description  Updated as of 2025 April 11th CHECK BACK DAILY FOR UPDATES!
// @author       bleh2rich
// @match        *://*.skribbl.io/*
// @icon         https://raw.githubusercontent.com/blmpsaa/skribbl/refs/heads/main/icon.jpg
// @license      Copyright (c) 2025 bleh2rich. All rights reserved.
// @grant unsafeWindow
// @run-at document-idle

// ==/UserScript==
javascript:(function() {
    const charWidthRatio = 0.6;
    const charHeightRatio = 1.0;
    const lineDelay = 30;
    const charSpacingFactor = 1.1;
    const lineSpacingFactor = 1.4;
    const spaceWidthFactor = 0.5;
    const maxLines = 10;
    const safetyMarginFactor = 0.9;
    const defaultAutoguessDelay = 1000;
    const wordDbResultsMaxHeight = '300px';

    const WORD_DATABASE_CSV_STRING = `word,count,
abs,3,
ace,3,
afk,3,
age,3,
air,3,
amp,3,
ant,3,
app,3,
arm,3,
art,3,
ash,3,
atv,3,
axe,3,
bad,3,
bag,3,
bar,3,
bat,3,
bay,3,
bed,3,
bee,3,
blt,3,
bmw,3,
bmx,3,
bot,3,
bow,3,
box,3,
boy,3,
bra,3,
bug,3,
bun,3,
bus,3,
can,3,
cap,3,
car,3,
cat,3,
cod,3,
cow,3,
cpu,3,
cry,3,
cup,3,
cut,3,
dab,3,
dam,3,
day,3,
den,3,
dew,3,
die,3,
dig,3,
dip,3,
dna,3,
dog,3,
dry,3,
dye,3,
ear,3,
eat,3,
eel,3,
egg,3,
elf,3,
elk,3,
emu,3,
end,3,
eye,3,
fan,3,
fat,3,
fig,3,
flu,3,
fly,3,
fog,3,
fox,3,
fry,3,
fur,3,
gag,3,
gap,3,
gas,3,
gem,3,
god,3,
gru,3,
gta,3,
gum,3,
gun,3,
ham,3,
hat,3,
hen,3,
hit,3,
hoe,3,
hop,3,
hot,3,
hug,3,
hut,3,
ice,3,
imp,3,
ink,3,
ivy,3,
jam,3,
jar,3,
jaw,3,
job,3,
joy,3,
jug,3,
keg,3,
key,3,
kfc,3,
lan,3,
lap,3,
lid,3,
log,3,
low,3,
mac,3,
man,3,
map,3,
moo,3,
mop,3,
mow,3,
mtv,3,
mud,3,
mug,3,
nba,3,
new,3,
nfl,3,
nod,3,
nun,3,
nut,3,
oak,3,
oar,3,
oil,3,
old,3,
owl,3,
pad,3,
pan,3,
paw,3,
pen,3,
pho,3,
pie,3,
pig,3,
pin,3,
pop,3,
pot,3,
pro,3,
pub,3,
pug,3,
rag,3,
ram,3,
rap,3,
rat,3,
red,3,
rib,3,
rim,3,
row,3,
rug,3,
run,3,
sad,3,
saw,3,
sea,3,
sew,3,
shy,3,
sip,3,
sit,3,
ski,3,
sky,3,
son,3,
soy,3,
spy,3,
sun,3,
suv,3,
tax,3,
tea,3,
tee,3,
tie,3,
tip,3,
toe,3,
toy,3,
tug,3,
ufo,3,
urn,3,
usa,3,
usb,3,
van,3,
war,3,
wax,3,
web,3,
wet,3,
wig,3,
wok,3,
wwe,3,
zoo,3,
abba,4,
acdc,4,
acid,4,
acne,4,
afro,4,
ammo,4,
arch,4,
army,4,
asia,4,
atom,4,
audi,4,
aunt,4,
baby,4,
back,4,
bait,4,
bald,4,
ball,4,
band,4,
bank,4,
bark,4,
barn,4,
base,4,
bass,4,
bath,4,
beak,4,
bean,4,
bear,4,
beef,4,
beer,4,
beet,4,
bell,4,
belt,4,
bend,4,
bill,4,
bird,4,
bite,4,
blow,4,
blue,4,
boar,4,
boat,4,
body,4,
boil,4,
bomb,4,
bone,4,
book,4,
boss,4,
bowl,4,
buff,4,
bull,4,
bump,4,
buoy,4,
burn,4,
burp,4,
bush,4,
cafe,4,
cage,4,
cake,4,
calf,4,
call,4,
camp,4,
cape,4,
card,4,
carp,4,
cart,4,
case,4,
cash,4,
cast,4,
cave,4,
cell,4,
cent,4,
chef,4,
chew,4,
chin,4,
chip,4,
chug,4,
city,4,
clam,4,
clap,4,
claw,4,
clay,4,
clip,4,
club,4,
coal,4,
coat,4,
code,4,
coin,4,
cola,4,
cold,4,
comb,4,
cone,4,
cook,4,
copy,4,
cord,4,
cork,4,
corn,4,
crab,4,
crow,4,
cuba,4,
cube,4,
cure,4,
cute,4,
dark,4,
dawn,4,
dead,4,
deaf,4,
deep,4,
deer,4,
dent,4,
derp,4,
desk,4,
dice,4,
diet,4,
dill,4,
dirt,4,
diva,4,
dive,4,
dock,4,
doge,4,
doll,4,
dome,4,
door,4,
dora,4,
dory,4,
dots,4,
dove,4,
down,4,
drag,4,
drip,4,
drug,4,
drum,4,
duck,4,
duel,4,
dumb,4,
dump,4,
dune,4,
dusk,4,
east,4,
echo,4,
edge,4,
elmo,4,
elsa,4,
exam,4,
exit,4,
face,4,
fall,4,
farm,4,
fart,4,
fast,4,
fern,4,
fifa,4,
file,4,
finn,4,
fire,4,
fish,4,
fizz,4,
flag,4,
flat,4,
flea,4,
flex,4,
flop,4,
flow,4,
foam,4,
foil,4,
fold,4,
food,4,
foot,4,
fork,4,
fort,4,
frog,4,
fuel,4,
full,4,
game,4,
gang,4,
gasp,4,
gate,4,
germ,4,
gift,4,
girl,4,
give,4,
glow,4,
glue,4,
goal,4,
goat,4,
gold,4,
golf,4,
gong,4,
good,4,
grey,4,
grid,4,
grin,4,
hail,4,
hair,4,
half,4,
halo,4,
hand,4,
hard,4,
harp,4,
head,4,
heat,4,
heel,4,
hell,4,
herd,4,
hero,4,
high,4,
hill,4,
hive,4,
hold,4,
hole,4,
hood,4,
hoof,4,
hook,4,
horn,4,
hose,4,
hour,4,
hulk,4,
hurt,4,
idea,4,
ikea,4,
ipad,4,
iran,4,
iron,4,
itch,4,
jail,4,
jaws,4,
jayz,4,
jazz,4,
jedi,4,
jeep,4,
jump,4,
kick,4,
kill,4,
kilt,4,
king,4,
kiss,4,
kite,4,
kiwi,4,
knee,4,
knot,4,
koto,4,
lady,4,
lake,4,
lamb,4,
lamp,4,
lane,4,
lava,4,
lead,4,
leaf,4,
leak,4,
leek,4,
left,4,
lego,4,
legs,4,
lens,4,
liar,4,
lily,4,
lime,4,
line,4,
link,4,
lion,4,
lips,4,
list,4,
loaf,4,
lock,4,
logo,4,
loki,4,
long,4,
look,4,
loop,4,
loot,4,
loss,4,
loud,4,
love,4,
luck,4,
lung,4,
lute,4,
lynx,4,
mace,4,
maid,4,
mail,4,
mall,4,
mane,4,
mars,4,
mask,4,
math,4,
maze,4,
meal,4,
mean,4,
meat,4,
melt,4,
meme,4,
menu,4,
milk,4,
mime,4,
mint,4,
mist,4,
moat,4,
mold,4,
mole,4,
monk,4,
moon,4,
moss,4,
moth,4,
mule,4,
nail,4,
nasa,4,
navy,4,
neck,4,
nemo,4,
nerd,4,
nest,4,
news,4,
nike,4,
noob,4,
noon,4,
nose,4,
note,4,
nuke,4,
ogre,4,
olaf,4,
open,4,
orca,4,
oreo,4,
oval,4,
oven,4,
page,4,
pain,4,
pair,4,
palm,4,
park,4,
path,4,
pear,4,
peas,4,
peru,4,
pike,4,
pill,4,
pine,4,
pink,4,
pipe,4,
plow,4,
plug,4,
poke,4,
polo,4,
pond,4,
pong,4,
pony,4,
pool,4,
poop,4,
poor,4,
pope,4,
pork,4,
port,4,
pray,4,
pull,4,
puma,4,
pump,4,
punk,4,
purr,4,
push,4,
race,4,
raft,4,
rage,4,
rail,4,
rain,4,
rake,4,
ramp,4,
rare,4,
read,4,
reed,4,
rest,4,
rice,4,
rich,4,
rick,4,
ring,4,
riot,4,
ripe,4,
risk,4,
road,4,
robe,4,
rock,4,
roll,4,
rome,4,
roof,4,
room,4,
root,4,
rope,4,
rose,4,
ruby,4,
rune,4,
safe,4,
sale,4,
salt,4,
sand,4,
save,4,
scar,4,
seal,4,
seat,4,
seed,4,
shin,4,
ship,4,
shoe,4,
shop,4,
sick,4,
sign,4,
silo,4,
sing,4,
sink,4,
skin,4,
slam,4,
sled,4,
slip,4,
slow,4,
smug,4,
snow,4,
soap,4,
soda,4,
soil,4,
song,4,
soot,4,
soup,4,
spam,4,
spin,4,
spit,4,
spot,4,
spur,4,
stab,4,
star,4,
stem,4,
step,4,
stew,4,
stop,4,
suck,4,
suit,4,
sumo,4,
swag,4,
swan,4,
taco,4,
tail,4,
talk,4,
tall,4,
tank,4,
tape,4,
taxi,4,
team,4,
tear,4,
tent,4,
text,4,
thin,4,
thor,4,
thug,4,
tide,4,
tile,4,
tiny,4,
tipi,4,
tire,4,
toad,4,
tofu,4,
tomb,4,
tool,4,
town,4,
trap,4,
tray,4,
tree,4,
trex,4,
trip,4,
tuba,4,
tuna,4,
turd,4,
turn,4,
tutu,4,
twig,4,
type,4,
undo,4,
vape,4,
vase,4,
veil,4,
vein,4,
vent,4,
vest,4,
vine,4,
vise,4,
vote,4,
walk,4,
wall,4,
warm,4,
wart,4,
wash,4,
wasp,4,
wave,4,
weak,4,
well,4,
west,4,
whip,4,
wife,4,
wind,4,
wine,4,
wing,4,
wink,4,
wire,4,
wish,4,
wlan,4,
wolf,4,
wood,4,
wool,4,
work,4,
worm,4,
wrap,4,
xbox,4,
yarn,4,
yawn,4,
year,4,
yeti,4,
yoda,4,
yoga,4,
yolk,4,
zeus,4,
zoom,4,
zuma,4,
above,5,
abyss,5,
ac/dc,5,
acorn,5,
actor,5,
adult,5,
alarm,5,
algae,5,
alien,5,
alley,5,
alone,5,
amber,5,
angel,5,
angry,5,
anime,5,
ankle,5,
anvil,5,
apple,5,
apron,5,
armor,5,
arrow,5,
attic,5,
award,5,
bacon,5,
bagel,5,
bambi,5,
banjo,5,
basil,5,
beach,5,
beans,5,
beard,5,
belly,5,
below,5,
bench,5,
beret,5,
bible,5,
bidet,5,
biker,5,
bingo,5,
birch,5,
bison,5,
black,5,
blaze,5,
blimp,5,
blind,5,
bling,5,
block,5,
blood,5,
blush,5,
board,5,
bongo,5,
boots,5,
bored,5,
boxer,5,
braid,5,
brain,5,
brake,5,
brand,5,
brawl,5,
bread,5,
break,5,
brick,5,
bride,5,
broom,5,
brown,5,
brush,5,
bulge,5,
bully,5,
bunny,5,
cabin,5,
cable,5,
camel,5,
canal,5,
candy,5,
canoe,5,
cargo,5,
catan,5,
cello,5,
chain,5,
chair,5,
chalk,5,
chaos,5,
check,5,
cheek,5,
chess,5,
chest,5,
child,5,
chile,5,
chili,5,
chime,5,
china,5,
chips,5,
cigar,5,
clamp,5,
clean,5,
clerk,5,
click,5,
cliff,5,
climb,5,
cloak,5,
clock,5,
clogs,5,
close,5,
cloth,5,
cloud,5,
clown,5,
coach,5,
coast,5,
cobra,5,
cocoa,5,
coder,5,
comet,5,
coral,5,
corgi,5,
couch,5,
court,5,
cover,5,
crack,5,
crate,5,
crawl,5,
crazy,5,
cream,5,
creek,5,
creep,5,
crime,5,
cross,5,
crowd,5,
crown,5,
crumb,5,
crust,5,
cupid,5,
curry,5,
dairy,5,
daisy,5,
dance,5,
darts,5,
death,5,
demon,5,
devil,5,
diary,5,
dirty,5,
dizzy,5,
donut,5,
dough,5,
drain,5,
drama,5,
dream,5,
dress,5,
drift,5,
drill,5,
drink,5,
drive,5,
drool,5,
drown,5,
drunk,5,
dryer,5,
dumbo,5,
dunes,5,
dwarf,5,
eagle,5,
earth,5,
egypt,5,
elbow,5,
elder,5,
email,5,
emoji,5,
empty,5,
error,5,
fairy,5,
fanta,5,
fence,5,
ferry,5,
fever,5,
field,5,
flash,5,
flask,5,
float,5,
flock,5,
flood,5,
floor,5,
floss,5,
flour,5,
fluid,5,
flush,5,
flute,5,
force,5,
frame,5,
fresh,5,
fries,5,
front,5,
frown,5,
fruit,5,
fudge,5,
funny,5,
furry,5,
gamer,5,
gecko,5,
genie,5,
ghost,5,
ghoul,5,
giant,5,
glass,5,
globe,5,
gloss,5,
glove,5,
gnome,5,
golem,5,
goofy,5,
goose,5,
gourd,5,
grain,5,
graph,5,
grass,5,
grave,5,
gravy,5,
greed,5,
green,5,
grill,5,
grits,5,
groan,5,
groom,5,
group,5,
growl,5,
guard,5,
guiro,5,
gummy,5,
hades,5,
hairy,5,
happy,5,
hatch,5,
heart,5,
hedge,5,
heist,5,
hijab,5,
hippo,5,
honda,5,
honey,5,
horse,5,
hotel,5,
house,5,
hydra,5,
hyena,5,
idiot,5,
india,5,
intel,5,
italy,5,
japan,5,
jeans,5,
jello,5,
jelly,5,
jenga,5,
joker,5,
judge,5,
juice,5,
kayak,5,
kazoo,5,
kebab,5,
kirby,5,
kneel,5,
knife,5,
koala,5,
label,5,
ladle,5,
laser,5,
lasso,5,
laugh,5,
leash,5,
leave,5,
leech,5,
lemon,5,
lemur,5,
level,5,
light,5,
limbo,5,
liver,5,
llama,5,
lobby,5,
lorry,5,
loser,5,
luigi,5,
lunch,5,
macho,5,
mafia,5,
magic,5,
magma,5,
mango,5,
march,5,
mario,5,
match,5,
mayor,5,
medal,5,
melon,5,
merch,5,
messy,5,
metal,5,
metro,5,
miner,5,
model,5,
money,5,
moose,5,
morty,5,
mouse,5,
mouth,5,
movie,5,
muddy,5,
mummy,5,
music,5,
nepal,5,
niece,5,
night,5,
ninja,5,
noise,5,
north,5,
notch,5,
novel,5,
nurse,5,
oasis,5,
ocean,5,
olive,5,
onion,5,
opera,5,
orbit,5,
organ,5,
otter,5,
ozone,5,
paint,5,
panda,5,
pants,5,
paper,5,
paris,5,
party,5,
pasta,5,
patio,5,
pause,5,
peace,5,
peach,5,
pearl,5,
pecan,5,
pedal,5,
penne,5,
penny,5,
pepsi,5,
petal,5,
phone,5,
photo,5,
piano,5,
pidal,5,
pidel,5,
pilot,5,
pinky,5,
pixel,5,
pizza,5,
place,5,
plane,5,
plank,5,
plant,5,
plate,5,
pluto,5,
point,5,
poker,5,
poppy,5,
porch,5,
pound,5,
power,5,
prawn,5,
press,5,
price,5,
prime,5,
prism,5,
prize,5,
prune,5,
pumba,5,
punch,5,
puppy,5,
purse,5,
pylon,5,
queen,5,
queue,5,
quiet,5,
quill,5,
quilt,5,
radar,5,
radio,5,
ramen,5,
razor,5,
reeds,5,
rifle,5,
right,5,
river,5,
robin,5,
robot,5,
rodeo,5,
rolex,5,
rough,5,
round,5,
royal,5,
ruler,5,
salad,5,
salsa,5,
santa,5,
satan,5,
sauce,5,
sauna,5,
scale,5,
scarf,5,
scary,5,
scent,5,
scoop,5,
score,5,
screw,5,
scuba,5,
seoul,5,
sewer,5,
shake,5,
shape,5,
share,5,
shark,5,
shave,5,
sheep,5,
sheet,5,
shelf,5,
shell,5,
shirt,5,
shock,5,
shoot,5,
short,5,
shout,5,
shrek,5,
shrew,5,
shrub,5,
shrug,5,
siren,5,
sitar,5,
skirt,5,
skull,5,
skunk,5,
skype,5,
slave,5,
sleep,5,
slide,5,
slime,5,
slope,5,
sloth,5,
slump,5,
smart,5,
smell,5,
smile,5,
smoke,5,
snack,5,
snail,5,
snake,5,
socks,5,
sonic,5,
sound,5,
south,5,
space,5,
spade,5,
spain,5,
spank,5,
spark,5,
spear,5,
speed,5,
spend,5,
spicy,5,
spill,5,
spine,5,
spool,5,
spoon,5,
spore,5,
spray,5,
squat,5,
squid,5,
staff,5,
stage,5,
stain,5,
stamp,5,
stand,5,
start,5,
steak,5,
steal,5,
steam,5,
stick,5,
sting,5,
stink,5,
stock,5,
stone,5,
stool,5,
store,5,
stork,5,
storm,5,
stove,5,
straw,5,
study,5,
stump,5,
sugar,5,
sunny,5,
sushi,5,
swamp,5,
swarm,5,
sweat,5,
swing,5,
swobd,5,
sword,5,
t-rex,5,
table,5,
tails,5,
taser,5,
tesla,5,
texas,5,
thick,5,
thief,5,
thigh,5,
think,5,
thorn,5,
thumb,5,
tibet,5,
tiger,5,
tired,5,
title,5,
toast,5,
tokyo,5,
tooth,5,
torch,5,
torso,5,
totem,5,
touch,5,
towel,5,
tower,5,
toxic,5,
track,5,
trade,5,
trail,5,
train,5,
trash,5,
trend,5,
troll,5,
truck,5,
trump,5,
trunk,5,
tulip,5,
tumor,5,
twins,5,
udder,5,
uluru,5,
uncle,5,
vault,5,
venus,5,
video,5,
vinyl,5,
viola,5,
virus,5,
vodka,5,
vomit,5,
w-lan,5,
waist,5,
wales,5,
wario,5,
watch,5,
water,5,
whale,5,
wheat,5,
wheel,5,
whisk,5,
white,5,
whole,5,
wifel,5,
witch,5,
woman,5,
world,5,
wound,5,
wrist,5,
x-ray,5,
xerox,5,
yacht,5,
yo-yo,5,
yoshi,5,
young,5,
zebra,5,
zelda,5,
zorro,5,
abacus,6,
action,6,
adidas,6,
africa,6,
airbag,6,
alaska,6,
almond,6,
alpaca,6,
amazon,6,
anchor,6,
anubis,6,
archer,6,
arctic,6,
armpit,6,
artery,6,
artist,6,
athena,6,
athens,6,
author,6,
autumn,6,
baboon,6,
badger,6,
bakery,6,
ballet,6,
bamboo,6,
banana,6,
banker,6,
banner,6,
barber,6,
barrel,6,
basket,6,
batman,6,
battle,6,
beanie,6,
beaver,6,
beetle,6,
beggar,6,
bellow,6,
berlin,6,
betray,6,
biceps,6,
bikini,6,
bleach,6,
blouse,6,
bonnet,6,
bonsai,6,
booger,6,
border,6,
bottle,6,
bottom,6,
bounce,6,
bowser,6,
boxcar,6,
boxing,6,
braces,6,
branch,6,
brazil,6,
breath,6,
bridge,6,
broken,6,
bronze,6,
bruise,6,
bubble,6,
bucket,6,
buddha,6,
buffer,6,
buffet,6,
bullet,6,
bumper,6,
bunker,6,
butler,6,
butter,6,
button,6,
cactus,6,
camera,6,
canada,6,
canary,6,
cancer,6,
candle,6,
cannon,6,
canyon,6,
carbon,6,
carpet,6,
carrot,6,
cashew,6,
casino,6,
castle,6,
casual,6,
cavern,6,
caviar,6,
cement,6,
center,6,
cereal,6,
cheeks,6,
cheers,6,
cheese,6,
cherry,6,
chorus,6,
chrome,6,
church,6,
cicada,6,
cinema,6,
circle,6,
circus,6,
clinic,6,
closed,6,
closet,6,
cloudy,6,
clover,6,
cobweb,6,
cocoon,6,
coffee,6,
coffin,6,
collar,6,
comedy,6,
cookie,6,
copper,6,
corner,6,
corpse,6,
cotton,6,
couple,6,
cousin,6,
cowboy,6,
coyote,6,
cradle,6,
crayon,6,
credit,6,
cringe,6,
cruise,6,
crunch,6,
cuckoo,6,
cyborg,6,
cymbal,6,
dagger,6,
damage,6,
danish,6,
dantdm,6,
darwin,6,
degree,6,
desert,6,
dexter,6,
diaper,6,
dinner,6,
dishes,6,
doctor,6,
dollar,6,
donkey,6,
double,6,
dragon,6,
drawer,6,
driver,6,
earwax,6,
easter,6,
eclair,6,
embers,6,
eminem,6,
engine,6,
eraser,6,
eskimo,6,
europe,6,
eyelid,6,
fabric,6,
facade,6,
falcon,6,
family,6,
farmer,6,
father,6,
faucet,6,
ferret,6,
filter,6,
finger,6,
flight,6,
flower,6,
folder,6,
follow,6,
forest,6,
formal,6,
fossil,6,
france,6,
fridge,6,
friend,6,
fungus,6,
future,6,
galaxy,6,
gandhi,6,
garage,6,
garden,6,
garlic,6,
gender,6,
genius,6,
gentle,6,
geyser,6,
ginger,6,
glider,6,
gloves,6,
goalie,6,
goatee,6,
goblin,6,
google,6,
gopher,6,
grapes,6,
gravel,6,
grease,6,
greece,6,
grinch,6,
grumpy,6,
guitar,6,
gutter,6,
hacker,6,
hammer,6,
handle,6,
hanger,6,
harbor,6,
hawaii,6,
hazard,6,
health,6,
hearse,6,
hearth,6,
heaven,6,
height,6,
helium,6,
helmet,6,
hermes,6,
hermit,6,
hiking,6,
hippie,6,
hobbit,6,
hockey,6,
hoodie,6,
hunger,6,
hunter,6,
hurdle,6,
icicle,6,
ignite,6,
iguana,6,
impact,6,
impale,6,
injury,6,
insane,6,
insect,6,
inside,6,
intern,6,
iphone,6,
island,6,
israel,6,
jacket,6,
jaguar,6,
jersey,6,
jester,6,
juggle,6,
juicer,6,
jungle,6,
karate,6,
katana,6,
kermit,6,
kettle,6,
keypad,6,
kidney,6,
kitten,6,
knight,6,
kraken,6,
ladder,6,
laptop,6,
lawyer,6,
leader,6,
lizard,6,
locker,6,
london,6,
lotion,6,
lounge,6,
louvre,6,
luxury,6,
lyrics,6,
magnet,6,
makeup,6,
mallet,6,
mantis,6,
manure,6,
marble,6,
marker,6,
market,6,
marmot,6,
mascot,6,
meadow,6,
median,6,
medusa,6,
memory,6,
meteor,6,
mexico,6,
middle,6,
minion,6,
minute,6,
mirage,6,
mirror,6,
modern,6,
mohawk,6,
monday,6,
monkey,6,
moscow,6,
mother,6,
mozart,6,
muffin,6,
muscle,6,
museum,6,
musket,6,
nachos,6,
napkin,6,
narnia,6,
nascar,6,
nature,6,
needle,6,
nephew,6,
nether,6,
nickel,6,
noodle,6,
norway,6,
nugget,6,
nutmeg,6,
obelix,6,
ocelot,6,
office,6,
omelet,6,
online,6,
orange,6,
orchid,6,
outlaw,6,
outlet,6,
oxygen,6,
oyster,6,
pacman,6,
paddle,6,
palace,6,
panini,6,
pantry,6,
papaya,6,
parade,6,
parrot,6,
pastry,6,
paypal,6,
peanut,6,
pebble,6,
pencil,6,
pepper,6,
period,6,
person,6,
pickle,6,
picnic,6,
pigeon,6,
pigsty,6,
pillar,6,
pillow,6,
pimple,6,
pinata,6,
pirate,6,
pistol,6,
piston,6,
plague,6,
plains,6,
planet,6,
player,6,
pocket,6,
poison,6,
poland,6,
police,6,
pollen,6,
poodle,6,
popeye,6,
portal,6,
possum,6,
poster,6,
potato,6,
potion,6,
powder,6,
preach,6,
priest,6,
prince,6,
prison,6,
profit,6,
puddle,6,
puffin,6,
pulley,6,
puppet,6,
purity,6,
purple,6,
puzzle,6,
python,6,
quiche,6,
quokka,6,
radish,6,
raisin,6,
rapier,6,
rapper,6,
rattle,6,
reaper,6,
recipe,6,
record,6,
reddit,6,
remote,6,
repeat,6,
resort,6,
retail,6,
rewind,6,
ribbon,6,
robber,6,
roblox,6,
rocket,6,
rotten,6,
rubber,6,
russia,6,
saddle,6,
safari,6,
sailor,6,
salami,6,
saliva,6,
salmon,6,
salute,6,
saturn,6,
scales,6,
school,6,
scream,6,
screen,6,
scroll,6,
scythe,6,
search,6,
season,6,
second,6,
seesaw,6,
segway,6,
selfie,6,
sensei,6,
sensor,6,
serbia,6,
server,6,
shades,6,
shadow,6,
shaggy,6,
shield,6,
shogun,6,
shorts,6,
shovel,6,
shower,6,
shrimp,6,
signal,6,
silver,6,
skates,6,
skinny,6,
sledge,6,
sleeve,6,
slinky,6,
sneeze,6,
sniper,6,
snoopy,6,
soccer,6,
socket,6,
speech,6,
sphinx,6,
spider,6,
spiral,6,
sponge,6,
sports,6,
spread,6,
spring,6,
sprite,6,
sprout,6,
square,6,
squash,6,
squeal,6,
stable,6,
stalin,6,
statue,6,
stereo,6,
stitch,6,
stoned,6,
street,6,
stress,6,
strong,6,
studio,6,
stylus,6,
subway,6,
sudoku,6,
summer,6,
sweden,6,
switch,6,
tablet,6,
tailor,6,
tampon,6,
target,6,
tarzan,6,
tattoo,6,
teapot,6,
tennis,6,
tetris,6,
thanos,6,
thirst,6,
throat,6,
throne,6,
ticket,6,
tickle,6,
tiktok,6,
tinsel,6,
tissue,6,
toilet,6,
tomato,6,
tongue,6,
totoro,6,
toucan,6,
toyota,6,
tripod,6,
trophy,6,
tundra,6,
tunnel,6,
turban,6,
turkey,6,
turnip,6,
turtle,6,
tuxedo,6,
tweety,6,
twitch,6,
uganda,6,
uranus,6,
vacuum,6,
valley,6,
vanish,6,
vector,6,
victim,6,
violet,6,
violin,6,
vision,6,
volume,6,
voodoo,6,
vortex,6,
waffle,6,
waiter,6,
wall-e,6,
walnut,6,
walrus,6,
wasabi,6,
wealth,6,
weapon,6,
weasel,6,
weight,6,
welder,6,
wiggle,6,
willow,6,
window,6,
winner,6,
winter,6,
wizard,6,
wreath,6,
wrench,6,
writer,6,
yellow,6,
yogurt,6,
zigzag,6,
zipper,6,
zombie,6,
actress,7,
airpods,7,
airport,7,
airship,7,
aladdin,7,
alcohol,7,
algeria,7,
allergy,7,
america,7,
anatomy,7,
anchovy,7,
ancient,7,
android,7,
antenna,7,
anthill,7,
antlers,7,
apricot,7,
aquaman,7,
ashtray,7,
assault,7,
asterix,7,
athlete,7,
austria,7,
average,7,
avocado,7,
bahamas,7,
baklava,7,
balance,7,
balcony,7,
balloon,7,
bandage,7,
bandaid,7,
bandana,7,
barcode,7,
barrier,7,
bathtub,7,
battery,7,
bayonet,7,
bazooka,7,
beatbox,7,
bed bug,7,
bedroom,7,
bedtime,7,
beijing,7,
bicycle,7,
big ben,7,
bigfoot,7,
biology,7,
biscuit,7,
bitcoin,7,
blanket,7,
blender,7,
blossom,7,
blow up,7,
bobsled,7,
booklet,7,
boulder,7,
bouncer,7,
bouquet,7,
bow tie,7,
bowling,7,
braille,7,
britain,7,
brownie,7,
buffalo,7,
burglar,7,
burrito,7,
butcher,7,
cabbage,7,
cabinet,7,
camping,7,
capsule,7,
captain,7,
capture,7,
caramel,7,
cartoon,7,
cashier,7,
catalog,7,
catfish,7,
caveman,7,
ceiling,7,
centaur,7,
charger,7,
cheetah,7,
cheetos,7,
chicken,7,
chimney,7,
circuit,7,
climber,7,
clothes,7,
coaster,7,
coconut,7,
college,7,
cologne,7,
company,7,
compass,7,
concert,7,
console,7,
cookout,7,
copycat,7,
corrida,7,
country,7,
cowbell,7,
cracker,7,
creeper,7,
cricket,7,
croatia,7,
crowbar,7,
crystal,7,
cupcake,7,
curtain,7,
cushion,7,
cyclist,7,
defense,7,
denmark,7,
dentist,7,
dessert,7,
diagram,7,
diamond,7,
diploma,7,
discord,7,
disease,7,
dishrag,7,
display,7,
diverge,7,
divorce,7,
dogfish,7,
dolphin,7,
doormat,7,
doritos,7,
dracula,7,
droplet,7,
drought,7,
earbuds,7,
echidna,7,
eclipse,7,
ellipse,7,
emerald,7,
england,7,
equator,7,
evening,7,
excited,7,
exhaust,7,
explode,7,
extinct,7,
eyebrow,7,
eyelash,7,
factory,7,
failure,7,
falafel,7,
fallout,7,
feather,7,
fencing,7,
ferrari,7,
finland,7,
firefly,7,
firefox,7,
fireman,7,
flicker,7,
florida,7,
florist,7,
forearm,7,
fortune,7,
freezer,7,
frisbee,7,
frogger,7,
funeral,7,
furious,7,
furnace,7,
gallery,7,
gandalf,7,
garbage,7,
germany,7,
giraffe,7,
give up,7,
glacier,7,
glasses,7,
glitter,7,
goddess,7,
gondola,7,
gorilla,7,
gravity,7,
grenade,7,
griffin,7,
grow up,7,
gumball,7,
haircut,7,
hallway,7,
hammock,7,
hamster,7,
hangman,7,
harpoon,7,
hashtag,7,
haunted,7,
heading,7,
healthy,7,
hexagon,7,
highway,7,
hip hop,7,
holiday,7,
horizon,7,
hot dog,7,
hungary,7,
husband,7,
iceberg,7,
ireland,7,
janitor,7,
jealous,7,
jet ski,7,
journey,7,
jupiter,7,
karaoke,7,
kendama,7,
ketchup,7,
kingdom,7,
kitchen,7,
knuckle,7,
koolaid,7,
kung fu,7,
ladybug,7,
lantern,7,
lasagna,7,
laundry,7,
leather,7,
leopard,7,
lettuce,7,
library,7,
license,7,
lighter,7,
lilypad,7,
loading,7,
lobster,7,
lottery,7,
luggage,7,
machete,7,
machine,7,
mailbox,7,
mailman,7,
mammoth,7,
manatee,7,
manhole,7,
mansion,7,
maracas,7,
marimba,7,
marines,7,
mascara,7,
massage,7,
measure,7,
meerkat,7,
mercury,7,
mermaid,7,
message,7,
milkman,7,
minivan,7,
missile,7,
monocle,7,
monster,7,
morning,7,
morocco,7,
mr bean,7,
mugshot,7,
mustard,7,
narwhal,7,
neptune,7,
netflix,7,
network,7,
notepad,7,
nothing,7,
nuclear,7,
nutella,7,
oatmeal,7,
ocarina,7,
octagon,7,
octopus,7,
offline,7,
orchard,7,
origami,7,
ostrich,7,
outside,7,
pac-man,7,
pacific,7,
package,7,
pajamas,7,
palette,7,
pancake,7,
panther,7,
parasol,7,
parents,7,
parking,7,
parsley,7,
pasture,7,
patient,7,
patrick,7,
patriot,7,
peacock,7,
peasant,7,
pegasus,7,
pelican,7,
penguin,7,
perfume,7,
pharaoh,7,
phoenix,7,
pianist,7,
picasso,7,
pickaxe,7,
pikachu,7,
pinball,7,
pitcher,7,
plastic,7,
plumber,7,
plunger,7,
pokemon,7,
polygon,7,
pompeii,7,
popcorn,7,
popular,7,
porsche,7,
pothole,7,
pottery,7,
poutine,7,
present,7,
pretzel,7,
printer,7,
protect,7,
protein,7,
protest,7,
provoke,7,
puberty,7,
pudding,7,
pumpkin,7,
pyramid,7,
quarter,7,
raccoon,7,
racecar,7,
rainbow,7,
ravioli,7,
reality,7,
receipt,7,
red sea,7,
referee,7,
reptile,7,
rhombus,7,
romance,7,
romania,7,
rooster,7,
samsung,7,
samurai,7,
sandals,7,
sandbox,7,
sausage,7,
scalpel,7,
science,7,
scratch,7,
seafood,7,
seagull,7,
seasick,7,
seaweed,7,
section,7,
seizure,7,
seltzer,7,
shallow,7,
shampoo,7,
sheriff,7,
shoebox,7,
shooter,7,
shotgun,7,
siberia,7,
silence,7,
skyline,7,
snowman,7,
soldier,7,
somalia,7,
spatula,7,
speaker,7,
spinach,7,
spoiler,7,
spotify,7,
stadium,7,
stapler,7,
sticker,7,
stomach,7,
stubble,7,
student,7,
suburbs,7,
sunburn,7,
sunrise,7,
surface,7,
surgeon,7,
sweater,7,
swimmer,7,
t-shirt,7,
tadpole,7,
tangled,7,
tea bag,7,
teacher,7,
theatre,7,
thunder,7,
timpani,7,
tinfoil,7,
titanic,7,
toaster,7,
toddler,7,
toenail,7,
tom cat,7,
toolbox,7,
top hat,7,
tornado,7,
torpedo,7,
tourist,7,
tractor,7,
traffic,7,
trailer,7,
trigger,7,
trumpet,7,
tsunami,7,
tugboat,7,
twitter,7,
ukraine,7,
ukulele,7,
unibrow,7,
unicorn,7,
uniform,7,
upgrade,7,
vaccine,7,
vampire,7,
vanilla,7,
vatican,7,
vehicle,7,
victory,7,
vietnam,7,
village,7,
villain,7,
vinegar,7,
vitamin,7,
vlogger,7,
volcano,7,
vulture,7,
wake up,7,
waluigi,7,
warning,7,
warrior,7,
weather,7,
website,7,
wedding,7,
western,7,
wetsuit,7,
whiskey,7,
whisper,7,
whistle,7,
windows,7,
wingnut,7,
witness,7,
workout,7,
woutube,7,
wrinkle,7,
yahtzee,7,
youtube,7,
zipline,7,
aardvark,8,
abstract,8,
accident,8,
addition,8,
adorable,8,
air horn,8,
aircraft,8,
airplane,8,
alphabet,8,
aluminum,8,
among us,8,
anaconda,8,
anteater,8,
antelope,8,
applause,8,
aquarium,8,
armchair,8,
assassin,8,
asterisk,8,
asteroid,8,
atlantic,8,
atlantis,8,
audience,8,
bachelor,8,
backbone,8,
backflip,8,
backpack,8,
bagpipes,8,
baguette,8,
ballroom,8,
band-aid,8,
bankrupt,8,
barbecue,8,
baseball,8,
basement,8,
bathrobe,8,
bathroom,8,
bean bag,8,
birdcage,8,
birthday,8,
blizzard,8,
blowfish,8,
bob ross,8,
bookmark,8,
bracelet,8,
broadway,8,
broccoli,8,
brunette,8,
building,8,
bullseye,8,
bunk bed,8,
bus stop,8,
calamari,8,
calendar,8,
campfire,8,
canister,8,
car wash,8,
cardinal,8,
carnival,8,
catapult,8,
cauldron,8,
cerberus,8,
chainsaw,8,
champion,8,
checkers,8,
chemical,8,
chestnut,8,
chipmunk,8,
chlorine,8,
cinnamon,8,
clarinet,8,
cocktail,8,
colander,8,
collapse,8,
colombia,8,
comedian,8,
complete,8,
composer,8,
computer,8,
concrete,8,
conflict,8,
confused,8,
contrast,8,
converge,8,
corn dog,8,
crayfish,8,
crescent,8,
criminal,8,
crossbow,8,
crucible,8,
cucumber,8,
cupboard,8,
currency,8,
customer,8,
cylinder,8,
dandruff,8,
daughter,8,
daydream,8,
dead sea,8,
deadpool,8,
defender,8,
delivery,8,
detonate,8,
diagonal,8,
dinosaur,8,
disabled,8,
disagree,8,
disaster,8,
distance,8,
division,8,
doghouse,8,
dominoes,8,
doorknob,8,
download,8,
dressing,8,
driveway,8,
drum kit,8,
dumbbell,8,
dumpling,8,
dynamite,8,
earmuffs,8,
egg hunt,8,
eggplant,8,
einstein,8,
election,8,
elephant,8,
elevator,8,
employer,8,
engineer,8,
envelope,8,
equation,8,
espresso,8,
exercise,8,
explorer,8,
eyeliner,8,
eyepatch,8,
fabulous,8,
facebook,8,
festival,8,
figurine,8,
fireball,8,
fireside,8,
firework,8,
flagpole,8,
flamingo,8,
football,8,
footrest,8,
forehead,8,
fortress,8,
fountain,8,
freckles,8,
frosting,8,
game boy,8,
gangrene,8,
gangster,8,
gardener,8,
garfield,8,
gas mask,8,
gasoline,8,
godzilla,8,
goldfish,8,
graffiti,8,
graphite,8,
habanero,8,
hair gel,8,
hairband,8,
handicap,8,
hard hat,8,
hay bale,8,
hazelnut,8,
headache,8,
headband,8,
hedgehog,8,
hercules,8,
homeless,8,
homework,8,
hospital,8,
impostor,8,
industry,8,
infinite,8,
insomnia,8,
internet,8,
invasion,8,
iron man,8,
jalapeno,8,
jet pack,8,
kangaroo,8,
keyboard,8,
knuckles,8,
kombucha,8,
kool-aid,8,
lacrosse,8,
landfill,8,
landlord,8,
language,8,
lavender,8,
leggings,8,
lemonade,8,
levitate,8,
licorice,8,
lip balm,8,
lipstick,8,
lollipop,8,
macaroni,8,
magazine,8,
magician,8,
majority,8,
manicure,8,
marathon,8,
marigold,8,
matchbox,8,
mattress,8,
meatball,8,
meatloaf,8,
mechanic,8,
mercedes,8,
meridian,8,
midnight,8,
military,8,
minfgocf,8,
minfgolf,8,
miniclip,8,
minigolf,8,
minority,8,
minotaur,8,
mosquito,8,
mothball,8,
mountain,8,
mousepad,8,
mr. bean,8,
murderer,8,
mushroom,8,
mustache,8,
napoleon,8,
necklace,8,
negative,8,
neighbor,8,
new year,8,
new york,8,
nintendo,8,
nitrogen,8,
nostrils,8,
notebook,8,
nutshell,8,
obsidian,8,
olympics,8,
ornament,8,
overalls,8,
painting,8,
pakistan,8,
pandemic,8,
panpipes,8,
parakeet,8,
parallel,8,
parmesan,8,
passport,8,
password,8,
pavement,8,
pedicure,8,
pendulum,8,
pentagon,8,
pet food,8,
pet shop,8,
pharmacy,8,
pinwheel,8,
plankton,8,
platform,8,
platypus,8,
ponytail,8,
popsicle,8,
portrait,8,
portugal,8,
poseidon,8,
positive,8,
postcard,8,
pregnant,8,
princess,8,
pringles,8,
prisoner,8,
question,8,
railroad,8,
raincoat,8,
raindrop,8,
rapunzel,8,
recorder,8,
redditor,8,
redstone,8,
reindeer,8,
religion,8,
reporter,8,
revolver,8,
ringtone,8,
roadkill,8,
rockstar,8,
sailboat,8,
sandwich,8,
sapphire,8,
sardines,8,
savannah,8,
scissors,8,
scorpion,8,
scotland,8,
scrabble,8,
scribble,8,
sea lion,8,
seahorse,8,
seashell,8,
security,8,
shepherd,8,
shoehorn,8,
shoelace,8,
shopping,8,
shoulder,8,
sidewalk,8,
sim card,8,
six pack,8,
skeleton,8,
ski jump,8,
ski lift,8,
skittles,8,
skrillex,8,
slippers,8,
slippery,8,
slovakia,8,
snapchat,8,
sneakers,8,
snowball,8,
sombrero,8,
sparkles,8,
squirrel,8,
sriracha,8,
starfish,8,
stingray,8,
stocking,8,
streamer,8,
strength,8,
stroller,8,
suitcase,8,
sunshade,8,
sunshine,8,
superman,8,
survivor,8,
swelling,8,
swimsuit,8,
symmetry,8,
symphony,8,
tabletop,8,
take off,8,
tapeworm,8,
teaspoon,8,
teenager,8,
tentacle,8,
terraria,8,
thailand,8,
the rock,8,
theremin,8,
tiramisu,8,
tortilla,8,
tortoise,8,
trapdoor,8,
traveler,8,
treasure,8,
triangle,8,
tricycle,8,
triplets,8,
trombone,8,
tropical,8,
trousers,8,
umbrella,8,
unicycle,8,
universe,8,
upstairs,8,
vacation,8,
van gogh,8,
venomous,8,
vertical,8,
violence,8,
vuvuzela,8,
weakling,8,
werewolf,8,
whatsapp,8,
whiskers,8,
windmill,8,
windsock,8,
wireless,8,
wrapping,8,
wrestler,8,
yearbook,8,
youtuber,8,
zeppelin,8,
zimbabwe,8,
zucchini,8,
abandoned,9,
accordion,9,
addiction,9,
afterlife,9,
afternoon,9,
agreement,9,
albatross,9,
alchemist,9,
alligator,9,
ambulance,9,
amsterdam,9,
animation,9,
antivirus,9,
apartment,9,
apple pie,9,
architect,9,
argentina,9,
armadillo,9,
arthritis,9,
artichoke,9,
astronaut,9,
asymmetry,9,
australia,9,
autograph,9,
avalanche,9,
back pain,9,
back seat,9,
badminton,9,
ballerina,9,
barbarian,9,
barcelona,9,
bartender,9,
beanstalk,9,
bear trap,9,
bed sheet,9,
beethoven,9,
billiards,9,
bird bath,9,
birdhouse,9,
blindfold,9,
blowtorch,9,
blueberry,9,
bodyguard,9,
bomberman,9,
bookshelf,9,
boomerang,9,
boyfriend,9,
brad pitt,9,
brainwash,9,
breakfast,9,
broadcast,9,
bruce lee,9,
bug spray,9,
bulldozer,9,
butterfly,9,
cable car,9,
cameraman,9,
capricorn,9,
cardboard,9,
carnivore,9,
carpenter,9,
casserole,9,
cat woman,9,
cathedral,9,
celebrate,9,
celebrity,9,
centipede,9,
chameleon,9,
champagne,9,
chapstick,9,
chemistry,9,
chevrolet,9,
chewbacca,9,
chihuahua,9,
chinatown,9,
chocolate,9,
christmas,9,
cigarette,9,
classroom,9,
clickbait,9,
clownfish,9,
coca cola,9,
cockroach,9,
colosseum,9,
commander,9,
communism,9,
community,9,
concealer,9,
condiment,9,
conductor,9,
continent,9,
corkscrew,9,
cornfield,9,
countdown,9,
crab cake,9,
cranberry,9,
crocodile,9,
croissant,9,
crosswalk,9,
dalmatian,9,
dandelion,9,
dashboard,9,
delicious,9,
deodorant,9,
depressed,9,
desperate,9,
detective,9,
detergent,9,
direction,9,
dish soap,9,
dispenser,9,
dollhouse,9,
dr watson,9,
dr. seuss,9,
dragonfly,9,
drum roll,9,
duct tape,9,
elon musk,9,
emergency,9,
escalator,9,
evaporate,9,
evolution,9,
excalibur,9,
excavator,9,
exhausted,9,
exit ramp,9,
explosion,9,
extravert,9,
eyeshadow,9,
fast food,9,
filmmaker,9,
fingertip,9,
fire hose,9,
firehouse,9,
fireplace,9,
fireproof,9,
fish bowl,9,
fisherman,9,
fist bump,9,
fried egg,9,
frostbite,9,
full moon,9,
furniture,9,
generator,9,
gentleman,9,
geography,9,
gladiator,9,
glowstick,9,
godfather,9,
golf cart,9,
golf club,9,
graveyard,9,
greenland,9,
guacamole,9,
gunpowder,9,
hairbrush,9,
hairspray,9,
hamburger,9,
handcuffs,9,
handshake,9,
handstand,9,
harmonica,9,
harvester,9,
headboard,9,
hibernate,9,
high five,9,
hilarious,9,
hollywood,9,
honeycomb,9,
honeymoon,9,
hopscotch,9,
horseshoe,9,
horsewhip,9,
hot sauce,9,
hourglass,9,
hula hoop,9,
hypnotize,9,
ice cream,9,
incognito,9,
indonesia,9,
injection,9,
instagram,9,
interview,9,
introvert,9,
invention,9,
invisible,9,
jellyfish,9,
joe biden,9,
john cena,9,
jump rope,9,
junk food,9,
king kong,9,
lady gaga,9,
landscape,9,
landslide,9,
las vegas,9,
lava lamp,9,
librarian,9,
life buoy,9,
lightbulb,9,
lightning,9,
limousine,9,
lion king,9,
loch ness,9,
log flume,9,
long coat,9,
magnifier,9,
mannequin,9,
margarine,9,
marmalade,9,
mcdonalds,9,
megaphone,9,
merengues,9,
meteorite,9,
microsoft,9,
microwave,9,
milkshake,9,
milky way,9,
millipede,9,
minecraft,9,
moby dick,9,
mona lisa,9,
motorbike,9,
mousetrap,9,
music box,9,
nail file,9,
newspaper,9,
nightclub,9,
nightmare,9,
north sea,9,
nose hair,9,
nose ring,9,
nosebleed,9,
nunchucks,9,
olive oil,9,
orangutan,9,
orchestra,9,
oven mitt,9,
paintball,9,
palm tree,9,
paparazzi,9,
paper bag,9,
paperclip,9,
parachute,9,
passenger,9,
peninsula,9,
pensioner,9,
peppa pig,9,
pepperoni,9,
periscope,9,
pewdiepie,9,
photoshop,9,
pine cone,9,
pine tree,9,
pineapple,9,
pinocchio,9,
pistachio,9,
pitchfork,9,
pizza hut,9,
poisonous,9,
policeman,9,
pollution,9,
porcupine,9,
porky pig,9,
possessed,9,
president,9,
price tag,9,
principal,9,
professor,9,
promotion,9,
protester,9,
quicksand,9,
radiation,9,
raspberry,9,
reception,9,
rectangle,9,
recycling,9,
red panda,9,
roadblock,9,
rock pool,9,
saltwater,9,
sandstorm,9,
satellite,9,
saxophone,9,
scarecrow,9,
scientist,9,
sculpture,9,
seat belt,9,
shave ice,9,
sheep dog,9,
shipwreck,9,
shoulders,9,
sideburns,9,
signature,9,
singapore,9,
skydiving,9,
sleepwalk,9,
slingshot,9,
snowboard,9,
snowflake,9,
snowstorm,9,
socialism,9,
spaceship,9,
spaghetti,9,
spartacus,9,
speedboat,9,
spelunker,9,
spiderman,9,
spongebob,9,
sprinkler,9,
squidward,9,
star wars,9,
starbucks,9,
starfruit,9,
steampunk,9,
stick man,9,
stink bug,9,
stockings,9,
stone age,9,
stop sign,9,
stopwatch,9,
streetcar,9,
submarine,9,
sunflower,9,
surfboard,9,
swim ring,9,
swordfish,9,
taco bell,9,
taj mahal,9,
tangerine,9,
tap dance,9,
tarantula,9,
telephone,9,
telescope,9,
teletubby,9,
thumbs up,9,
tom brady,9,
tombstone,9,
toothpick,9,
tow truck,9,
translate,9,
trapezoid,9,
trash can,9,
treadmill,9,
treehouse,9,
underwear,9,
vault boy,9,
vegetable,9,
wallpaper,9,
warehouse,9,
wasteland,9,
water gun,9,
waterfall,9,
whirlpool,9,
wind farm,9,
wolverine,9,
workplace,9,
wrestling,9,
xylophone,9,
yardstick,9,
zookeeper,9,
zoom call,9,
anglerfish,10,
antarctica,10,
apocalypse,10,
apple seed,10,
aristocrat,10,
atmosphere,10,
background,10,
basketball,10,
battleship,10,
bill gates,10,
binoculars,10,
black belt,10,
black hole,10,
blackberry,10,
blacksmith,10,
board game,10,
boiled egg,10,
brainstorm,10,
breakdance,10,
brick wall,10,
bricklayer,10,
broomstick,10,
bubble gum,10,
bugs bunny,10,
bus driver,10,
buttermilk,10,
cab driver,10,
calculator,10,
california,10,
can opener,10,
candy cane,10,
cannonball,10,
capitalism,10,
cappuccino,10,
cargo ship,10,
cell phone,10,
chalkboard,10,
chandelier,10,
cheesecake,10,
chest hair,10,
chestplate,10,
chimpanzee,10,
chinchilla,10,
chopsticks,10,
cinderella,10,
collarbone,10,
colorblind,10,
comic book,10,
commercial,10,
conspiracy,10,
controller,10,
cookie jar,10,
coral reef,10,
cuttlefish,10,
daffy duck,10,
death star,10,
debit card,10,
dictionary,10,
didgeridoo,10,
disgusting,10,
dishwasher,10,
diss track,10,
downstairs,10,
dump truck,10,
earthquake,10,
ed sheeran,10,
elliptical,10,
experiment,10,
extinction,10,
face paint,10,
fairy tale,10,
fake teeth,10,
family guy,10,
fanny pack,10,
fertilizer,10,
fettuccine,10,
fingernail,10,
fire alarm,10,
fire truck,10,
fist fight,10,
flashlight,10,
floodlight,10,
flying car,10,
flying pig,10,
foundation,10,
gamer girl,10,
glue stick,10,
gold chain,10,
gold ingot,10,
golden egg,10,
goldilocks,10,
graduation,10,
gramophone,10,
grapefruit,10,
great wall,10,
greenhouse,10,
guillotine,10,
guinea pig,10,
gummy bear,10,
gummy worm,10,
gymnastics,10,
hair dryer,10,
happy meal,10,
headphones,10,
helicopter,10,
hieroglyph,10,
high heels,10,
high score,10,
hitchhiker,10,
home alone,10,
hovercraft,10,
illuminati,10,
insulation,10,
invincible,10,
iron giant,10,
iron ingot,10,
jackhammer,10,
james bond,10,
jeff bezos,10,
journalist,10,
katy perry,10,
laboratory,10,
lawn mower,10,
leprechaun,10,
lighthouse,10,
lightsaber,10,
litter box,10,
london eye,10,
lumberjack,10,
madagascar,10,
magic wand,10,
markiplier,10,
mayonnaise,10,
medication,10,
microphone,10,
microscope,10,
mont blanc,10,
morse code,10,
motorcycle,10,
mount fuji,10,
mozzarella,10,
nightlight,10,
north pole,10,
notre-dame,10,
nutcracker,10,
overweight,10,
pharmacist,10,
photograph,10,
piggy bank,10,
plantation,10,
playground,10,
plexiglass,10,
pogo stick,10,
polar bear,10,
power bank,10,
programmer,10,
prosciutto,10,
protection,10,
punishment,10,
quarantine,10,
quesadilla,10,
race track,10,
rainforest,10,
razorblade,10,
red carpet,10,
reflection,10,
republican,10,
restaurant,10,
rhinoceros,10,
roadrunner,10,
roast beef,10,
robin hood,10,
roundabout,10,
scooby doo,10,
sea turtle,10,
sea urchin,10,
semicircle,10,
shot glass,10,
silverware,10,
skateboard,10,
skribbl.io,10,
skyscraper,10,
smartphone,10,
snoop dogg,10,
snow globe,10,
snow white,10,
snowmobile,10,
south park,10,
south pole,10,
space suit,10,
speed bump,10,
sports car,10,
star bucks,10,
steve jobs,10,
stonehenge,10,
strawberry,10,
suez canal,10,
sunglasses,10,
superpower,10,
tablecloth,10,
tambourine,10,
tater tots,10,
teddy bear,10,
television,10,
terminator,10,
tissue box,10,
toothbrush,10,
toothpaste,10,
trampoline,10,
translator,10,
trick shot,10,
tug of war,10,
tumbleweed,10,
typewriter,10,
university,10,
usain bolt,10,
vegetarian,10,
video game,10,
vin diesel,10,
volleyball,10,
washington,10,
watermelon,10,
weatherman,10,
wheelchair,10,
whiteboard,10,
windshield,10,
wine glass,10,
wonderland,10,
woodpecker,10,
yield sign,10,
angry birds,11,
baking soda,11,
barbed wire,11,
bell pepper,11,
bench press,11,
berlin wall,11,
bottle flip,11,
bubble wrap,11,
bulletproof,11,
burger king,11,
butt cheeks,11,
candy store,11,
carrot cake,11,
caterpillar,11,
cauliflower,11,
ceiling fan,11,
cheerleader,11,
chewing gum,11,
coast guard,11,
coffee shop,11,
color-blind,11,
comfortable,11,
coronavirus,11,
crawl space,11,
credit card,11,
cruise ship,11,
darth vader,11,
dining room,11,
donald duck,11,
donkey kong,11,
electrician,11,
electricity,11,
environment,11,
executioner,11,
fingerprint,11,
firecracker,11,
firefighter,11,
fishing net,11,
fishing rod,11,
floppy disk,11,
fly swatter,11,
forest fire,11,
gas station,11,
gingerbread,11,
gold ingots,11,
grandfather,11,
grandmother,11,
grasshopper,11,
gravedigger,11,
great lakes,11,
green beans,11,
grim reaper,11,
guitar hero,11,
hair roller,11,
hairdresser,11,
hash browns,11,
hello kitty,11,
high school,11,
highlighter,11,
hole in one,11,
hummingbird,11,
ice fishing,11,
imagination,11,
jackie chan,11,
jerry mouse,11,
kim jong-un,11,
leaf blower,11,
machine gun,11,
magic trick,11,
marshmallow,11,
mathematics,11,
mexico city,11,
monkey bars,11,
moon bounce,11,
motherboard,11,
mr meeseeks,11,
music notes,11,
nail polish,11,
netherlands,11,
new zealand,11,
north korea,11,
observatory,11,
oktoberfest,11,
outer space,11,
paper plane,11,
paragliding,11,
pencil case,11,
philippines,11,
phone booth,11,
photo booth,11,
photo frame,11,
pirate ship,11,
plastic bag,11,
playstation,11,
pomegranate,11,
pot of gold,11,
power lines,11,
quarterback,11,
rattlesnake,11,
real estate,11,
renaissance,11,
ring finger,11,
rollerblade,11,
rubber band,11,
rubiks cube,11,
safety clip,11,
sand castle,11,
screwdriver,11,
shakespeare,11,
sock puppet,11,
solar flare,11,
solar panel,11,
south korea,11,
speedometer,11,
spray paint,11,
stegosaurus,11,
storm drain,11,
subtraction,11,
supermarket,11,
switzerland,11,
talent show,11,
taxi driver,11,
temperature,11,
the beatles,11,
thermometer,11,
thumbs down,11,
time travel,11,
tooth fairy,11,
toxic waste,11,
traffic jam,11,
trench coat,11,
triceratops,11,
tuning fork,11,
underground,11,
underweight,11,
uninhabited,11,
upside down,11,
ventilation,11,
wall street,11,
watch tower,11,
water cycle,11,
water slide,11,
water tower,11,
wheelbarrow,11,
white house,11,
window sill,11,
zodiac sign,11,
baking sheet,12,
barack obama,12,
bart simpson,12,
baseball bat,12,
belly button,12,
black friday,12,
black pepper,12,
brain freeze,12,
broken heart,12,
bus terminal,12,
cheese stick,12,
cheeseburger,12,
chuck norris,12,
clothes iron,12,
connect four,12,
construction,12,
conversation,12,
cookie dough,12,
cotton candy,12,
crystal ball,12,
donald trump,12,
easter bunny,12,
eiffel tower,12,
electric car,12,
fast forward,12,
ferris wheel,12,
fire hydrant,12,
flamethrower,12,
frankenstein,12,
golden apple,12,
grand canyon,12,
handkerchief,12,
harry potter,12,
hockey stick,12,
intersection,12,
isaac newton,12,
jesus christ,12,
johnny bravo,12,
kindergarten,12,
lebron james,12,
lisa simpson,12,
lobster roll,12,
machu picchu,12,
machu-picchu,12,
mickey mouse,12,
mr. meeseeks,12,
neighborhood,12,
nicolas cage,12,
notification,12,
onion powder,12,
paint roller,12,
paper towels,12,
photographer,12,
pickup truck,12,
pillow fight,12,
pink panther,12,
plastic wrap,12,
playing card,12,
punching bag,12,
receptionist,12,
relationship,12,
skateboarder,12,
sledgehammer,12,
social media,12,
solar system,12,
soviet union,12,
spike strips,12,
street light,12,
sweet potato,12,
table tennis,12,
tape measure,12,
tech support,12,
the avengers,12,
thunderstorm,12,
time machine,12,
toilet brush,12,
toilet paper,12,
tower bridge,12,
trailer park,12,
truck driver,12,
velociraptor,12,
veterinarian,12,
water bottle,12,
water cooler,12,
watering can,12,
weather vane,12,
wishing well,12,
wonder woman,12,
yin and yang,12,
advertisement,13,
archaeologist,13,
asteroid belt,13,
baking powder,13,
bowling alley,13,
brachiosaurus,13,
business card,13,
charlie brown,13,
cinnamon roll,13,
climbing wall,13,
constellation,13,
control tower,13,
conveyor belt,13,
defibrillator,13,
demonstration,13,
dream catcher,13,
easter island,13,
finn and jake,13,
fried chicken,13,
garbage truck,13,
garlic powder,13,
graphics card,13,
green lantern,13,
haunted house,13,
homer simpson,13,
honey mustard,13,
hot chocolate,13,
jimmy neutron,13,
justin bieber,13,
laser pointer,13,
marge simpson,13,
mount everest,13,
north america,13,
peanut butter,13,
plague doctor,13,
puss in boots,13,
reincarnation,13,
robbie rotten,13,
rock climbing,13,
rocket league,13,
rocking chair,13,
shaving cream,13,
shooting star,13,
shopping cart,13,
snake charmer,13,
south america,13,
swimming pool,13,
tennis racket,13,
tower of pisa,13,
traffic light,13,
train station,13,
venus flytrap,13,
wrecking ball,13,
angelina jolie,14,
bungee jumping,14,
car dealership,14,
cherry blossom,14,
christmas tree,14,
clothes hanger,14,
cookie monster,14,
fidget spinner,14,
fish and chips,14,
global warming,14,
grilled cheese,14,
gulf of mexico,14,
ice cream shop,14,
jack-o-lantern,14,
michael jordan,14,
morgan freeman,14,
mount rushmore,14,
multiplication,14,
prime meridian,14,
roller coaster,14,
satellite dish,14,
scrambled eggs,14,
sewing machine,14,
snowball fight,14,
steering wheel,14,
susan wojcicki,14,
united kingdom,14,
vladimir putin,14,
zebra crossing,14,
abraham lincoln,15,
air conditioner,15,
black and white,15,
captain america,15,
charlie chaplin,15,
corn on the cob,15,
crash bandicoot,15,
drivers license,15,
electric guitar,15,
english channel,15,
fitness trainer,15,
fred flintstone,15,
hot air balloon,15,
ice cream truck,15,
mark zuckerberg,15,
mashed potatoes,15,
michael jackson,15,
nintendo switch,15,
northern lights,15,
procrastination,15,
queen elizabeth,15,
reading glasses,15,
retirement home,15,
sherlock holmes,15,
stephen hawking,15,
vending machine,15,
virtual reality,15,
washing machine,15,
william wallace,15,
winnie the pooh,15,
christmas island,16,
darwin watterson,16,
demolition derby,16,
fashion designer,16,
flight attendant,16,
pencil sharpener,16,
phineas and ferb,16,
romeo and juliet,16,
combine harvester,17,
drinking fountain,17,
fire extinguisher,17,
george washington,17,
leonardo da vinci,17,
leonardo dicaprio,17,
lightning mcqueen,17,
mechanical pencil,17,
railroad crossing,17,
statue of liberty,17,
great barrier reef,18,
leonardo di caprio,18,
sydney opera house,18,
friendship bracelet,19,
william shakespeare,19,
`;

    let parsedWordDatabase = null;
    let hintObserver = null;
    let isAutoGuessing = false;
    let currentAutoguessDelay = defaultAutoguessDelay;
    let autoGuessTimeoutId = null;
    let currentWordListForAutoguess = [];
    let guessedWordsThisRound = new Set();
    let lastHintInfoSignature = null;
    let canvasRect = null;

    const canvas = document.querySelector("#game-canvas canvas");
    if (!canvas) { alert("Could not find the game canvas element."); return; }

    const guiContainerId = 'skribblDrawGuiContainerV3';
    const openButtonId = 'skribblDrawGuiOpenButtonV3';
    const panelId = 'skribblDrawGuiPanelV3';
    const drawButtonId = 'skribblDrawGuiDrawButtonV3';
    const dbButtonId = 'skribblDrawGuiDbButtonV3';
    const closeGuiButtonId = 'skribblDrawGuiCloseButtonV3';
    const inputClass = 'skribblDrawGuiInputV3';
    const dbResultsId = 'skribblDrawDbResultsV3';
    const autoguessButtonId = 'skribblDrawAutoguessButtonV3';
    const autoguessSliderId = 'skribblDrawAutoguessSliderV3';
    const autoguessDelayValueId = 'skribblDrawAutoguessDelayValueV3';
    const styleId = 'skribblModernStyleV3';

    function sleep(ms) { return new Promise(resolve => { autoGuessTimeoutId = setTimeout(resolve, ms); }); }

    function simulatePointerEvent(element, eventName, clientX, clientY) {
        if(!canvasRect){console.error("Canvas position (rect) not available for event simulation.");return}
        const eventOptions={
            bubbles: true,
            cancelable: true,
            clientX: Math.round(clientX),
            clientY: Math.round(clientY),
            pointerId: 1,
            pointerType: "mouse",
            isPrimary: true,

            view: document.defaultView
        };
        let event;
        try{
            event=new PointerEvent(eventName,eventOptions);
        } catch(e){

            delete eventOptions.pointerId;
            delete eventOptions.pointerType;
            delete eventOptions.isPrimary;

            event=new MouseEvent(eventName,eventOptions);
        }
        element.dispatchEvent(event);
    }

    function parseWordDatabase(csvString) {
        if(parsedWordDatabase)return parsedWordDatabase;
        if(!csvString||csvString==='PASTE_WORD_DATABASE_HERE'||csvString.trim()==='')return[];
        parsedWordDatabase=[];const lines=csvString.split(/\r?\n/);let parseCount=0;
        lines.forEach((line,index)=>{
            const trimmedLine=line.trim();if(!trimmedLine||trimmedLine.toLowerCase()==='word,count'||trimmedLine.toLowerCase()==='word,count,')return;
            const parts=trimmedLine.split(',');
            if(parts.length>=2){
                const word=parts[0].trim().toLowerCase();const count=parseInt(parts[1].trim(),10);
                if(word&&!isNaN(count)&&count>0){parsedWordDatabase.push({word:word,count:count});parseCount++}
            }
        });
        return parsedWordDatabase;
    }

    function getHintInfo() {
        const hintContainer=document.querySelector("#game-word .container");if(!hintContainer)return null;
        const hintElements=hintContainer.querySelectorAll('.hint');if(!hintElements||hintElements.length===0)return null;
        const hints=[];let hasContent=!1;let currentSignature='';
        hintElements.forEach(el=>{
            const textContent=el.textContent;const hasUncover=el.classList.contains('uncover');let char='_';
            if(hasUncover){if(textContent==='-'){char='-'}else if(textContent===' '||textContent.trim()===''){char=' '}else{char=textContent.trim().toLowerCase()}hasContent=!0}
            else{hasContent=!0}hints.push(char);currentSignature+=char
        });
        const wordLengthEl=hintContainer.querySelector('.word-length');if(!wordLengthEl||!hasContent)return null;
        const expectedLengthText=wordLengthEl.textContent.trim();const lengths=expectedLengthText.split(' ').map(n=>parseInt(n,10)).filter(n=>!isNaN(n));if(lengths.length===0)return null;
        const spaceCount=Math.max(0,lengths.length-1);const totalLength=hints.length;
        if(lengths.reduce((s,l)=>s+l,0)+spaceCount!==totalLength){}
        let isNewRound=!1;
        if(currentSignature!==lastHintInfoSignature){
            const wentToBlanks=lastHintInfoSignature&&lastHintInfoSignature.replace(/_/g,'').length>0&&currentSignature.replace(/_/g,'').length===0;
            const lengthChanged=lastHintInfoSignature&&currentSignature.length!==lastHintInfoSignature.length;
            if(wentToBlanks||lengthChanged||lastHintInfoSignature===null){guessedWordsThisRound.clear();isNewRound=!0}
            lastHintInfoSignature=currentSignature
        }
        return{hints:hints,length:totalLength,spaceCount:spaceCount,isNewRound:isNewRound}
    }

    function filterWords(hintInfo, wordDatabase) {
        if(!hintInfo)return{filteredWords:[],message:"No active word/hints found."};
        if(!wordDatabase||wordDatabase.length===0)return{filteredWords:[],message:"Word database is empty or not loaded."};
        const{hints,length:wordLength,spaceCount}=hintInfo;
        let possibleWords=wordDatabase.filter(entry=>{const entrySpaceCount=(entry.word.match(/ /g)||[]).length;return entry.word.length===wordLength&&entrySpaceCount===spaceCount});
        if(possibleWords.length===0)return{filteredWords:[],message:`No words found with length ${wordLength} and exactly ${spaceCount} spaces.`};
        hints.forEach((hintChar,index)=>{if(hintChar!=='_'){const initialCount=possibleWords.length;possibleWords=possibleWords.filter(entry=>entry.word.length===wordLength&&entry.word[index]===hintChar)}});
        const initialCountBeforeGuessFilter=possibleWords.length;possibleWords=possibleWords.filter(entry=>!guessedWordsThisRound.has(entry.word));
        const wordStrings=possibleWords.map(entry=>entry.word);
        if(wordStrings.length===0){if(initialCountBeforeGuessFilter>0){return{filteredWords:[],message:"All matching words already guessed."}}else{return{filteredWords:[],message:"No matching words found."}}}
        return{filteredWords:wordStrings,message:`${wordStrings.length} possible words:`}
    }

    function submitGuess(word) {
         const chatInput=document.querySelector(".chat-form input[type='text']");const chatForm=document.querySelector(".chat-form");
         if(chatInput&&chatForm&&word){chatInput.value=word;chatInput.dispatchEvent(new Event('input',{bubbles:!0}));chatForm.requestSubmit();}
    }

    function updateWordDbDisplay() {
        const dbResultsDiv=document.getElementById(dbResultsId);if(!dbResultsDiv)return;
        const hintInfo=getHintInfo();const db=parseWordDatabase(WORD_DATABASE_CSV_STRING);
        const{filteredWords,message}=filterWords(hintInfo,db);currentWordListForAutoguess=filteredWords;
        dbResultsDiv.innerHTML='';const messageP=document.createElement('p');messageP.textContent=message;
        dbResultsDiv.appendChild(messageP);
        if(filteredWords.length>0){
            const list=document.createElement('ul');
            filteredWords.forEach(word=>{
                const item=document.createElement('li');const button=document.createElement('button');button.textContent=word;button.setAttribute('data-word',word);
                button.className = 'skribbl-db-word-button';
                if(guessedWordsThisRound.has(word)){button.classList.add('guessed');button.disabled=!0}
                button.addEventListener('click',(e)=>{e.preventDefault();submitGuess(word);guessedWordsThisRound.add(word);button.classList.add('guessed');button.disabled=!0});
                item.appendChild(button);list.appendChild(item)
            });
            dbResultsDiv.appendChild(list)
        }
    }

    async function drawSegment(startCanvasX, startCanvasY, endCanvasX, endCanvasY, isFirstSegment, isLastSegment) {
        if(!canvasRect){return}
        const startClientX=canvasRect.left+startCanvasX;const startClientY=canvasRect.top+startCanvasY;const endClientX=canvasRect.left+endCanvasX;const endClientY=canvasRect.top+endCanvasY;
        const clampedStartX=Math.max(canvasRect.left,Math.min(canvasRect.right,startClientX));const clampedStartY=Math.max(canvasRect.top,Math.min(canvasRect.bottom,startClientY));
        const clampedEndX=Math.max(canvasRect.left,Math.min(canvasRect.right,endClientX));const clampedEndY=Math.max(canvasRect.top,Math.min(canvasRect.bottom,endClientY));
        if(isFirstSegment){simulatePointerEvent(canvas,'pointerdown',clampedStartX,clampedStartY);await sleep(15)}
        simulatePointerEvent(canvas,'pointermove',clampedEndX,clampedEndY);await sleep(lineDelay);
        if(isLastSegment){simulatePointerEvent(canvas,'pointerup',clampedEndX,clampedEndY);await sleep(25)}
    }

    async function drawCharacter(char, charStartX, charStartY, charWidth, charHeight) {
        const points = getCharacterPoints(char, charStartX, charStartY, charWidth, charHeight);
        if (!points || points.length < 1) return;
        let lastPoint = null; let isFirstSegmentOfStroke = true;
        for (let i = 0; i < points.length; i++) {
            const currentPoint = points[i];
            if (currentPoint === null) { lastPoint = null; isFirstSegmentOfStroke = true; }
            else if (lastPoint !== null) {
                const isLastSegmentOfChar = (i === points.length - 1 || points[i+1] === null);
                await drawSegment(lastPoint[0], lastPoint[1], currentPoint[0], currentPoint[1], isFirstSegmentOfStroke, isLastSegmentOfChar);
                lastPoint = currentPoint; isFirstSegmentOfStroke = false;
            } else {
                lastPoint = currentPoint; isFirstSegmentOfStroke = true;
                 if (i === points.length - 1 || points[i+1] === null) {
                     await drawSegment(lastPoint[0], lastPoint[1], lastPoint[0], lastPoint[1], true, true);
                     lastPoint = null; isFirstSegmentOfStroke = true;
                 }
            }
        }
        if (lastPoint !== null && !isFirstSegmentOfStroke) {
             const lastClientX = canvasRect.left + lastPoint[0]; const lastClientY = canvasRect.top + lastPoint[1];
             const clampedX = Math.max(canvasRect.left, Math.min(canvasRect.right, lastClientX)); const clampedY = Math.max(canvasRect.top, Math.min(canvasRect.bottom, lastClientY));
             simulatePointerEvent(canvas, 'pointerup', clampedX, clampedY); await sleep(25);
        }
    }

    async function drawTextLines(lines) {
        if (!lines || lines.length === 0) return;
        canvasRect = canvas.getBoundingClientRect();
        const currentCanvasWidth = canvas.width; const currentCanvasHeight = canvas.height;
        const safeWidth = currentCanvasWidth * safetyMarginFactor; const safeHeight = currentCanvasHeight * safetyMarginFactor;
        let fontSize, charWidth, charHeight, lineHeight; let longestLineLength = 0;
        lines.forEach(line => { if (line.length > longestLineLength) { longestLineLength = line.length; } });
        const maxFontSizeWidth = longestLineLength > 0 ? (safeWidth / (longestLineLength * charWidthRatio)) : safeHeight;

        if (lines.length === 1) {
            const line = lines[0];
            fontSize = Math.max(5, Math.min(maxFontSizeWidth, safeHeight / charHeightRatio));
            charWidth = fontSize * charWidthRatio; charHeight = fontSize * charHeightRatio;
            const lineWidth = line.split('').reduce((width, char) => { return width + (char === ' ' ? charWidth * spaceWidthFactor : charWidth * charSpacingFactor); }, 0);
            const startX = (currentCanvasWidth - lineWidth) / 2; const startY = (currentCanvasHeight - charHeight) / 2;
            let currentX = startX;
            for (const char of line.split('')) {
                if (char === ' ') { currentX += charWidth * spaceWidthFactor; }
                else { if (currentX >= 0 && currentX + charWidth <= currentCanvasWidth && startY >= 0 && startY + charHeight <= currentCanvasHeight) { await drawCharacter(char, currentX, startY, charWidth, charHeight); } else { console.warn(`Character '${char}' skipped (out of bounds).`); } currentX += charWidth * charSpacingFactor; }
                 if (currentX > currentCanvasWidth) break;
            }
        } else {
            const requiredBlockHeightFactor = lines.length * charHeightRatio * lineSpacingFactor; const maxFontSizeHeight = safeHeight / requiredBlockHeightFactor;
            fontSize = Math.max(5, Math.min(maxFontSizeWidth, maxFontSizeHeight));
            charWidth = fontSize * charWidthRatio; charHeight = fontSize * charHeightRatio; lineHeight = charHeight * lineSpacingFactor;
            const totalBlockHeight = lines.length * lineHeight - (lineHeight - charHeight);
            let currentY = (currentCanvasHeight - totalBlockHeight) / 2; currentY = Math.max(0, currentY);
            for (const line of lines) {
                const lineWidth = line.split('').reduce((width, char) => { return width + (char === ' ' ? charWidth * spaceWidthFactor : charWidth * charSpacingFactor); }, 0);
                let currentX = (currentCanvasWidth - lineWidth) / 2;
                for (const char of line.split('')) {
                    if (char === ' ') { currentX += charWidth * spaceWidthFactor; }
                     else { if (currentX >= 0 && currentX + charWidth <= currentCanvasWidth && currentY >= 0 && currentY + charHeight <= currentCanvasHeight) { await drawCharacter(char, currentX, currentY, charWidth, charHeight); } else { console.warn(`Character '${char}' skipped (out of bounds).`); } currentX += charWidth * charSpacingFactor; }
                     if (currentX > currentCanvasWidth) break;
                }
                currentY += lineHeight; if (currentY > currentCanvasHeight) { console.warn("Next line would start below canvas. Stopping."); break; }
            }
        }
    }

    function getCharacterPoints(char, startX, startY, charWidth, charHeight) {
        const points=[]; const H=charHeight, W=charWidth, X=startX, Y=startY;
        switch(char){
            case 'A': points.push([X, Y + H]); points.push([X + W / 2, Y]); points.push([X + W, Y + H]); points.push(null); points.push([X + W * 0.2, Y + H * 0.6]); points.push([X + W * 0.8, Y + H * 0.6]); break;
            case 'B': points.push([X, Y]); points.push([X, Y + H]); points.push(null); points.push([X, Y]); points.push([X + W * 0.8, Y]); points.push([X + W, Y + H * 0.25]); points.push([X + W * 0.8, Y + H * 0.5]); points.push([X, Y + H * 0.5]); points.push(null); points.push([X, Y + H * 0.5]); points.push([X + W * 0.9, Y + H * 0.5]); points.push([X + W, Y + H * 0.75]); points.push([X + W * 0.8, Y + H]); points.push([X, Y + H]); break;
            case 'C': points.push([X + W * 0.9, Y + H * 0.2]); points.push([X + W * 0.5, Y]); points.push([X + W * 0.1, Y + H * 0.2]); points.push([X, Y + H * 0.5]); points.push([X + W * 0.1, Y + H * 0.8]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.9, Y + H * 0.8]); break;
            case 'D': points.push([X, Y]); points.push([X, Y + H]); points.push(null); points.push([X, Y]); points.push([X + W * 0.8, Y]); points.push([X + W, Y + H * 0.3]); points.push([X + W, Y + H * 0.7]); points.push([X + W * 0.8, Y + H]); points.push([X, Y + H]); break;
            case 'E': points.push([X + W, Y]); points.push([X, Y]); points.push([X, Y + H]); points.push([X + W, Y + H]); points.push(null); points.push([X, Y + H / 2]); points.push([X + W * 0.75, Y + H / 2]); break;
            case 'F': points.push([X + W, Y]); points.push([X, Y]); points.push([X, Y + H]); points.push(null); points.push([X, Y + H / 2]); points.push([X + W * 0.75, Y + H / 2]); break;
            case 'G': points.push([X + W * 0.9, Y + H * 0.2]); points.push([X + W * 0.5, Y]); points.push([X + W * 0.1, Y + H * 0.2]); points.push([X, Y + H * 0.5]); points.push([X + W * 0.1, Y + H * 0.8]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.9, Y + H * 0.8]); points.push([X + W, Y + H * 0.5]); points.push([X + W * 0.5, Y + H * 0.5]); break;
            case 'H': points.push([X, Y]); points.push([X, Y + H]); points.push(null); points.push([X + W, Y]); points.push([X + W, Y + H]); points.push(null); points.push([X, Y + H / 2]); points.push([X + W, Y + H / 2]); break;
            case 'I': points.push([X + W / 2, Y]); points.push([X + W / 2, Y + H]); points.push(null); points.push([X + W * 0.2, Y]); points.push([X + W * 0.8, Y]); points.push(null); points.push([X + W * 0.2, Y + H]); points.push([X + W * 0.8, Y + H]); break;
            case 'J': points.push([X + W * 0.8, Y]); points.push([X + W * 0.8, Y + H * 0.8]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.2, Y + H * 0.8]); break;
            case 'K': points.push([X, Y]); points.push([X, Y + H]); points.push(null); points.push([X + W, Y]); points.push([X + W * 0.2, Y + H / 2]); points.push([X + W, Y + H]); break;
            case 'L': points.push([X, Y]); points.push([X, Y + H]); points.push([X + W, Y + H]); break;
            case 'M': points.push([X, Y + H]); points.push([X, Y]); points.push([X + W / 2, Y + H * 0.6]); points.push([X + W, Y]); points.push([X + W, Y + H]); break;
            case 'N': points.push([X, Y + H]); points.push([X, Y]); points.push([X + W, Y + H]); points.push([X + W, Y]); break;
            case 'O': points.push([X + W * 0.5, Y]); points.push([X + W * 0.9, Y + H * 0.2]); points.push([X + W, Y + H * 0.5]); points.push([X + W * 0.9, Y + H * 0.8]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.8]); points.push([X, Y + H * 0.5]); points.push([X + W * 0.1, Y + H * 0.2]); points.push([X + W * 0.5, Y]); break;
            case 'P': points.push([X, Y + H]); points.push([X, Y]); points.push(null); points.push([X, Y]); points.push([X + W * 0.8, Y]); points.push([X + W, Y + H * 0.25]); points.push([X + W * 0.8, Y + H * 0.5]); points.push([X, Y + H * 0.5]); break;
            case 'Q': points.push([X + W * 0.5, Y]); points.push([X + W * 0.9, Y + H * 0.2]); points.push([X + W, Y + H * 0.5]); points.push([X + W * 0.9, Y + H * 0.8]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.8]); points.push([X, Y + H * 0.5]); points.push([X + W * 0.1, Y + H * 0.2]); points.push([X + W * 0.5, Y]); points.push(null); points.push([X + W * 0.6, Y + H * 0.7]); points.push([X + W, Y + H]); break;
            case 'R': points.push([X, Y + H]); points.push([X, Y]); points.push(null); points.push([X, Y]); points.push([X + W * 0.8, Y]); points.push([X + W, Y + H * 0.25]); points.push([X + W * 0.8, Y + H * 0.5]); points.push([X, Y + H * 0.5]); points.push(null); points.push([X + W * 0.4, Y + H * 0.5]); points.push([X + W, Y + H]); break;
            case 'S': points.push([X + W * 0.9, Y + H * 0.1]); points.push([X + W * 0.5, Y]); points.push([X + W * 0.1, Y + H * 0.1]); points.push([X, Y + H * 0.3]); points.push([X + W * 0.9, Y + H * 0.7]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.9]); break;
            case 'T': points.push([X, Y]); points.push([X + W, Y]); points.push(null); points.push([X + W / 2, Y]); points.push([X + W / 2, Y + H]); break;
            case 'U': points.push([X, Y]); points.push([X, Y + H * 0.8]); points.push([X + W * 0.2, Y + H]); points.push([X + W * 0.8, Y + H]); points.push([X + W, Y + H * 0.8]); points.push([X + W, Y]); break;
            case 'V': points.push([X, Y]); points.push([X + W / 2, Y + H]); points.push([X + W, Y]); break;
            case 'W': points.push([X, Y]); points.push([X + W * 0.25, Y + H]); points.push([X + W / 2, Y + H / 3]); points.push([X + W * 0.75, Y + H]); points.push([X + W, Y]); break;
            case 'X': points.push([X, Y]); points.push([X + W, Y + H]); points.push(null); points.push([X + W, Y]); points.push([X, Y + H]); break;
            case 'Y': points.push([X, Y]); points.push([X + W / 2, Y + H / 2]); points.push([X + W, Y]); points.push(null); points.push([X + W / 2, Y + H / 2]); points.push([X + W / 2, Y + H]); break;
            case 'Z': points.push([X, Y]); points.push([X + W, Y]); points.push([X, Y + H]); points.push([X + W, Y + H]); break;


            case '0': points.push([X + W * 0.5, Y]); points.push([X + W * 0.9, Y + H * 0.2]); points.push([X + W, Y + H * 0.5]); points.push([X + W * 0.9, Y + H * 0.8]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.8]); points.push([X, Y + H * 0.5]); points.push([X + W * 0.1, Y + H * 0.2]); points.push([X + W * 0.5, Y]); break;
            case '1': points.push([X + W * 0.3, Y + H * 0.15]); points.push([X + W / 2, Y]); points.push([X + W / 2, Y + H]); points.push(null); points.push([X + W * 0.2, Y + H]); points.push([X + W * 0.8, Y + H]); break;
            case '2': points.push([X + W * 0.1, Y + H * 0.2]); points.push([X + W * 0.5, Y]); points.push([X + W * 0.9, Y + H * 0.2]); points.push([X + W * 0.8, Y + H * 0.4]); points.push([X, Y + H]); points.push([X + W, Y + H]); break;
            case '3': points.push([X + W * 0.1, Y + H * 0.1]); points.push([X + W * 0.8, Y]); points.push([X + W, Y + H * 0.3]); points.push([X + W * 0.6, Y + H * 0.5]); points.push([X + W, Y + H * 0.7]); points.push([X + W * 0.8, Y + H]); points.push([X + W * 0.1, Y + H * 0.9]); break;
            case '4': points.push([X + W * 0.2, Y]); points.push([X + W * 0.2, Y + H * 0.6]); points.push([X + W, Y + H * 0.6]); points.push(null); points.push([X + W * 0.7, Y]); points.push([X + W * 0.7, Y + H]); break;
            case '5': points.push([X + W, Y]); points.push([X, Y]); points.push([X, Y + H * 0.5]); points.push(null); points.push([X, Y + H * 0.5]); points.push([X + W * 0.8, Y + H * 0.5]); points.push([X + W, Y + H * 0.7]); points.push([X + W * 0.8, Y + H]); points.push([X + W * 0.1, Y + H * 0.9]); break;
            case '6': points.push([X + W * 0.8, Y + H * 0.1]); points.push([X + W * 0.2, Y + H * 0.3]); points.push([X, Y + H * 0.6]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.9, Y + H * 0.8]); points.push([X + W * 0.8, Y + H * 0.5]); points.push([X, Y + H * 0.6]); break;
            case '7': points.push([X, Y]); points.push([X + W, Y]); points.push([X + W * 0.3, Y + H]); break;
            case '8': points.push([X + W * 0.5, Y]); points.push([X + W * 0.9, Y + H * 0.2]); points.push([X + W * 0.5, Y + H * 0.5]); points.push([X + W * 0.1, Y + H * 0.2]); points.push([X + W * 0.5, Y]); points.push(null); points.push([X + W * 0.5, Y + H * 0.5]); points.push([X + W * 0.9, Y + H * 0.8]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.8]); points.push([X + W * 0.5, Y + H * 0.5]); break;
            case '9': points.push([X + W * 0.2, Y + H * 0.9]); points.push([X + W * 0.8, Y + H * 0.7]); points.push([X + W, Y + H * 0.4]); points.push([X + W * 0.5, Y]); points.push([X + W * 0.1, Y + H * 0.2]); points.push([X + W * 0.2, Y + H * 0.5]); points.push([X + W, Y + H * 0.4]); break;



           case 'a': points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.1, Y + H*0.65]); points.push([X + W*0.25, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.5]); points.push(null); points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.75, Y + H]); break;
           case 'b': points.push([X + W*0.25, Y]); points.push([X + W*0.25, Y + H]); points.push(null); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.9, Y + H*0.65]); points.push([X + W*0.75, Y + H*0.8]); points.push([X + W*0.25, Y + H*0.8]); break;
           case 'c': points.push([X + W*0.9, Y + H*0.55]); points.push([X + W*0.5, Y + H*0.4]); points.push([X + W*0.1, Y + H*0.55]); points.push([X, Y + H*0.75]); points.push([X + W*0.1, Y + H*0.95]); points.push([X + W*0.5, Y + H]); points.push([X + W*0.9, Y + H*0.95]); break;
           case 'd': points.push([X + W*0.75, Y]); points.push([X + W*0.75, Y + H]); points.push(null); points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.1, Y + H*0.65]); points.push([X + W*0.25, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.8]); break;
           case 'e': points.push([X + W*0.1, Y + H*0.6]); points.push([X + W*0.9, Y + H*0.6]); points.push(null); points.push([X + W*0.9, Y + H*0.6]); points.push([X + W*0.6, Y + H*0.4]); points.push([X + W*0.2, Y + H*0.5]); points.push([X, Y + H*0.75]); points.push([X + W*0.2, Y + H]); points.push([X + W*0.8, Y + H*0.9]); break;
           case 'f': points.push([X + W*0.7, Y]); points.push([X + W*0.3, Y + H*0.1]); points.push([X + W*0.3, Y + H]); points.push(null); points.push([X, Y + H*0.5]); points.push([X + W*0.7, Y + H*0.5]); break;
           case 'g': points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.1, Y + H*0.65]); points.push([X + W*0.25, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.5]); points.push(null); points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.75, Y + H*1.2]); points.push([X + W*0.5, Y + H*1.3]); points.push([X + W*0.1, Y + H*1.1]); points.push([X + W*0.3, Y + H*0.9]); break;
           case 'h': points.push([X + W*0.25, Y]); points.push([X + W*0.25, Y + H]); points.push(null); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.5, Y + H*0.5]); points.push([X + W*0.75, Y + H*0.6]); points.push([X + W*0.75, Y + H]); break;
           case 'i': points.push([X + W/2, Y + H*0.4]); points.push([X + W/2, Y + H]); points.push(null); points.push([X + W/2, Y + H*0.2]); points.push([X + W/2, Y + H*0.25]); break;
           case 'j': points.push([X + W*0.6, Y + H*0.4]); points.push([X + W*0.6, Y + H*1.2]); points.push([X + W*0.4, Y + H*1.3]); points.push([X + W*0.1, Y + H*1.1]); points.push(null); points.push([X + W*0.6, Y + H*0.2]); points.push([X + W*0.6, Y + H*0.25]); break;
           case 'k': points.push([X + W*0.25, Y]); points.push([X + W*0.25, Y + H]); points.push(null); points.push([X + W*0.8, Y + H*0.5]); points.push([X + W*0.25, Y + H*0.7]); points.push([X + W*0.8, Y + H]); break;
           case 'l': points.push([X + W/2, Y]); points.push([X + W/2, Y + H]); break;
           case 'm': points.push([X + W*0.1, Y + H*0.5]); points.push([X + W*0.1, Y + H]); points.push(null); points.push([X + W*0.1, Y + H*0.5]); points.push([X + W*0.3, Y + H*0.5]); points.push([X + W*0.5, Y + H*0.6]); points.push([X + W*0.5, Y + H]); points.push(null); points.push([X + W*0.5, Y + H*0.5]); points.push([X + W*0.7, Y + H*0.5]); points.push([X + W*0.9, Y + H*0.6]); points.push([X + W*0.9, Y + H]); break;
           case 'n': points.push([X + W*0.2, Y + H*0.5]); points.push([X + W*0.2, Y + H]); points.push(null); points.push([X + W*0.2, Y + H*0.5]); points.push([X + W*0.5, Y + H*0.5]); points.push([X + W*0.8, Y + H*0.6]); points.push([X + W*0.8, Y + H]); break;
           case 'o': points.push([X + W * 0.5, Y + H*0.4]); points.push([X + W * 0.9, Y + H * 0.55]); points.push([X + W, Y + H * 0.75]); points.push([X + W * 0.9, Y + H * 0.95]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.95]); points.push([X, Y + H * 0.75]); points.push([X + W * 0.1, Y + H * 0.55]); points.push([X + W * 0.5, Y + H*0.4]); break;
           case 'p': points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.9, Y + H*0.65]); points.push([X + W*0.75, Y + H*0.8]); points.push([X + W*0.25, Y + H*0.8]); points.push(null); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.25, Y + H*1.3]); break;
           case 'q': points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.1, Y + H*0.65]); points.push([X + W*0.25, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.8]); points.push(null); points.push([X + W*0.75, Y + H*0.5]); points.push([X + W*0.75, Y + H*1.3]); points.push([X + W*0.9, Y + H*1.2]); break;
           case 'r': points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.25, Y + H]); points.push(null); points.push([X + W*0.25, Y + H*0.5]); points.push([X + W*0.6, Y + H*0.5]); points.push([X + W*0.8, Y + H*0.6]); break;
           case 's': points.push([X + W * 0.9, Y + H * 0.5]); points.push([X + W * 0.5, Y + H*0.4]); points.push([X + W * 0.1, Y + H * 0.5]); points.push([X, Y + H * 0.65]); points.push([X + W * 0.9, Y + H * 0.85]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.9]); break;
           case 't': points.push([X + W/2, Y + H*0.1]); points.push([X + W/2, Y + H]); points.push(null); points.push([X + W*0.1, Y + H*0.4]); points.push([X + W*0.9, Y + H*0.4]); break;
           case 'u': points.push([X + W*0.1, Y + H*0.5]); points.push([X + W*0.1, Y + H*0.9]); points.push([X + W*0.3, Y + H]); points.push([X + W*0.7, Y + H]); points.push([X + W*0.9, Y + H*0.9]); points.push([X + W*0.9, Y + H*0.5]); break;
           case 'v': points.push([X + W*0.1, Y + H*0.5]); points.push([X + W / 2, Y + H]); points.push([X + W*0.9, Y + H*0.5]); break;
           case 'w': points.push([X, Y + H*0.5]); points.push([X + W * 0.25, Y + H]); points.push([X + W / 2, Y + H * 0.7]); points.push([X + W * 0.75, Y + H]); points.push([X + W, Y + H*0.5]); break;
           case 'x': points.push([X + W*0.1, Y + H*0.5]); points.push([X + W*0.9, Y + H]); points.push(null); points.push([X + W*0.9, Y + H*0.5]); points.push([X + W*0.1, Y + H]); break;
           case 'y': points.push([X + W*0.1, Y + H*0.5]); points.push([X + W / 2, Y + H]); points.push([X + W*0.9, Y + H*0.5]); points.push(null); points.push([X + W / 2, Y + H]); points.push([X + W*0.3, Y + H*1.3]); break;
           case 'z': points.push([X + W*0.1, Y + H*0.5]); points.push([X + W*0.9, Y + H*0.5]); points.push([X + W*0.1, Y + H]); points.push([X + W*0.9, Y + H]); break;



           case '!': points.push([X + W/2, Y]); points.push([X + W/2, Y + H*0.7]); points.push(null); points.push([X + W/2, Y + H*0.9]); points.push([X + W/2, Y + H]); break;
           case '@': points.push([X + W*0.75, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.3]); points.push([X + W*0.5, Y + H*0.2]); points.push([X + W*0.25, Y + H*0.3]); points.push([X + W*0.25, Y + H*0.8]); points.push([X + W*0.75, Y + H*0.8]); points.push(null); points.push([X + W*0.5, Y]); points.push([X + W, Y + H*0.5]); points.push([X + W*0.5, Y + H]); points.push([X, Y + H*0.5]); points.push([X + W*0.5, Y]); break;
           case '#': points.push([X + W*0.25, Y + H*0.2]); points.push([X + W*0.25, Y + H*0.8]); points.push(null); points.push([X + W*0.75, Y + H*0.2]); points.push([X + W*0.75, Y + H*0.8]); points.push(null); points.push([X, Y + H*0.4]); points.push([X + W, Y + H*0.4]); points.push(null); points.push([X, Y + H*0.6]); points.push([X + W, Y + H*0.6]); break;
           case '$': points.push([X + W * 0.9, Y + H * 0.1]); points.push([X + W * 0.5, Y]); points.push([X + W * 0.1, Y + H * 0.1]); points.push([X, Y + H * 0.3]); points.push([X + W * 0.9, Y + H * 0.7]); points.push([X + W * 0.5, Y + H]); points.push([X + W * 0.1, Y + H * 0.9]); points.push(null); points.push([X + W/2, Y]); points.push([X + W/2, Y + H]); break;
           case '%': points.push([X + W*0.2, Y + H*0.1]); points.push([X + W*0.4, Y + H*0.3]); points.push([X + W*0.2, Y + H*0.5]); points.push([X, Y + H*0.3]); points.push([X + W*0.2, Y + H*0.1]); points.push(null); points.push([X, Y + H]); points.push([X + W, Y]); points.push(null); points.push([X + W*0.8, Y + H*0.9]); points.push([X + W*0.6, Y + H*0.7]); points.push([X + W*0.8, Y + H*0.5]); points.push([X + W, Y + H*0.7]); points.push([X + W*0.8, Y + H*0.9]); break;
           case '^': points.push([X + W*0.1, Y + H*0.6]); points.push([X + W/2, Y + H*0.2]); points.push([X + W*0.9, Y + H*0.6]); break;
           case '&': points.push([X + W, Y + H*0.8]); points.push([X + W*0.5, Y + H]); points.push([X + W*0.2, Y + H*0.8]); points.push([X, Y + H*0.5]); points.push([X + W*0.5, Y]); points.push([X + W*0.8, Y + H*0.2]); points.push([X + W*0.5, Y + H*0.5]); points.push([X, Y + H*0.8]); break;
           case '*': points.push([X + W/2, Y]); points.push([X + W/2, Y + H]); points.push(null); points.push([X, Y + H/2]); points.push([X + W, Y + H/2]); points.push(null); points.push([X + W*0.1, Y + H*0.1]); points.push([X + W*0.9, Y + H*0.9]); points.push(null); points.push([X + W*0.9, Y + H*0.1]); points.push([X + W*0.1, Y + H*0.9]); break;
           case '(': points.push([X + W*0.8, Y]); points.push([X + W*0.3, Y + H*0.2]); points.push([X + W*0.3, Y + H*0.8]); points.push([X + W*0.8, Y + H]); break;
           case ')': points.push([X + W*0.2, Y]); points.push([X + W*0.7, Y + H*0.2]); points.push([X + W*0.7, Y + H*0.8]); points.push([X + W*0.2, Y + H]); break;
           case '_': points.push([X, Y + H]); points.push([X + W, Y + H]); break;
           case '+': points.push([X + W/2, Y + H*0.2]); points.push([X + W/2, Y + H*0.8]); points.push(null); points.push([X + W*0.1, Y + H/2]); points.push([X + W*0.9, Y + H/2]); break;
           case '[': points.push([X + W*0.7, Y]); points.push([X + W*0.3, Y]); points.push([X + W*0.3, Y + H]); points.push([X + W*0.7, Y + H]); break;
           case ']': points.push([X + W*0.3, Y]); points.push([X + W*0.7, Y]); points.push([X + W*0.7, Y + H]); points.push([X + W*0.3, Y + H]); break;
           case '{': points.push([X + W*0.8, Y]); points.push([X + W*0.4, Y + H*0.1]); points.push([X + W*0.4, Y + H*0.4]); points.push([X + W*0.2, Y + H*0.5]); points.push([X + W*0.4, Y + H*0.6]); points.push([X + W*0.4, Y + H*0.9]); points.push([X + W*0.8, Y + H]); break;
           case '}': points.push([X + W*0.2, Y]); points.push([X + W*0.6, Y + H*0.1]); points.push([X + W*0.6, Y + H*0.4]); points.push([X + W*0.8, Y + H*0.5]); points.push([X + W*0.6, Y + H*0.6]); points.push([X + W*0.6, Y + H*0.9]); points.push([X + W*0.2, Y + H]); break;
           case '|': points.push([X + W/2, Y]); points.push([X + W/2, Y + H]); break;
           case '\\': points.push([X, Y]); points.push([X + W, Y + H]); break;
           case ';': points.push([X + W/2, Y + H*0.4]); points.push([X + W/2, Y + H*0.7]); points.push(null); points.push([X + W/2, Y + H*0.9]); points.push([X + W*0.4, Y + H]); break;
           case ':': points.push([X + W/2, Y + H*0.3]); points.push([X + W/2, Y + H*0.4]); points.push(null); points.push([X + W/2, Y + H*0.6]); points.push([X + W/2, Y + H*0.7]); break;
           case '"': points.push([X + W*0.3, Y]); points.push([X + W*0.3, Y + H*0.3]); points.push(null); points.push([X + W*0.7, Y]); points.push([X + W*0.7, Y + H*0.3]); break;
           case '\'': points.push([X + W/2, Y]); points.push([X + W/2, Y + H*0.3]); break;
           case ',': points.push([X + W/2, Y + H*0.7]); points.push([X + W*0.4, Y + H]); break;
           case '.': points.push([X + W/2, Y + H*0.9]); points.push([X + W/2, Y + H]); break;
           case '/': points.push([X + W, Y]); points.push([X, Y + H]); break;
           case '<': points.push([X + W*0.8, Y]); points.push([X + W*0.2, Y + H/2]); points.push([X + W*0.8, Y + H]); break;
           case '>': points.push([X + W*0.2, Y]); points.push([X + W*0.8, Y + H/2]); points.push([X + W*0.2, Y + H]); break;
           case '?': points.push([X + W*0.1, Y + H*0.3]); points.push([X + W*0.5, Y]); points.push([X + W*0.9, Y + H*0.3]); points.push([X + W*0.7, Y + H*0.5]); points.push([X + W*0.5, Y + H*0.5]); points.push([X + W*0.5, Y + H*0.7]); points.push(null); points.push([X + W*0.5, Y + H*0.9]); points.push([X + W*0.5, Y + H]); break;
           case '-': points.push([X + W * 0.1, Y + H * 0.5]); points.push([X + W * 0.9, Y + H * 0.5]); break;
           case ' ': return [];

            default: console.warn(`Character '${char}' not implemented for drawing.`); return null;
        }
        return points;
    }

    async function startAutoGuessing(words, delay) {
        console.log(`Starting autoguess with ${words.length} words, delay ${delay}ms`);const chatInput=document.querySelector(".chat-form input[type='text']");const chatForm=document.querySelector(".chat-form");const autoguessBtn=document.getElementById(autoguessButtonId);if(!chatInput||!chatForm){console.error("Autoguess failed: Could not find chat input or form.");isAutoGuessing=!1;if(autoguessBtn){autoguessBtn.textContent='Autoguess';autoguessBtn.style.backgroundColor='var(--skribbl-red)'}return}if(autoGuessTimeoutId)clearTimeout(autoGuessTimeoutId);currentWordListForAutoguess=[...words];for(let i=0;i<currentWordListForAutoguess.length;i++){const word=currentWordListForAutoguess[i];if(!word)continue;if(!isAutoGuessing){console.log("Autoguess stopped by user.");if(autoguessBtn){autoguessBtn.textContent='Autoguess';autoguessBtn.style.backgroundColor='var(--skribbl-red)'}return}if(guessedWordsThisRound.has(word)){console.log(`Autoguess skipping already guessed: ${word}`);continue}const hintInfo=getHintInfo();if(!hintInfo||hintInfo.length!==word.length){console.log("Hints changed/disappeared, stopping autoguess.");isAutoGuessing=!1;if(autoguessBtn){autoguessBtn.textContent='Autoguess';autoguessBtn.style.backgroundColor='var(--skribbl-red)'}return}chatInput.value=word;chatInput.dispatchEvent(new Event('input',{bubbles:!0}));await sleep(15);if(!isAutoGuessing){if(autoguessBtn){autoguessBtn.textContent='Autoguess';autoguessBtn.style.backgroundColor='var(--skribbl-red)'}return}chatForm.requestSubmit();console.log(`Autoguessed: ${word}`);guessedWordsThisRound.add(word);const dbResultsDiv=document.getElementById(dbResultsId);if(dbResultsDiv&&dbResultsDiv.style.display!=='none'){const buttonToDisable=dbResultsDiv.querySelector(`button[data-word="${word}"]`);if(buttonToDisable){buttonToDisable.classList.add('guessed');buttonToDisable.disabled=!0}}if(i<currentWordListForAutoguess.length-1){await sleep(delay)}}if(isAutoGuessing){console.log("Autoguess finished: exhausted word list.");isAutoGuessing=!1;if(autoguessBtn){autoguessBtn.textContent='Autoguess';autoguessBtn.style.backgroundColor='var(--skribbl-red)'}}
    }

    function createGUI() {
        const existingContainer = document.getElementById(guiContainerId); if (existingContainer) { existingContainer.remove(); }
        const existingPanel = document.getElementById(panelId); if(existingPanel) { existingPanel.remove(); }
        const existingStyle = document.getElementById(styleId); if(existingStyle) { existingStyle.remove(); }
        const css = ` :root { --skribbl-bg-dark: #1a1a2e; --skribbl-bg-med: #1f1f38; --skribbl-bg-light: #2a2a4a; --skribbl-text-input-light:rgb(32, 31, 31); --skribbl-text-light: #00f5d4; --skribbl-text-dark: #00f5d4; --skribbl-cyan: #00f5d4; --skribbl-cyan-hover: #00c4a6; --skribbl-blue: #0d6efd; --skribbl-grey: #6c757d; --skribbl-red: #dc3545; --skribbl-yellow: #ffc107; --skribbl-border: #40405f; } #${panelId} { position: fixed; top: 10px; right: 10px; width: 280px; background-color: var(--skribbl-bg-med); color: var(--skribbl-text-light); border: 1px solid var(--skribbl-border); border-radius: 8px; padding: 15px; padding-top: 40px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); display: none; z-index: 99998; max-height: 90vh; overflow-y: auto; font-family: 'Inter', sans-serif; opacity: 0; transform: translateX(20px); transition: opacity 0.3s ease, transform 0.3s ease; } #${panelId}.visible { opacity: 1; transform: translateX(0); } #${panelId}::-webkit-scrollbar { width: 10px; } #${panelId}::-webkit-scrollbar-track { background: var(--skribbl-bg-dark); border-radius: 5px; } #${panelId}::-webkit-scrollbar-thumb { background-color: var(--skribbl-cyan); border-radius: 5px; border: 2px solid var(--skribbl-bg-dark); } #${panelId}::-webkit-scrollbar-thumb:hover { background-color: var(--skribbl-cyan-hover); } #${closeGuiButtonId} { position: absolute; top: 8px; right: 10px; background: none; border: none; font-size: 20px; font-weight: bold; color: var(--skribbl-grey); cursor: pointer; padding: 0 5px; line-height: 1; transition: color 0.2s ease; } #${closeGuiButtonId}:hover { color: var(--skribbl-text-light); } #${panelId} h4 { margin-top: 0; margin-bottom: 15px; text-align: center; color: var(--skribbl-text-light); } #${panelId} p { margin-top: 0; margin-bottom: 5px; font-weight: bold; } .${inputClass} { display: block; width: calc(100% - 14px); margin-bottom: 8px; padding: 8px; border: 1px solid var(--skribbl-border); border-radius: 4px; background-color: var(--skribbl-bg-light); color: var(--skribbl-text-input-light); font-family: inherit; font-size: 13px; transition: border-color 0.2s ease, box-shadow 0.2s ease; } .${inputClass}:focus { outline: none; border-color: var(--skribbl-cyan); box-shadow: 0 0 0 3px rgba(0, 245, 212, 0.25); } #${panelId} button { width: 100%; padding: 9px 12px; margin-top: 5px; border: none; border-radius: 5px; cursor: pointer; font-weight: bold; font-family: inherit; font-size: 14px; transition: all 0.2s ease; } #${panelId} button:hover { filter: brightness(1.15); box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2); transform: translateY(-1px); } #${panelId} button:active { filter: brightness(0.95); transform: translateY(0px); box-shadow: inset 0 1px 3px rgba(0,0,0,0.2); } #${drawButtonId} { background-color: var(--skribbl-blue); color: white; } #${dbButtonId} { background-color: var(--skribbl-grey); color: white; margin-bottom: 10px; } #${autoguessButtonId} { background-color: var(--skribbl-red); color: white; margin-bottom: 10px; } #${autoguessButtonId}.guessing { background-color: var(--skribbl-yellow); color: var(--skribbl-text-dark); } #${dbResultsId} { margin-top: 10px; padding: 10px; border: 1px dashed var(--skribbl-border); border-radius: 4px; min-height: 50px; max-height: ${wordDbResultsMaxHeight}; overflow-y: auto; display: none; font-size: 12px; word-break: break-word; background-color: var(--skribbl-bg-light); transition: max-height 0.3s ease; } #${dbResultsId} p { color: var(--skribbl-text-light); } #${dbResultsId} ul { list-style: none; padding-left: 5px; margin: 0; } #${dbResultsId} li { margin-bottom: 3px; } .skribbl-db-word-button { background: none; border: none; padding: 2px 4px; margin: 0; text-align: left; color: var(--skribbl-cyan); cursor: pointer; text-decoration: none; display: inline; font-family: inherit; font-size: inherit; border-radius: 3px; transition: background-color 0.2s ease, color 0.2s ease; } .skribbl-db-word-button:hover { background-color: rgba(0, 245, 212, 0.1); color: var(--skribbl-cyan-hover); } .skribbl-db-word-button.guessed, .skribbl-db-word-button:disabled { color: var(--skribbl-grey); text-decoration: line-through; cursor: default; background-color: transparent; } .skribbl-db-word-button.guessed:hover, .skribbl-db-word-button:disabled:hover { color: var(--skribbl-grey); text-decoration: line-through; background-color: transparent; } #${autoguessSliderId} { cursor: pointer; width: auto; margin: 0; flex-grow: 1; accent-color: var(--skribbl-cyan); height: 5px; } #${autoguessSliderId}::-webkit-slider-thumb { appearance: none; width: 16px; height: 16px; background: var(--skribbl-cyan); border-radius: 50%; cursor: pointer; margin-top: -5px; box-shadow: 0 0 5px rgba(0, 245, 212, 0.5); } #${autoguessSliderId}::-moz-range-thumb { width: 16px; height: 16px; background: var(--skribbl-cyan); border-radius: 50%; cursor: pointer; border: none; box-shadow: 0 0 5px rgba(0, 245, 212, 0.5); } #${autoguessSliderId}::-webkit-slider-runnable-track { height: 6px; background: var(--skribbl-bg-light); border-radius: 3px; border: 1px solid var(--skribbl-border); } #${autoguessSliderId}::-moz-range-track { height: 6px; background: var(--skribbl-bg-light); border-radius: 3px; border: 1px solid var(--skribbl-border); } #${autoguessDelayValueId} { min-width: 45px; text-align: right; flex-shrink: 0; color: var(--skribbl-text-light); } #skribblDrawAutoguessSliderContainer { display: flex; align-items: center; gap: 10px; font-size: 12px; width: 100%; } #${openButtonId} { padding: 8px 15px; background-color: var(--skribbl-bg-med); color: var(--skribbl-cyan); border: 1px solid var(--skribbl-cyan); border-radius: 20px; cursor: pointer; box-shadow: 0 2px 5px rgba(0, 245, 212, 0.2); transition: all 0.2s ease; font-weight: bold; font-size: 14px; } #${openButtonId}:hover { background-color: var(--skribbl-bg-light); box-shadow: 0 3px 8px rgba(0, 245, 212, 0.4); transform: translateY(-1px); } #${openButtonId}:active { transform: translateY(0px); } `;
        const styleSheet = document.createElement("style"); styleSheet.id = styleId; styleSheet.innerText = css; document.head.appendChild(styleSheet);
        const container = document.createElement('div');container.id=guiContainerId; Object.assign(container.style,{position:'fixed',zIndex:'99999',top:'10px',left:'50%',transform:'translateX(-50%)'});
        const openButton=document.createElement('button');openButton.id=openButtonId;openButton.textContent='✏️ Open GUI'; container.appendChild(openButton);
        const panel=document.createElement('div');panel.id=panelId; Object.assign(panel.style,{position:'fixed',top:'10px',right:'10px',width:'280px',display:'none',zIndex:'99998'});
        const closeButton=document.createElement('button');closeButton.id=closeGuiButtonId;closeButton.textContent='✕'; panel.appendChild(closeButton);
        const title=document.createElement('h4');title.textContent='Skribbl.io cheats made by bleh2rich https://nohesi.lol'; panel.appendChild(title);
        const drawSection=document.createElement('div'); const drawTitle=document.createElement('p');drawTitle.textContent='Draw Text:'; drawSection.appendChild(drawTitle); for(let i=0;i<maxLines;i++){const input=document.createElement('input');input.type='text';input.placeholder=`Line ${i+1}`;input.className=inputClass;drawSection.appendChild(input)} const drawButton=document.createElement('button');drawButton.id=drawButtonId;drawButton.textContent='Draw'; drawSection.appendChild(drawButton);panel.appendChild(drawSection);
        const dbSection=document.createElement('div'); const dbButton=document.createElement('button');dbButton.id=dbButtonId;dbButton.textContent='Show/Refresh Word DB'; dbSection.appendChild(dbButton); const dbResultsDiv=document.createElement('div');dbResultsDiv.id=dbResultsId; dbSection.appendChild(dbResultsDiv);panel.appendChild(dbSection);
        const autoguessSection=document.createElement('div'); const autoguessBtn=document.createElement('button');autoguessBtn.id=autoguessButtonId;autoguessBtn.textContent='Autoguess'; autoguessSection.appendChild(autoguessBtn); const sliderContainer=document.createElement('div'); sliderContainer.id = 'skribblDrawAutoguessSliderContainer'; const slider=document.createElement('input');slider.id=autoguessSliderId;slider.type='range';slider.min='25';slider.max='1000';slider.value=defaultAutoguessDelay; const delayValueSpan=document.createElement('span');delayValueSpan.id=autoguessDelayValueId;delayValueSpan.textContent=`${defaultAutoguessDelay}ms`; sliderContainer.appendChild(slider);sliderContainer.appendChild(delayValueSpan); autoguessSection.appendChild(sliderContainer);panel.appendChild(autoguessSection);
        document.body.appendChild(container);document.body.appendChild(panel);

        openButton.addEventListener('click', () => { const panel = document.getElementById(panelId); if(panel) { const isOpening = (panel.style.display === 'none' || panel.style.display === ''); if (isOpening) { panel.style.display = 'block'; setTimeout(() => panel.classList.add('visible'), 10); startHintObserver(); } else { panel.classList.remove('visible'); setTimeout(() => { panel.style.display = 'none'; }, 300); stopHintObserver(); } } });
        closeButton.addEventListener('click', () => { stopHintObserver(); if (isAutoGuessing) { isAutoGuessing = false; if (autoGuessTimeoutId) clearTimeout(autoGuessTimeoutId); } const panel = document.getElementById(panelId); if (panel) { panel.classList.remove('visible'); setTimeout(() => { panel.style.display = 'none'; }, 300); } });
        drawButton.addEventListener('click', async () => { const inputs=panel.getElementsByClassName(inputClass);const linesToDraw=[]; for(let i=0;i<inputs.length;i++){if(inputs[i].value.trim()!==''){linesToDraw.push(inputs[i].value)}} if(linesToDraw.length>0){ try{await drawTextLines(linesToDraw);}catch(error){console.error("Drawing script error:",error);alert("An error occurred during drawing.");}} });
        dbButton.addEventListener('click', () => { guessedWordsThisRound.clear(); updateWordDbDisplay(); const resultsDiv = document.getElementById(dbResultsId); if(resultsDiv)resultsDiv.style.display = 'block'; startHintObserver(); });
        slider.addEventListener('input', (e) => { currentAutoguessDelay=parseInt(e.target.value,10);delayValueSpan.textContent=`${currentAutoguessDelay}ms` });
        autoguessBtn.addEventListener('click', () => { const button = document.getElementById(autoguessButtonId); if(isAutoGuessing){ isAutoGuessing=!1;if(autoGuessTimeoutId)clearTimeout(autoGuessTimeoutId); button.textContent='Autoguess';button.classList.remove('guessing'); } else { const hintInfo=getHintInfo();const db=parseWordDatabase(WORD_DATABASE_CSV_STRING); const{filteredWords}=filterWords(hintInfo,db); if(filteredWords.length>0){ isAutoGuessing=!0;button.textContent='Stop Autoguess';button.classList.add('guessing'); startAutoGuessing(filteredWords,currentAutoguessDelay); } else { alert("Cannot start autoguess: No possible words found."); } } });
    }

    function startHintObserver() {
        if (hintObserver) return; const targetNode = document.querySelector("#game-word .container"); if (!targetNode) { return; }
        const config = { childList: true, characterData: true, subtree: true };
        const callback = function(mutationsList, observer) {
            const dbResultsDiv = document.getElementById(dbResultsId); const isDbVisible = dbResultsDiv && dbResultsDiv.style.display !== 'none';
            clearTimeout(window.skribblHintUpdateTimeout); window.skribblHintUpdateTimeout = setTimeout(() => {
                const hintInfo = getHintInfo(); if (isDbVisible) { updateWordDbDisplay(); }
                const currentlyGuessing = isAutoGuessing;
                if (currentlyGuessing) {
                    const newWordList = isDbVisible ? currentWordListForAutoguess : filterWords(hintInfo, parseWordDatabase(WORD_DATABASE_CSV_STRING)).filteredWords;
                    isAutoGuessing = false; if (autoGuessTimeoutId) clearTimeout(autoGuessTimeoutId); autoGuessTimeoutId = null;
                    const autoguessBtn = document.getElementById(autoguessButtonId);
                    if (autoguessBtn) {
                        if (hintInfo && newWordList && newWordList.length > 0) {
                            const freshFiltered = filterWords(hintInfo, parseWordDatabase(WORD_DATABASE_CSV_STRING)).filteredWords; currentWordListForAutoguess = [...freshFiltered];
                            if (currentWordListForAutoguess.length > 0) {
                                isAutoGuessing = true; autoguessBtn.textContent = 'Stop Autoguess'; autoguessBtn.classList.add('guessing');
                                setTimeout(() => { if (isAutoGuessing) { startAutoGuessing(currentWordListForAutoguess, currentAutoguessDelay); } }, 50);
                            } else { autoguessBtn.textContent = 'Autoguess'; autoguessBtn.classList.remove('guessing'); }
                        } else { autoguessBtn.textContent = 'Autoguess'; autoguessBtn.classList.remove('guessing'); }
                    }
                }
                if (isAutoGuessing && !hintInfo) {
                    isAutoGuessing = false; const autoguessBtn = document.getElementById(autoguessButtonId);
                    if(autoguessBtn) { autoguessBtn.textContent = 'Autoguess'; autoguessBtn.classList.remove('guessing'); }
                    if (autoGuessTimeoutId) clearTimeout(autoGuessTimeoutId);
                }
            }, 250);
        };
        hintObserver = new MutationObserver(callback);
        try { hintObserver.observe(targetNode, config); } catch (error) { hintObserver = null; }
    }

    function stopHintObserver() { if(hintObserver){hintObserver.disconnect();hintObserver=null;clearTimeout(window.skribblHintUpdateTimeout);} }

    createGUI();

})();