From 8c950d7c56c30268f7e07ab12e2a37af435632f0 Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Sat, 25 Oct 2025 09:24:53 -0400 Subject: [PATCH 01/18] Replaced words.rs with password_generator.rs --- cursive/src/.main.rs.swo | Bin 0 -> 20480 bytes cursive/src/.main.rs.swp | Bin 0 -> 102400 bytes cursive/src/main.rs | 29 +- src/.lib.rs.swp | Bin 0 -> 12288 bytes src/lib.rs | 6 +- src/password_generator.rs | 27 + src/tests/.password_generator.rs.swp | Bin 0 -> 12288 bytes src/tests/password_generator.rs | 9 + src/tests/words.rs | 15 - src/words.rs | 7798 -------------------------- 10 files changed, 65 insertions(+), 7819 deletions(-) create mode 100644 cursive/src/.main.rs.swo create mode 100644 cursive/src/.main.rs.swp create mode 100644 src/.lib.rs.swp create mode 100644 src/password_generator.rs create mode 100644 src/tests/.password_generator.rs.swp create mode 100644 src/tests/password_generator.rs delete mode 100644 src/tests/words.rs delete mode 100644 src/words.rs diff --git a/cursive/src/.main.rs.swo b/cursive/src/.main.rs.swo new file mode 100644 index 0000000000000000000000000000000000000000..e4348d1d21145d734ab5b9398c1ae85798c2b511 GIT binary patch literal 20480 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 E7qm~!r~m)} literal 0 HcmV?d00001 diff --git a/cursive/src/.main.rs.swp b/cursive/src/.main.rs.swp new file mode 100644 index 0000000000000000000000000000000000000000..ede32565eb3901c2f235423a24011e31d85a9437 GIT binary patch literal 102400 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 M!KA=loK4052VMhXga7~l literal 0 HcmV?d00001 diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 8b9861d0..321f63a0 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -36,6 +36,7 @@ use cursive::{ use hex::FromHex; use pass::Result; use ripasso::{ + password_generator::password_generator, crypto::CryptoImpl, git::{pull, push}, pass, @@ -443,7 +444,7 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { }) .button(CATALOG.gettext("Generate"), move |s| { - let mut new_password = ripasso::words::generate_password(6); + let mut new_password = password_generator(20, 0); s.call_on_name("editbox", |e: &mut TextArea| { e.set_content(&new_password); }); @@ -695,7 +696,7 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { let d = Dialog::around(fields) .title(CATALOG.gettext("Add new password")) .button(CATALOG.gettext("Generate"), move |s| { - let new_password = ripasso::words::generate_password(6); + let new_password = password_generator(20, 1); s.call_on_name("new_password_input", |e: &mut EditView| { e.set_content(new_password); }); @@ -2309,6 +2310,30 @@ fn main() -> Result<()> { pgp_pull(ui, store.clone(), &xdg_data_home); } }) + + .leaf(CATALOG.gettext("Logout"), { + let store = store.clone(); + move |ui: &mut Cursive| { + create(ui, store.clone()); + } + }) + + .leaf(CATALOG.gettext("Edit Notes"), { + let store = store.clone(); + move |ui: &mut Cursive| { + create(ui, store.clone()); + } + }) + + .leaf(CATALOG.gettext("Edit Username"), { + let store = store.clone(); + move |ui: &mut Cursive| { + create(ui, store.clone()); + } + }) + + + .leaf(CATALOG.gettext("Import PGP Certificate from text"), { let store = store.clone(); move |ui: &mut Cursive| { diff --git a/src/.lib.rs.swp b/src/.lib.rs.swp new file mode 100644 index 0000000000000000000000000000000000000000..33911d600b25601c3cfe8f3fd813649ee99adb01 GIT binary patch literal 12288 zcmeI2&ubJh6vwj)o@^ES54^SrEyzr}o@}*HJS+<;1*;b+-R#WUnZQgkCRx_?pf^GA z*pmp}{j>BW=*5c%FTTv|k5Ve#lc2m|zsx3i`6lo4a#=S0t*70Ga3|Up^jsI>N;Qu7xtCo08sa=|+w=#LR z&b%j0elYNfC(@GCcp%k025#W{~!UG3i0-;5Z_7R|NrUl|M%B~*d^_d zek=>|ne>TtLh_`HbcOVDNr=lR!1>Lupd*==^bxMTOSwiuGre^f}yvwb1Y4)1!1LdF_ZIl0mi+`Ztfn)FfP9 z9vPb+XQrxvG5&lm}H-1(vi{6FT3dMogQ1l~Su}7`6$L zJluTsO!;|!)R<*ss1~wLHabfNt(~%6h)NwlV>7E)V#k#?&FX*5)#uVTQ>lKEYJj?) zM^&h~rZ{a1g0>2W1nX1?;j3#x82V%Abq+cu_P|)^Ieb1eO7?1(fH)+tv`4xNAJPuw zM~aRip{JpCs7bI7HJJmKv$R508n!U2BP6DzqpbP`HePpg?<=lPx# literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index f8a4f728..c3f2df53 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,10 +12,8 @@ pub mod git; pub mod pass; /// All functions and structs related to handling the identity and signing of things pub(crate) mod signature; -/// This is the library that handles password generation, based on the long word list from EFF -/// -pub mod words; - +/// Generates ASCII and non ASCII passwords +pub mod password_generator; #[cfg(test)] #[path = "tests/test_helpers.rs"] pub mod test_helpers; diff --git a/src/password_generator.rs b/src/password_generator.rs new file mode 100644 index 00000000..f14266a6 --- /dev/null +++ b/src/password_generator.rs @@ -0,0 +1,27 @@ +use rand::Rng; + +pub fn password_generator(length: usize, category: usize) -> String { + let mut rng = rand::thread_rng(); + if category == 0 { + let password_chars: String = (0..length) + .map(|_| { + let ascii_val = rng.gen_range(33..=126); + ascii_val as u8 as char + }) + .collect(); + password_chars + } + else { + let password_chars: String = (0..length) + .map(|_| { + let ascii_val = rng.gen_range(33..=255); + ascii_val as u8 as char + }) + .collect(); + password_chars + } +} + +#[cfg(test)] +#[path = "tests/password_generator.rs"] +mod password_generator; diff --git a/src/tests/.password_generator.rs.swp b/src/tests/.password_generator.rs.swp new file mode 100644 index 0000000000000000000000000000000000000000..a800dc865c73eba5d444ca6798c25ab9d96d9863 GIT binary patch literal 12288 zcmeI&y-or_5C`zV&ccuA3oO_i$;kmW2(h#<(S$}DV#s;y0SVsW?&3!b@&YEto)@vV z)aUR8G#19hSv^DiNTAg4pJZ6}Zg!9Tbrz%@GO&5jFx08WVf@?kw(}XV&i@I+STs7@0?G{ z!&uoziFPDvC07)Rt|;dB#W{u1Xe}2sO{;$FtG3kjAXbWhROigea@|VJw$JYq^|TZL Q_sz?4`DZKrZ`UgH2HyULi2wiq literal 0 HcmV?d00001 diff --git a/src/tests/password_generator.rs b/src/tests/password_generator.rs new file mode 100644 index 00000000..fe4bdfe1 --- /dev/null +++ b/src/tests/password_generator.rs @@ -0,0 +1,9 @@ +use crate::password_generator::password_generator; + +#[test] +fn password_length_varies_correctly() { + for len in [8, 12, 20] { + let pass = password_generator(len, 0); + assert_eq!(pass.len(), len, "Expected {} chars, got {}", len, pass.len()); + } +} diff --git a/src/tests/words.rs b/src/tests/words.rs deleted file mode 100644 index 5ced75d0..00000000 --- a/src/tests/words.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::words::generate_password; - -#[test] -fn do_not_generate_passwords_that_ends_in_space() { - let pass = generate_password(3); - - assert!(!pass.ends_with(' ')); -} - -#[test] -fn generate_long_enough_passwords() { - let pass = generate_password(3); - - assert!(pass.len() > 10); -} diff --git a/src/words.rs b/src/words.rs deleted file mode 100644 index a6c18126..00000000 --- a/src/words.rs +++ /dev/null @@ -1,7798 +0,0 @@ -use rand::distributions::{Distribution, Uniform}; - -/// Generate a random password, consisting of `number_of_words` words. -pub fn generate_password(number_of_words: isize) -> String { - let mut rng = rand::thread_rng(); - let die = Uniform::from(0..7776); - - let mut rand_words = vec![]; - for _ in 0..number_of_words { - rand_words.push(WORDS[die.sample(&mut rng)]); - } - rand_words.join(" ") -} - -/// The large wordlist from -/// -const WORDS: &[&str] = &[ - "abacus", - "abdomen", - "abdominal", - "abide", - "abiding", - "ability", - "ablaze", - "able", - "abnormal", - "abrasion", - "abrasive", - "abreast", - "abridge", - "abroad", - "abruptly", - "absence", - "absentee", - "absently", - "absinthe", - "absolute", - "absolve", - "abstain", - "abstract", - "absurd", - "accent", - "acclaim", - "acclimate", - "accompany", - "account", - "accuracy", - "accurate", - "accustom", - "acetone", - "achiness", - "aching", - "acid", - "acorn", - "acquaint", - "acquire", - "acre", - "acrobat", - "acronym", - "acting", - "action", - "activate", - "activator", - "active", - "activism", - "activist", - "activity", - "actress", - "acts", - "acutely", - "acuteness", - "aeration", - "aerobics", - "aerosol", - "aerospace", - "afar", - "affair", - "affected", - "affecting", - "affection", - "affidavit", - "affiliate", - "affirm", - "affix", - "afflicted", - "affluent", - "afford", - "affront", - "aflame", - "afloat", - "aflutter", - "afoot", - "afraid", - "afterglow", - "afterlife", - "aftermath", - "aftermost", - "afternoon", - "aged", - "ageless", - "agency", - "agenda", - "agent", - "aggregate", - "aghast", - "agile", - "agility", - "aging", - "agnostic", - "agonize", - "agonizing", - "agony", - "agreeable", - "agreeably", - "agreed", - "agreeing", - "agreement", - "aground", - "ahead", - "ahoy", - "aide", - "aids", - "aim", - "ajar", - "alabaster", - "alarm", - "albatross", - "album", - "alfalfa", - "algebra", - "algorithm", - "alias", - "alibi", - "alienable", - "alienate", - "aliens", - "alike", - "alive", - "alkaline", - "alkalize", - "almanac", - "almighty", - "almost", - "aloe", - "aloft", - "aloha", - "alone", - "alongside", - "aloof", - "alphabet", - "alright", - "although", - "altitude", - "alto", - "aluminum", - "alumni", - "always", - "amaretto", - "amaze", - "amazingly", - "amber", - "ambiance", - "ambiguity", - "ambiguous", - "ambition", - "ambitious", - "ambulance", - "ambush", - "amendable", - "amendment", - "amends", - "amenity", - "amiable", - "amicably", - "amid", - "amigo", - "amino", - "amiss", - "ammonia", - "ammonium", - "amnesty", - "amniotic", - "among", - "amount", - "amperage", - "ample", - "amplifier", - "amplify", - "amply", - "amuck", - "amulet", - "amusable", - "amused", - "amusement", - "amuser", - "amusing", - "anaconda", - "anaerobic", - "anagram", - "anatomist", - "anatomy", - "anchor", - "anchovy", - "ancient", - "android", - "anemia", - "anemic", - "aneurism", - "anew", - "angelfish", - "angelic", - "anger", - "angled", - "angler", - "angles", - "angling", - "angrily", - "angriness", - "anguished", - "angular", - "animal", - "animate", - "animating", - "animation", - "animator", - "anime", - "animosity", - "ankle", - "annex", - "annotate", - "announcer", - "annoying", - "annually", - "annuity", - "anointer", - "another", - "answering", - "antacid", - "antarctic", - "anteater", - "antelope", - "antennae", - "anthem", - "anthill", - "anthology", - "antibody", - "antics", - "antidote", - "antihero", - "antiquely", - "antiques", - "antiquity", - "antirust", - "antitoxic", - "antitrust", - "antiviral", - "antivirus", - "antler", - "antonym", - "antsy", - "anvil", - "anybody", - "anyhow", - "anymore", - "anyone", - "anyplace", - "anything", - "anytime", - "anyway", - "anywhere", - "aorta", - "apache", - "apostle", - "appealing", - "appear", - "appease", - "appeasing", - "appendage", - "appendix", - "appetite", - "appetizer", - "applaud", - "applause", - "apple", - "appliance", - "applicant", - "applied", - "apply", - "appointee", - "appraisal", - "appraiser", - "apprehend", - "approach", - "approval", - "approve", - "apricot", - "april", - "apron", - "aptitude", - "aptly", - "aqua", - "aqueduct", - "arbitrary", - "arbitrate", - "ardently", - "area", - "arena", - "arguable", - "arguably", - "argue", - "arise", - "armadillo", - "armband", - "armchair", - "armed", - "armful", - "armhole", - "arming", - "armless", - "armoire", - "armored", - "armory", - "armrest", - "army", - "aroma", - "arose", - "around", - "arousal", - "arrange", - "array", - "arrest", - "arrival", - "arrive", - "arrogance", - "arrogant", - "arson", - "art", - "ascend", - "ascension", - "ascent", - "ascertain", - "ashamed", - "ashen", - "ashes", - "ashy", - "aside", - "askew", - "asleep", - "asparagus", - "aspect", - "aspirate", - "aspire", - "aspirin", - "astonish", - "astound", - "astride", - "astrology", - "astronaut", - "astronomy", - "astute", - "atlantic", - "atlas", - "atom", - "atonable", - "atop", - "atrium", - "atrocious", - "atrophy", - "attach", - "attain", - "attempt", - "attendant", - "attendee", - "attention", - "attentive", - "attest", - "attic", - "attire", - "attitude", - "attractor", - "attribute", - "atypical", - "auction", - "audacious", - "audacity", - "audible", - "audibly", - "audience", - "audio", - "audition", - "augmented", - "august", - "authentic", - "author", - "autism", - "autistic", - "autograph", - "automaker", - "automated", - "automatic", - "autopilot", - "available", - "avalanche", - "avatar", - "avenge", - "avenging", - "avenue", - "average", - "aversion", - "avert", - "aviation", - "aviator", - "avid", - "avoid", - "await", - "awaken", - "award", - "aware", - "awhile", - "awkward", - "awning", - "awoke", - "awry", - "axis", - "babble", - "babbling", - "babied", - "baboon", - "backache", - "backboard", - "backboned", - "backdrop", - "backed", - "backer", - "backfield", - "backfire", - "backhand", - "backing", - "backlands", - "backlash", - "backless", - "backlight", - "backlit", - "backlog", - "backpack", - "backpedal", - "backrest", - "backroom", - "backshift", - "backside", - "backslid", - "backspace", - "backspin", - "backstab", - "backstage", - "backtalk", - "backtrack", - "backup", - "backward", - "backwash", - "backwater", - "backyard", - "bacon", - "bacteria", - "bacterium", - "badass", - "badge", - "badland", - "badly", - "badness", - "baffle", - "baffling", - "bagel", - "bagful", - "baggage", - "bagged", - "baggie", - "bagginess", - "bagging", - "baggy", - "bagpipe", - "baguette", - "baked", - "bakery", - "bakeshop", - "baking", - "balance", - "balancing", - "balcony", - "balmy", - "balsamic", - "bamboo", - "banana", - "banish", - "banister", - "banjo", - "bankable", - "bankbook", - "banked", - "banker", - "banking", - "banknote", - "bankroll", - "banner", - "bannister", - "banshee", - "banter", - "barbecue", - "barbed", - "barbell", - "barber", - "barcode", - "barge", - "bargraph", - "barista", - "baritone", - "barley", - "barmaid", - "barman", - "barn", - "barometer", - "barrack", - "barracuda", - "barrel", - "barrette", - "barricade", - "barrier", - "barstool", - "bartender", - "barterer", - "bash", - "basically", - "basics", - "basil", - "basin", - "basis", - "basket", - "batboy", - "batch", - "bath", - "baton", - "bats", - "battalion", - "battered", - "battering", - "battery", - "batting", - "battle", - "bauble", - "bazooka", - "blabber", - "bladder", - "blade", - "blah", - "blame", - "blaming", - "blanching", - "blandness", - "blank", - "blaspheme", - "blasphemy", - "blast", - "blatancy", - "blatantly", - "blazer", - "blazing", - "bleach", - "bleak", - "bleep", - "blemish", - "blend", - "bless", - "blighted", - "blimp", - "bling", - "blinked", - "blinker", - "blinking", - "blinks", - "blip", - "blissful", - "blitz", - "blizzard", - "bloated", - "bloating", - "blob", - "blog", - "bloomers", - "blooming", - "blooper", - "blot", - "blouse", - "blubber", - "bluff", - "bluish", - "blunderer", - "blunt", - "blurb", - "blurred", - "blurry", - "blurt", - "blush", - "blustery", - "boaster", - "boastful", - "boasting", - "boat", - "bobbed", - "bobbing", - "bobble", - "bobcat", - "bobsled", - "bobtail", - "bodacious", - "body", - "bogged", - "boggle", - "bogus", - "boil", - "bok", - "bolster", - "bolt", - "bonanza", - "bonded", - "bonding", - "bondless", - "boned", - "bonehead", - "boneless", - "bonelike", - "boney", - "bonfire", - "bonnet", - "bonsai", - "bonus", - "bony", - "boogeyman", - "boogieman", - "book", - "boondocks", - "booted", - "booth", - "bootie", - "booting", - "bootlace", - "bootleg", - "boots", - "boozy", - "borax", - "boring", - "borough", - "borrower", - "borrowing", - "boss", - "botanical", - "botanist", - "botany", - "botch", - "both", - "bottle", - "bottling", - "bottom", - "bounce", - "bouncing", - "bouncy", - "bounding", - "boundless", - "bountiful", - "bovine", - "boxcar", - "boxer", - "boxing", - "boxlike", - "boxy", - "breach", - "breath", - "breeches", - "breeching", - "breeder", - "breeding", - "breeze", - "breezy", - "brethren", - "brewery", - "brewing", - "briar", - "bribe", - "brick", - "bride", - "bridged", - "brigade", - "bright", - "brilliant", - "brim", - "bring", - "brink", - "brisket", - "briskly", - "briskness", - "bristle", - "brittle", - "broadband", - "broadcast", - "broaden", - "broadly", - "broadness", - "broadside", - "broadways", - "broiler", - "broiling", - "broken", - "broker", - "bronchial", - "bronco", - "bronze", - "bronzing", - "brook", - "broom", - "brought", - "browbeat", - "brownnose", - "browse", - "browsing", - "bruising", - "brunch", - "brunette", - "brunt", - "brush", - "brussels", - "brute", - "brutishly", - "bubble", - "bubbling", - "bubbly", - "buccaneer", - "bucked", - "bucket", - "buckle", - "buckshot", - "buckskin", - "bucktooth", - "buckwheat", - "buddhism", - "buddhist", - "budding", - "buddy", - "budget", - "buffalo", - "buffed", - "buffer", - "buffing", - "buffoon", - "buggy", - "bulb", - "bulge", - "bulginess", - "bulgur", - "bulk", - "bulldog", - "bulldozer", - "bullfight", - "bullfrog", - "bullhorn", - "bullion", - "bullish", - "bullpen", - "bullring", - "bullseye", - "bullwhip", - "bully", - "bunch", - "bundle", - "bungee", - "bunion", - "bunkbed", - "bunkhouse", - "bunkmate", - "bunny", - "bunt", - "busboy", - "bush", - "busily", - "busload", - "bust", - "busybody", - "buzz", - "cabana", - "cabbage", - "cabbie", - "cabdriver", - "cable", - "caboose", - "cache", - "cackle", - "cacti", - "cactus", - "caddie", - "caddy", - "cadet", - "cadillac", - "cadmium", - "cage", - "cahoots", - "cake", - "calamari", - "calamity", - "calcium", - "calculate", - "calculus", - "caliber", - "calibrate", - "calm", - "caloric", - "calorie", - "calzone", - "camcorder", - "cameo", - "camera", - "camisole", - "camper", - "campfire", - "camping", - "campsite", - "campus", - "canal", - "canary", - "cancel", - "candied", - "candle", - "candy", - "cane", - "canine", - "canister", - "cannabis", - "canned", - "canning", - "cannon", - "cannot", - "canola", - "canon", - "canopener", - "canopy", - "canteen", - "canyon", - "capable", - "capably", - "capacity", - "cape", - "capillary", - "capital", - "capitol", - "capped", - "capricorn", - "capsize", - "capsule", - "caption", - "captivate", - "captive", - "captivity", - "capture", - "caramel", - "carat", - "caravan", - "carbon", - "cardboard", - "carded", - "cardiac", - "cardigan", - "cardinal", - "cardstock", - "carefully", - "caregiver", - "careless", - "caress", - "caretaker", - "cargo", - "caring", - "carless", - "carload", - "carmaker", - "carnage", - "carnation", - "carnival", - "carnivore", - "carol", - "carpenter", - "carpentry", - "carpool", - "carport", - "carried", - "carrot", - "carrousel", - "carry", - "cartel", - "cartload", - "carton", - "cartoon", - "cartridge", - "cartwheel", - "carve", - "carving", - "carwash", - "cascade", - "case", - "cash", - "casing", - "casino", - "casket", - "cassette", - "casually", - "casualty", - "catacomb", - "catalog", - "catalyst", - "catalyze", - "catapult", - "cataract", - "catatonic", - "catcall", - "catchable", - "catcher", - "catching", - "catchy", - "caterer", - "catering", - "catfight", - "catfish", - "cathedral", - "cathouse", - "catlike", - "catnap", - "catnip", - "catsup", - "cattail", - "cattishly", - "cattle", - "catty", - "catwalk", - "caucasian", - "caucus", - "causal", - "causation", - "cause", - "causing", - "cauterize", - "caution", - "cautious", - "cavalier", - "cavalry", - "caviar", - "cavity", - "cedar", - "celery", - "celestial", - "celibacy", - "celibate", - "celtic", - "cement", - "census", - "ceramics", - "ceremony", - "certainly", - "certainty", - "certified", - "certify", - "cesarean", - "cesspool", - "chafe", - "chaffing", - "chain", - "chair", - "chalice", - "challenge", - "chamber", - "chamomile", - "champion", - "chance", - "change", - "channel", - "chant", - "chaos", - "chaperone", - "chaplain", - "chapped", - "chaps", - "chapter", - "character", - "charbroil", - "charcoal", - "charger", - "charging", - "chariot", - "charity", - "charm", - "charred", - "charter", - "charting", - "chase", - "chasing", - "chaste", - "chastise", - "chastity", - "chatroom", - "chatter", - "chatting", - "chatty", - "cheating", - "cheddar", - "cheek", - "cheer", - "cheese", - "cheesy", - "chef", - "chemicals", - "chemist", - "chemo", - "cherisher", - "cherub", - "chess", - "chest", - "chevron", - "chevy", - "chewable", - "chewer", - "chewing", - "chewy", - "chief", - "chihuahua", - "childcare", - "childhood", - "childish", - "childless", - "childlike", - "chili", - "chill", - "chimp", - "chip", - "chirping", - "chirpy", - "chitchat", - "chivalry", - "chive", - "chloride", - "chlorine", - "choice", - "chokehold", - "choking", - "chomp", - "chooser", - "choosing", - "choosy", - "chop", - "chosen", - "chowder", - "chowtime", - "chrome", - "chubby", - "chuck", - "chug", - "chummy", - "chump", - "chunk", - "churn", - "chute", - "cider", - "cilantro", - "cinch", - "cinema", - "cinnamon", - "circle", - "circling", - "circular", - "circulate", - "circus", - "citable", - "citadel", - "citation", - "citizen", - "citric", - "citrus", - "city", - "civic", - "civil", - "clad", - "claim", - "clambake", - "clammy", - "clamor", - "clamp", - "clamshell", - "clang", - "clanking", - "clapped", - "clapper", - "clapping", - "clarify", - "clarinet", - "clarity", - "clash", - "clasp", - "class", - "clatter", - "clause", - "clavicle", - "claw", - "clay", - "clean", - "clear", - "cleat", - "cleaver", - "cleft", - "clench", - "clergyman", - "clerical", - "clerk", - "clever", - "clicker", - "client", - "climate", - "climatic", - "cling", - "clinic", - "clinking", - "clip", - "clique", - "cloak", - "clobber", - "clock", - "clone", - "cloning", - "closable", - "closure", - "clothes", - "clothing", - "cloud", - "clover", - "clubbed", - "clubbing", - "clubhouse", - "clump", - "clumsily", - "clumsy", - "clunky", - "clustered", - "clutch", - "clutter", - "coach", - "coagulant", - "coastal", - "coaster", - "coasting", - "coastland", - "coastline", - "coat", - "coauthor", - "cobalt", - "cobbler", - "cobweb", - "cocoa", - "coconut", - "cod", - "coeditor", - "coerce", - "coexist", - "coffee", - "cofounder", - "cognition", - "cognitive", - "cogwheel", - "coherence", - "coherent", - "cohesive", - "coil", - "coke", - "cola", - "cold", - "coleslaw", - "coliseum", - "collage", - "collapse", - "collar", - "collected", - "collector", - "collide", - "collie", - "collision", - "colonial", - "colonist", - "colonize", - "colony", - "colossal", - "colt", - "coma", - "come", - "comfort", - "comfy", - "comic", - "coming", - "comma", - "commence", - "commend", - "comment", - "commerce", - "commode", - "commodity", - "commodore", - "common", - "commotion", - "commute", - "commuting", - "compacted", - "compacter", - "compactly", - "compactor", - "companion", - "company", - "compare", - "compel", - "compile", - "comply", - "component", - "composed", - "composer", - "composite", - "compost", - "composure", - "compound", - "compress", - "comprised", - "computer", - "computing", - "comrade", - "concave", - "conceal", - "conceded", - "concept", - "concerned", - "concert", - "conch", - "concierge", - "concise", - "conclude", - "concrete", - "concur", - "condense", - "condiment", - "condition", - "condone", - "conducive", - "conductor", - "conduit", - "cone", - "confess", - "confetti", - "confidant", - "confident", - "confider", - "confiding", - "configure", - "confined", - "confining", - "confirm", - "conflict", - "conform", - "confound", - "confront", - "confused", - "confusing", - "confusion", - "congenial", - "congested", - "congrats", - "congress", - "conical", - "conjoined", - "conjure", - "conjuror", - "connected", - "connector", - "consensus", - "consent", - "console", - "consoling", - "consonant", - "constable", - "constant", - "constrain", - "constrict", - "construct", - "consult", - "consumer", - "consuming", - "contact", - "container", - "contempt", - "contend", - "contented", - "contently", - "contents", - "contest", - "context", - "contort", - "contour", - "contrite", - "control", - "contusion", - "convene", - "convent", - "copartner", - "cope", - "copied", - "copier", - "copilot", - "coping", - "copious", - "copper", - "copy", - "coral", - "cork", - "cornball", - "cornbread", - "corncob", - "cornea", - "corned", - "corner", - "cornfield", - "cornflake", - "cornhusk", - "cornmeal", - "cornstalk", - "corny", - "coronary", - "coroner", - "corporal", - "corporate", - "corral", - "correct", - "corridor", - "corrode", - "corroding", - "corrosive", - "corsage", - "corset", - "cortex", - "cosigner", - "cosmetics", - "cosmic", - "cosmos", - "cosponsor", - "cost", - "cottage", - "cotton", - "couch", - "cough", - "could", - "countable", - "countdown", - "counting", - "countless", - "country", - "county", - "courier", - "covenant", - "cover", - "coveted", - "coveting", - "coyness", - "cozily", - "coziness", - "cozy", - "crabbing", - "crabgrass", - "crablike", - "crabmeat", - "cradle", - "cradling", - "crafter", - "craftily", - "craftsman", - "craftwork", - "crafty", - "cramp", - "cranberry", - "crane", - "cranial", - "cranium", - "crank", - "crate", - "crave", - "craving", - "crawfish", - "crawlers", - "crawling", - "crayfish", - "crayon", - "crazed", - "crazily", - "craziness", - "crazy", - "creamed", - "creamer", - "creamlike", - "crease", - "creasing", - "creatable", - "create", - "creation", - "creative", - "creature", - "credible", - "credibly", - "credit", - "creed", - "creme", - "creole", - "crepe", - "crept", - "crescent", - "crested", - "cresting", - "crestless", - "crevice", - "crewless", - "crewman", - "crewmate", - "crib", - "cricket", - "cried", - "crier", - "crimp", - "crimson", - "cringe", - "cringing", - "crinkle", - "crinkly", - "crisped", - "crisping", - "crisply", - "crispness", - "crispy", - "criteria", - "critter", - "croak", - "crock", - "crook", - "croon", - "crop", - "cross", - "crouch", - "crouton", - "crowbar", - "crowd", - "crown", - "crucial", - "crudely", - "crudeness", - "cruelly", - "cruelness", - "cruelty", - "crumb", - "crummiest", - "crummy", - "crumpet", - "crumpled", - "cruncher", - "crunching", - "crunchy", - "crusader", - "crushable", - "crushed", - "crusher", - "crushing", - "crust", - "crux", - "crying", - "cryptic", - "crystal", - "cubbyhole", - "cube", - "cubical", - "cubicle", - "cucumber", - "cuddle", - "cuddly", - "cufflink", - "culinary", - "culminate", - "culpable", - "culprit", - "cultivate", - "cultural", - "culture", - "cupbearer", - "cupcake", - "cupid", - "cupped", - "cupping", - "curable", - "curator", - "curdle", - "cure", - "curfew", - "curing", - "curled", - "curler", - "curliness", - "curling", - "curly", - "curry", - "curse", - "cursive", - "cursor", - "curtain", - "curtly", - "curtsy", - "curvature", - "curve", - "curvy", - "cushy", - "cusp", - "cussed", - "custard", - "custodian", - "custody", - "customary", - "customer", - "customize", - "customs", - "cut", - "cycle", - "cyclic", - "cycling", - "cyclist", - "cylinder", - "cymbal", - "cytoplasm", - "cytoplast", - "dab", - "dad", - "daffodil", - "dagger", - "daily", - "daintily", - "dainty", - "dairy", - "daisy", - "dallying", - "dance", - "dancing", - "dandelion", - "dander", - "dandruff", - "dandy", - "danger", - "dangle", - "dangling", - "daredevil", - "dares", - "daringly", - "darkened", - "darkening", - "darkish", - "darkness", - "darkroom", - "darling", - "darn", - "dart", - "darwinism", - "dash", - "dastardly", - "data", - "datebook", - "dating", - "daughter", - "daunting", - "dawdler", - "dawn", - "daybed", - "daybreak", - "daycare", - "daydream", - "daylight", - "daylong", - "dayroom", - "daytime", - "dazzler", - "dazzling", - "deacon", - "deafening", - "deafness", - "dealer", - "dealing", - "dealmaker", - "dealt", - "dean", - "debatable", - "debate", - "debating", - "debit", - "debrief", - "debtless", - "debtor", - "debug", - "debunk", - "decade", - "decaf", - "decal", - "decathlon", - "decay", - "deceased", - "deceit", - "deceiver", - "deceiving", - "december", - "decency", - "decent", - "deception", - "deceptive", - "decibel", - "decidable", - "decimal", - "decimeter", - "decipher", - "deck", - "declared", - "decline", - "decode", - "decompose", - "decorated", - "decorator", - "decoy", - "decrease", - "decree", - "dedicate", - "dedicator", - "deduce", - "deduct", - "deed", - "deem", - "deepen", - "deeply", - "deepness", - "deface", - "defacing", - "defame", - "default", - "defeat", - "defection", - "defective", - "defendant", - "defender", - "defense", - "defensive", - "deferral", - "deferred", - "defiance", - "defiant", - "defile", - "defiling", - "define", - "definite", - "deflate", - "deflation", - "deflator", - "deflected", - "deflector", - "defog", - "deforest", - "defraud", - "defrost", - "deftly", - "defuse", - "defy", - "degraded", - "degrading", - "degrease", - "degree", - "dehydrate", - "deity", - "dejected", - "delay", - "delegate", - "delegator", - "delete", - "deletion", - "delicacy", - "delicate", - "delicious", - "delighted", - "delirious", - "delirium", - "deliverer", - "delivery", - "delouse", - "delta", - "deluge", - "delusion", - "deluxe", - "demanding", - "demeaning", - "demeanor", - "demise", - "democracy", - "democrat", - "demote", - "demotion", - "demystify", - "denatured", - "deniable", - "denial", - "denim", - "denote", - "dense", - "density", - "dental", - "dentist", - "denture", - "deny", - "deodorant", - "deodorize", - "departed", - "departure", - "depict", - "deplete", - "depletion", - "deplored", - "deploy", - "deport", - "depose", - "depraved", - "depravity", - "deprecate", - "depress", - "deprive", - "depth", - "deputize", - "deputy", - "derail", - "deranged", - "derby", - "derived", - "desecrate", - "deserve", - "deserving", - "designate", - "designed", - "designer", - "designing", - "deskbound", - "desktop", - "deskwork", - "desolate", - "despair", - "despise", - "despite", - "destiny", - "destitute", - "destruct", - "detached", - "detail", - "detection", - "detective", - "detector", - "detention", - "detergent", - "detest", - "detonate", - "detonator", - "detoxify", - "detract", - "deuce", - "devalue", - "deviancy", - "deviant", - "deviate", - "deviation", - "deviator", - "device", - "devious", - "devotedly", - "devotee", - "devotion", - "devourer", - "devouring", - "devoutly", - "dexterity", - "dexterous", - "diabetes", - "diabetic", - "diabolic", - "diagnoses", - "diagnosis", - "diagram", - "dial", - "diameter", - "diaper", - "diaphragm", - "diary", - "dice", - "dicing", - "dictate", - "dictation", - "dictator", - "difficult", - "diffused", - "diffuser", - "diffusion", - "diffusive", - "dig", - "dilation", - "diligence", - "diligent", - "dill", - "dilute", - "dime", - "diminish", - "dimly", - "dimmed", - "dimmer", - "dimness", - "dimple", - "diner", - "dingbat", - "dinghy", - "dinginess", - "dingo", - "dingy", - "dining", - "dinner", - "diocese", - "dioxide", - "diploma", - "dipped", - "dipper", - "dipping", - "directed", - "direction", - "directive", - "directly", - "directory", - "direness", - "dirtiness", - "disabled", - "disagree", - "disallow", - "disarm", - "disarray", - "disaster", - "disband", - "disbelief", - "disburse", - "discard", - "discern", - "discharge", - "disclose", - "discolor", - "discount", - "discourse", - "discover", - "discuss", - "disdain", - "disengage", - "disfigure", - "disgrace", - "dish", - "disinfect", - "disjoin", - "disk", - "dislike", - "disliking", - "dislocate", - "dislodge", - "disloyal", - "dismantle", - "dismay", - "dismiss", - "dismount", - "disobey", - "disorder", - "disown", - "disparate", - "disparity", - "dispatch", - "dispense", - "dispersal", - "dispersed", - "disperser", - "displace", - "display", - "displease", - "disposal", - "dispose", - "disprove", - "dispute", - "disregard", - "disrupt", - "dissuade", - "distance", - "distant", - "distaste", - "distill", - "distinct", - "distort", - "distract", - "distress", - "district", - "distrust", - "ditch", - "ditto", - "ditzy", - "dividable", - "divided", - "dividend", - "dividers", - "dividing", - "divinely", - "diving", - "divinity", - "divisible", - "divisibly", - "division", - "divisive", - "divorcee", - "dizziness", - "dizzy", - "doable", - "docile", - "dock", - "doctrine", - "document", - "dodge", - "dodgy", - "doily", - "doing", - "dole", - "dollar", - "dollhouse", - "dollop", - "dolly", - "dolphin", - "domain", - "domelike", - "domestic", - "dominion", - "dominoes", - "donated", - "donation", - "donator", - "donor", - "donut", - "doodle", - "doorbell", - "doorframe", - "doorknob", - "doorman", - "doormat", - "doornail", - "doorpost", - "doorstep", - "doorstop", - "doorway", - "doozy", - "dork", - "dormitory", - "dorsal", - "dosage", - "dose", - "dotted", - "doubling", - "douche", - "dove", - "down", - "dowry", - "doze", - "drab", - "dragging", - "dragonfly", - "dragonish", - "dragster", - "drainable", - "drainage", - "drained", - "drainer", - "drainpipe", - "dramatic", - "dramatize", - "drank", - "drapery", - "drastic", - "draw", - "dreaded", - "dreadful", - "dreadlock", - "dreamboat", - "dreamily", - "dreamland", - "dreamless", - "dreamlike", - "dreamt", - "dreamy", - "drearily", - "dreary", - "drench", - "dress", - "drew", - "dribble", - "dried", - "drier", - "drift", - "driller", - "drilling", - "drinkable", - "drinking", - "dripping", - "drippy", - "drivable", - "driven", - "driver", - "driveway", - "driving", - "drizzle", - "drizzly", - "drone", - "drool", - "droop", - "drop-down", - "dropbox", - "dropkick", - "droplet", - "dropout", - "dropper", - "drove", - "drown", - "drowsily", - "drudge", - "drum", - "dry", - "dubbed", - "dubiously", - "duchess", - "duckbill", - "ducking", - "duckling", - "ducktail", - "ducky", - "duct", - "dude", - "duffel", - "dugout", - "duh", - "duke", - "duller", - "dullness", - "duly", - "dumping", - "dumpling", - "dumpster", - "duo", - "dupe", - "duplex", - "duplicate", - "duplicity", - "durable", - "durably", - "duration", - "duress", - "during", - "dusk", - "dust", - "dutiful", - "duty", - "duvet", - "dwarf", - "dweeb", - "dwelled", - "dweller", - "dwelling", - "dwindle", - "dwindling", - "dynamic", - "dynamite", - "dynasty", - "dyslexia", - "dyslexic", - "each", - "eagle", - "earache", - "eardrum", - "earflap", - "earful", - "earlobe", - "early", - "earmark", - "earmuff", - "earphone", - "earpiece", - "earplugs", - "earring", - "earshot", - "earthen", - "earthlike", - "earthling", - "earthly", - "earthworm", - "earthy", - "earwig", - "easeful", - "easel", - "easiest", - "easily", - "easiness", - "easing", - "eastbound", - "eastcoast", - "easter", - "eastward", - "eatable", - "eaten", - "eatery", - "eating", - "eats", - "ebay", - "ebony", - "ebook", - "ecard", - "eccentric", - "echo", - "eclair", - "eclipse", - "ecologist", - "ecology", - "economic", - "economist", - "economy", - "ecosphere", - "ecosystem", - "edge", - "edginess", - "edging", - "edgy", - "edition", - "editor", - "educated", - "education", - "educator", - "eel", - "effective", - "effects", - "efficient", - "effort", - "eggbeater", - "egging", - "eggnog", - "eggplant", - "eggshell", - "egomaniac", - "egotism", - "egotistic", - "either", - "eject", - "elaborate", - "elastic", - "elated", - "elbow", - "eldercare", - "elderly", - "eldest", - "electable", - "election", - "elective", - "elephant", - "elevate", - "elevating", - "elevation", - "elevator", - "eleven", - "elf", - "eligible", - "eligibly", - "eliminate", - "elite", - "elitism", - "elixir", - "elk", - "ellipse", - "elliptic", - "elm", - "elongated", - "elope", - "eloquence", - "eloquent", - "elsewhere", - "elude", - "elusive", - "elves", - "email", - "embargo", - "embark", - "embassy", - "embattled", - "embellish", - "ember", - "embezzle", - "emblaze", - "emblem", - "embody", - "embolism", - "emboss", - "embroider", - "emcee", - "emerald", - "emergency", - "emission", - "emit", - "emote", - "emoticon", - "emotion", - "empathic", - "empathy", - "emperor", - "emphases", - "emphasis", - "emphasize", - "emphatic", - "empirical", - "employed", - "employee", - "employer", - "emporium", - "empower", - "emptier", - "emptiness", - "empty", - "emu", - "enable", - "enactment", - "enamel", - "enchanted", - "enchilada", - "encircle", - "enclose", - "enclosure", - "encode", - "encore", - "encounter", - "encourage", - "encroach", - "encrust", - "encrypt", - "endanger", - "endeared", - "endearing", - "ended", - "ending", - "endless", - "endnote", - "endocrine", - "endorphin", - "endorse", - "endowment", - "endpoint", - "endurable", - "endurance", - "enduring", - "energetic", - "energize", - "energy", - "enforced", - "enforcer", - "engaged", - "engaging", - "engine", - "engorge", - "engraved", - "engraver", - "engraving", - "engross", - "engulf", - "enhance", - "enigmatic", - "enjoyable", - "enjoyably", - "enjoyer", - "enjoying", - "enjoyment", - "enlarged", - "enlarging", - "enlighten", - "enlisted", - "enquirer", - "enrage", - "enrich", - "enroll", - "enslave", - "ensnare", - "ensure", - "entail", - "entangled", - "entering", - "entertain", - "enticing", - "entire", - "entitle", - "entity", - "entomb", - "entourage", - "entrap", - "entree", - "entrench", - "entrust", - "entryway", - "entwine", - "enunciate", - "envelope", - "enviable", - "enviably", - "envious", - "envision", - "envoy", - "envy", - "enzyme", - "epic", - "epidemic", - "epidermal", - "epidermis", - "epidural", - "epilepsy", - "epileptic", - "epilogue", - "epiphany", - "episode", - "equal", - "equate", - "equation", - "equator", - "equinox", - "equipment", - "equity", - "equivocal", - "eradicate", - "erasable", - "erased", - "eraser", - "erasure", - "ergonomic", - "errand", - "errant", - "erratic", - "error", - "erupt", - "escalate", - "escalator", - "escapable", - "escapade", - "escapist", - "escargot", - "eskimo", - "esophagus", - "espionage", - "espresso", - "esquire", - "essay", - "essence", - "essential", - "establish", - "estate", - "esteemed", - "estimate", - "estimator", - "estranged", - "estrogen", - "etching", - "eternal", - "eternity", - "ethanol", - "ether", - "ethically", - "ethics", - "euphemism", - "evacuate", - "evacuee", - "evade", - "evaluate", - "evaluator", - "evaporate", - "evasion", - "evasive", - "even", - "everglade", - "evergreen", - "everybody", - "everyday", - "everyone", - "evict", - "evidence", - "evident", - "evil", - "evoke", - "evolution", - "evolve", - "exact", - "exalted", - "example", - "excavate", - "excavator", - "exceeding", - "exception", - "excess", - "exchange", - "excitable", - "exciting", - "exclaim", - "exclude", - "excluding", - "exclusion", - "exclusive", - "excretion", - "excretory", - "excursion", - "excusable", - "excusably", - "excuse", - "exemplary", - "exemplify", - "exemption", - "exerciser", - "exert", - "exes", - "exfoliate", - "exhale", - "exhaust", - "exhume", - "exile", - "existing", - "exit", - "exodus", - "exonerate", - "exorcism", - "exorcist", - "expand", - "expanse", - "expansion", - "expansive", - "expectant", - "expedited", - "expediter", - "expel", - "expend", - "expenses", - "expensive", - "expert", - "expire", - "expiring", - "explain", - "expletive", - "explicit", - "explode", - "exploit", - "explore", - "exploring", - "exponent", - "exporter", - "exposable", - "expose", - "exposure", - "express", - "expulsion", - "exquisite", - "extended", - "extending", - "extent", - "extenuate", - "exterior", - "external", - "extinct", - "extortion", - "extradite", - "extras", - "extrovert", - "extrude", - "extruding", - "exuberant", - "fable", - "fabric", - "fabulous", - "facebook", - "facecloth", - "facedown", - "faceless", - "facelift", - "faceplate", - "faceted", - "facial", - "facility", - "facing", - "facsimile", - "faction", - "factoid", - "factor", - "factsheet", - "factual", - "faculty", - "fade", - "fading", - "failing", - "falcon", - "fall", - "false", - "falsify", - "fame", - "familiar", - "family", - "famine", - "famished", - "fanatic", - "fancied", - "fanciness", - "fancy", - "fanfare", - "fang", - "fanning", - "fantasize", - "fantastic", - "fantasy", - "fascism", - "fastball", - "faster", - "fasting", - "fastness", - "faucet", - "favorable", - "favorably", - "favored", - "favoring", - "favorite", - "fax", - "feast", - "federal", - "fedora", - "feeble", - "feed", - "feel", - "feisty", - "feline", - "felt-tip", - "feminine", - "feminism", - "feminist", - "feminize", - "femur", - "fence", - "fencing", - "fender", - "ferment", - "fernlike", - "ferocious", - "ferocity", - "ferret", - "ferris", - "ferry", - "fervor", - "fester", - "festival", - "festive", - "festivity", - "fetal", - "fetch", - "fever", - "fiber", - "fiction", - "fiddle", - "fiddling", - "fidelity", - "fidgeting", - "fidgety", - "fifteen", - "fifth", - "fiftieth", - "fifty", - "figment", - "figure", - "figurine", - "filing", - "filled", - "filler", - "filling", - "film", - "filter", - "filth", - "filtrate", - "finale", - "finalist", - "finalize", - "finally", - "finance", - "financial", - "finch", - "fineness", - "finer", - "finicky", - "finished", - "finisher", - "finishing", - "finite", - "finless", - "finlike", - "fiscally", - "fit", - "five", - "flaccid", - "flagman", - "flagpole", - "flagship", - "flagstick", - "flagstone", - "flail", - "flakily", - "flaky", - "flame", - "flammable", - "flanked", - "flanking", - "flannels", - "flap", - "flaring", - "flashback", - "flashbulb", - "flashcard", - "flashily", - "flashing", - "flashy", - "flask", - "flatbed", - "flatfoot", - "flatly", - "flatness", - "flatten", - "flattered", - "flatterer", - "flattery", - "flattop", - "flatware", - "flatworm", - "flavored", - "flavorful", - "flavoring", - "flaxseed", - "fled", - "fleshed", - "fleshy", - "flick", - "flier", - "flight", - "flinch", - "fling", - "flint", - "flip", - "flirt", - "float", - "flock", - "flogging", - "flop", - "floral", - "florist", - "floss", - "flounder", - "flyable", - "flyaway", - "flyer", - "flying", - "flyover", - "flypaper", - "foam", - "foe", - "fog", - "foil", - "folic", - "folk", - "follicle", - "follow", - "fondling", - "fondly", - "fondness", - "fondue", - "font", - "food", - "fool", - "footage", - "football", - "footbath", - "footboard", - "footer", - "footgear", - "foothill", - "foothold", - "footing", - "footless", - "footman", - "footnote", - "footpad", - "footpath", - "footprint", - "footrest", - "footsie", - "footsore", - "footwear", - "footwork", - "fossil", - "foster", - "founder", - "founding", - "fountain", - "fox", - "foyer", - "fraction", - "fracture", - "fragile", - "fragility", - "fragment", - "fragrance", - "fragrant", - "frail", - "frame", - "framing", - "frantic", - "fraternal", - "frayed", - "fraying", - "frays", - "freckled", - "freckles", - "freebase", - "freebee", - "freebie", - "freedom", - "freefall", - "freehand", - "freeing", - "freeload", - "freely", - "freemason", - "freeness", - "freestyle", - "freeware", - "freeway", - "freewill", - "freezable", - "freezing", - "freight", - "french", - "frenzied", - "frenzy", - "frequency", - "frequent", - "fresh", - "fretful", - "fretted", - "friction", - "friday", - "fridge", - "fried", - "friend", - "frighten", - "frightful", - "frigidity", - "frigidly", - "frill", - "fringe", - "frisbee", - "frisk", - "fritter", - "frivolous", - "frolic", - "from", - "front", - "frostbite", - "frosted", - "frostily", - "frosting", - "frostlike", - "frosty", - "froth", - "frown", - "frozen", - "fructose", - "frugality", - "frugally", - "fruit", - "frustrate", - "frying", - "gab", - "gaffe", - "gag", - "gainfully", - "gaining", - "gains", - "gala", - "gallantly", - "galleria", - "gallery", - "galley", - "gallon", - "gallows", - "gallstone", - "galore", - "galvanize", - "gambling", - "game", - "gaming", - "gamma", - "gander", - "gangly", - "gangrene", - "gangway", - "gap", - "garage", - "garbage", - "garden", - "gargle", - "garland", - "garlic", - "garment", - "garnet", - "garnish", - "garter", - "gas", - "gatherer", - "gathering", - "gating", - "gauging", - "gauntlet", - "gauze", - "gave", - "gawk", - "gazing", - "gear", - "gecko", - "geek", - "geiger", - "gem", - "gender", - "generic", - "generous", - "genetics", - "genre", - "gentile", - "gentleman", - "gently", - "gents", - "geography", - "geologic", - "geologist", - "geology", - "geometric", - "geometry", - "geranium", - "gerbil", - "geriatric", - "germicide", - "germinate", - "germless", - "germproof", - "gestate", - "gestation", - "gesture", - "getaway", - "getting", - "getup", - "giant", - "gibberish", - "giblet", - "giddily", - "giddiness", - "giddy", - "gift", - "gigabyte", - "gigahertz", - "gigantic", - "giggle", - "giggling", - "giggly", - "gigolo", - "gilled", - "gills", - "gimmick", - "girdle", - "giveaway", - "given", - "giver", - "giving", - "gizmo", - "gizzard", - "glacial", - "glacier", - "glade", - "gladiator", - "gladly", - "glamorous", - "glamour", - "glance", - "glancing", - "glandular", - "glare", - "glaring", - "glass", - "glaucoma", - "glazing", - "gleaming", - "gleeful", - "glider", - "gliding", - "glimmer", - "glimpse", - "glisten", - "glitch", - "glitter", - "glitzy", - "gloater", - "gloating", - "gloomily", - "gloomy", - "glorified", - "glorifier", - "glorify", - "glorious", - "glory", - "gloss", - "glove", - "glowing", - "glowworm", - "glucose", - "glue", - "gluten", - "glutinous", - "glutton", - "gnarly", - "gnat", - "goal", - "goatskin", - "goes", - "goggles", - "going", - "goldfish", - "goldmine", - "goldsmith", - "golf", - "goliath", - "gonad", - "gondola", - "gone", - "gong", - "good", - "gooey", - "goofball", - "goofiness", - "goofy", - "google", - "goon", - "gopher", - "gore", - "gorged", - "gorgeous", - "gory", - "gosling", - "gossip", - "gothic", - "gotten", - "gout", - "gown", - "grab", - "graceful", - "graceless", - "gracious", - "gradation", - "graded", - "grader", - "gradient", - "grading", - "gradually", - "graduate", - "graffiti", - "grafted", - "grafting", - "grain", - "granddad", - "grandkid", - "grandly", - "grandma", - "grandpa", - "grandson", - "granite", - "granny", - "granola", - "grant", - "granular", - "grape", - "graph", - "grapple", - "grappling", - "grasp", - "grass", - "gratified", - "gratify", - "grating", - "gratitude", - "gratuity", - "gravel", - "graveness", - "graves", - "graveyard", - "gravitate", - "gravity", - "gravy", - "gray", - "grazing", - "greasily", - "greedily", - "greedless", - "greedy", - "green", - "greeter", - "greeting", - "grew", - "greyhound", - "grid", - "grief", - "grievance", - "grieving", - "grievous", - "grill", - "grimace", - "grimacing", - "grime", - "griminess", - "grimy", - "grinch", - "grinning", - "grip", - "gristle", - "grit", - "groggily", - "groggy", - "groin", - "groom", - "groove", - "grooving", - "groovy", - "grope", - "ground", - "grouped", - "grout", - "grove", - "grower", - "growing", - "growl", - "grub", - "grudge", - "grudging", - "grueling", - "gruffly", - "grumble", - "grumbling", - "grumbly", - "grumpily", - "grunge", - "grunt", - "guacamole", - "guidable", - "guidance", - "guide", - "guiding", - "guileless", - "guise", - "gulf", - "gullible", - "gully", - "gulp", - "gumball", - "gumdrop", - "gumminess", - "gumming", - "gummy", - "gurgle", - "gurgling", - "guru", - "gush", - "gusto", - "gusty", - "gutless", - "guts", - "gutter", - "guy", - "guzzler", - "gyration", - "habitable", - "habitant", - "habitat", - "habitual", - "hacked", - "hacker", - "hacking", - "hacksaw", - "had", - "haggler", - "haiku", - "half", - "halogen", - "halt", - "halved", - "halves", - "hamburger", - "hamlet", - "hammock", - "hamper", - "hamster", - "hamstring", - "handbag", - "handball", - "handbook", - "handbrake", - "handcart", - "handclap", - "handclasp", - "handcraft", - "handcuff", - "handed", - "handful", - "handgrip", - "handgun", - "handheld", - "handiness", - "handiwork", - "handlebar", - "handled", - "handler", - "handling", - "handmade", - "handoff", - "handpick", - "handprint", - "handrail", - "handsaw", - "handset", - "handsfree", - "handshake", - "handstand", - "handwash", - "handwork", - "handwoven", - "handwrite", - "handyman", - "hangnail", - "hangout", - "hangover", - "hangup", - "hankering", - "hankie", - "hanky", - "haphazard", - "happening", - "happier", - "happiest", - "happily", - "happiness", - "happy", - "harbor", - "hardcopy", - "hardcore", - "hardcover", - "harddisk", - "hardened", - "hardener", - "hardening", - "hardhat", - "hardhead", - "hardiness", - "hardly", - "hardness", - "hardship", - "hardware", - "hardwired", - "hardwood", - "hardy", - "harmful", - "harmless", - "harmonica", - "harmonics", - "harmonize", - "harmony", - "harness", - "harpist", - "harsh", - "harvest", - "hash", - "hassle", - "haste", - "hastily", - "hastiness", - "hasty", - "hatbox", - "hatchback", - "hatchery", - "hatchet", - "hatching", - "hatchling", - "hate", - "hatless", - "hatred", - "haunt", - "haven", - "hazard", - "hazelnut", - "hazily", - "haziness", - "hazing", - "hazy", - "headache", - "headband", - "headboard", - "headcount", - "headdress", - "headed", - "header", - "headfirst", - "headgear", - "heading", - "headlamp", - "headless", - "headlock", - "headphone", - "headpiece", - "headrest", - "headroom", - "headscarf", - "headset", - "headsman", - "headstand", - "headstone", - "headway", - "headwear", - "heap", - "heat", - "heave", - "heavily", - "heaviness", - "heaving", - "hedge", - "hedging", - "heftiness", - "hefty", - "helium", - "helmet", - "helper", - "helpful", - "helping", - "helpless", - "helpline", - "hemlock", - "hemstitch", - "hence", - "henchman", - "henna", - "herald", - "herbal", - "herbicide", - "herbs", - "heritage", - "hermit", - "heroics", - "heroism", - "herring", - "herself", - "hertz", - "hesitancy", - "hesitant", - "hesitate", - "hexagon", - "hexagram", - "hubcap", - "huddle", - "huddling", - "huff", - "hug", - "hula", - "hulk", - "hull", - "human", - "humble", - "humbling", - "humbly", - "humid", - "humiliate", - "humility", - "humming", - "hummus", - "humongous", - "humorist", - "humorless", - "humorous", - "humpback", - "humped", - "humvee", - "hunchback", - "hundredth", - "hunger", - "hungrily", - "hungry", - "hunk", - "hunter", - "hunting", - "huntress", - "huntsman", - "hurdle", - "hurled", - "hurler", - "hurling", - "hurray", - "hurricane", - "hurried", - "hurry", - "hurt", - "husband", - "hush", - "husked", - "huskiness", - "hut", - "hybrid", - "hydrant", - "hydrated", - "hydration", - "hydrogen", - "hydroxide", - "hyperlink", - "hypertext", - "hyphen", - "hypnoses", - "hypnosis", - "hypnotic", - "hypnotism", - "hypnotist", - "hypnotize", - "hypocrisy", - "hypocrite", - "ibuprofen", - "ice", - "iciness", - "icing", - "icky", - "icon", - "icy", - "idealism", - "idealist", - "idealize", - "ideally", - "idealness", - "identical", - "identify", - "identity", - "ideology", - "idiocy", - "idiom", - "idly", - "igloo", - "ignition", - "ignore", - "iguana", - "illicitly", - "illusion", - "illusive", - "image", - "imaginary", - "imagines", - "imaging", - "imbecile", - "imitate", - "imitation", - "immature", - "immerse", - "immersion", - "imminent", - "immobile", - "immodest", - "immorally", - "immortal", - "immovable", - "immovably", - "immunity", - "immunize", - "impaired", - "impale", - "impart", - "impatient", - "impeach", - "impeding", - "impending", - "imperfect", - "imperial", - "impish", - "implant", - "implement", - "implicate", - "implicit", - "implode", - "implosion", - "implosive", - "imply", - "impolite", - "important", - "importer", - "impose", - "imposing", - "impotence", - "impotency", - "impotent", - "impound", - "imprecise", - "imprint", - "imprison", - "impromptu", - "improper", - "improve", - "improving", - "improvise", - "imprudent", - "impulse", - "impulsive", - "impure", - "impurity", - "iodine", - "iodize", - "ion", - "ipad", - "iphone", - "ipod", - "irate", - "irk", - "iron", - "irregular", - "irrigate", - "irritable", - "irritably", - "irritant", - "irritate", - "islamic", - "islamist", - "isolated", - "isolating", - "isolation", - "isotope", - "issue", - "issuing", - "italicize", - "italics", - "item", - "itinerary", - "itunes", - "ivory", - "ivy", - "jab", - "jackal", - "jacket", - "jackknife", - "jackpot", - "jailbird", - "jailbreak", - "jailer", - "jailhouse", - "jalapeno", - "jam", - "janitor", - "january", - "jargon", - "jarring", - "jasmine", - "jaundice", - "jaunt", - "java", - "jawed", - "jawless", - "jawline", - "jaws", - "jaybird", - "jaywalker", - "jazz", - "jeep", - "jeeringly", - "jellied", - "jelly", - "jersey", - "jester", - "jet", - "jiffy", - "jigsaw", - "jimmy", - "jingle", - "jingling", - "jinx", - "jitters", - "jittery", - "job", - "jockey", - "jockstrap", - "jogger", - "jogging", - "john", - "joining", - "jokester", - "jokingly", - "jolliness", - "jolly", - "jolt", - "jot", - "jovial", - "joyfully", - "joylessly", - "joyous", - "joyride", - "joystick", - "jubilance", - "jubilant", - "judge", - "judgingly", - "judicial", - "judiciary", - "judo", - "juggle", - "juggling", - "jugular", - "juice", - "juiciness", - "juicy", - "jujitsu", - "jukebox", - "july", - "jumble", - "jumbo", - "jump", - "junction", - "juncture", - "june", - "junior", - "juniper", - "junkie", - "junkman", - "junkyard", - "jurist", - "juror", - "jury", - "justice", - "justifier", - "justify", - "justly", - "justness", - "juvenile", - "kabob", - "kangaroo", - "karaoke", - "karate", - "karma", - "kebab", - "keenly", - "keenness", - "keep", - "keg", - "kelp", - "kennel", - "kept", - "kerchief", - "kerosene", - "kettle", - "kick", - "kiln", - "kilobyte", - "kilogram", - "kilometer", - "kilowatt", - "kilt", - "kimono", - "kindle", - "kindling", - "kindly", - "kindness", - "kindred", - "kinetic", - "kinfolk", - "king", - "kinship", - "kinsman", - "kinswoman", - "kissable", - "kisser", - "kissing", - "kitchen", - "kite", - "kitten", - "kitty", - "kiwi", - "kleenex", - "knapsack", - "knee", - "knelt", - "knickers", - "knoll", - "koala", - "kooky", - "kosher", - "krypton", - "kudos", - "kung", - "labored", - "laborer", - "laboring", - "laborious", - "labrador", - "ladder", - "ladies", - "ladle", - "ladybug", - "ladylike", - "lagged", - "lagging", - "lagoon", - "lair", - "lake", - "lance", - "landed", - "landfall", - "landfill", - "landing", - "landlady", - "landless", - "landline", - "landlord", - "landmark", - "landmass", - "landmine", - "landowner", - "landscape", - "landside", - "landslide", - "language", - "lankiness", - "lanky", - "lantern", - "lapdog", - "lapel", - "lapped", - "lapping", - "laptop", - "lard", - "large", - "lark", - "lash", - "lasso", - "last", - "latch", - "late", - "lather", - "latitude", - "latrine", - "latter", - "latticed", - "launch", - "launder", - "laundry", - "laurel", - "lavender", - "lavish", - "laxative", - "lazily", - "laziness", - "lazy", - "lecturer", - "left", - "legacy", - "legal", - "legend", - "legged", - "leggings", - "legible", - "legibly", - "legislate", - "lego", - "legroom", - "legume", - "legwarmer", - "legwork", - "lemon", - "lend", - "length", - "lens", - "lent", - "leotard", - "lesser", - "letdown", - "lethargic", - "lethargy", - "letter", - "lettuce", - "level", - "leverage", - "levers", - "levitate", - "levitator", - "liability", - "liable", - "liberty", - "librarian", - "library", - "licking", - "licorice", - "lid", - "life", - "lifter", - "lifting", - "liftoff", - "ligament", - "likely", - "likeness", - "likewise", - "liking", - "lilac", - "lilly", - "lily", - "limb", - "limeade", - "limelight", - "limes", - "limit", - "limping", - "limpness", - "line", - "lingo", - "linguini", - "linguist", - "lining", - "linked", - "linoleum", - "linseed", - "lint", - "lion", - "lip", - "liquefy", - "liqueur", - "liquid", - "lisp", - "list", - "litigate", - "litigator", - "litmus", - "litter", - "little", - "livable", - "lived", - "lively", - "liver", - "livestock", - "lividly", - "living", - "lizard", - "lubricant", - "lubricate", - "lucid", - "luckily", - "luckiness", - "luckless", - "lucrative", - "ludicrous", - "lugged", - "lukewarm", - "lullaby", - "lumber", - "luminance", - "luminous", - "lumpiness", - "lumping", - "lumpish", - "lunacy", - "lunar", - "lunchbox", - "luncheon", - "lunchroom", - "lunchtime", - "lung", - "lurch", - "lure", - "luridness", - "lurk", - "lushly", - "lushness", - "luster", - "lustfully", - "lustily", - "lustiness", - "lustrous", - "lusty", - "luxurious", - "luxury", - "lying", - "lyrically", - "lyricism", - "lyricist", - "lyrics", - "macarena", - "macaroni", - "macaw", - "mace", - "machine", - "machinist", - "magazine", - "magenta", - "maggot", - "magical", - "magician", - "magma", - "magnesium", - "magnetic", - "magnetism", - "magnetize", - "magnifier", - "magnify", - "magnitude", - "magnolia", - "mahogany", - "maimed", - "majestic", - "majesty", - "majorette", - "majority", - "makeover", - "maker", - "makeshift", - "making", - "malformed", - "malt", - "mama", - "mammal", - "mammary", - "mammogram", - "manager", - "managing", - "manatee", - "mandarin", - "mandate", - "mandatory", - "mandolin", - "manger", - "mangle", - "mango", - "mangy", - "manhandle", - "manhole", - "manhood", - "manhunt", - "manicotti", - "manicure", - "manifesto", - "manila", - "mankind", - "manlike", - "manliness", - "manly", - "manmade", - "manned", - "mannish", - "manor", - "manpower", - "mantis", - "mantra", - "manual", - "many", - "map", - "marathon", - "marauding", - "marbled", - "marbles", - "marbling", - "march", - "mardi", - "margarine", - "margarita", - "margin", - "marigold", - "marina", - "marine", - "marital", - "maritime", - "marlin", - "marmalade", - "maroon", - "married", - "marrow", - "marry", - "marshland", - "marshy", - "marsupial", - "marvelous", - "marxism", - "mascot", - "masculine", - "mashed", - "mashing", - "massager", - "masses", - "massive", - "mastiff", - "matador", - "matchbook", - "matchbox", - "matcher", - "matching", - "matchless", - "material", - "maternal", - "maternity", - "math", - "mating", - "matriarch", - "matrimony", - "matrix", - "matron", - "matted", - "matter", - "maturely", - "maturing", - "maturity", - "mauve", - "maverick", - "maximize", - "maximum", - "maybe", - "mayday", - "mayflower", - "moaner", - "moaning", - "mobile", - "mobility", - "mobilize", - "mobster", - "mocha", - "mocker", - "mockup", - "modified", - "modify", - "modular", - "modulator", - "module", - "moisten", - "moistness", - "moisture", - "molar", - "molasses", - "mold", - "molecular", - "molecule", - "molehill", - "mollusk", - "mom", - "monastery", - "monday", - "monetary", - "monetize", - "moneybags", - "moneyless", - "moneywise", - "mongoose", - "mongrel", - "monitor", - "monkhood", - "monogamy", - "monogram", - "monologue", - "monopoly", - "monorail", - "monotone", - "monotype", - "monoxide", - "monsieur", - "monsoon", - "monstrous", - "monthly", - "monument", - "moocher", - "moodiness", - "moody", - "mooing", - "moonbeam", - "mooned", - "moonlight", - "moonlike", - "moonlit", - "moonrise", - "moonscape", - "moonshine", - "moonstone", - "moonwalk", - "mop", - "morale", - "morality", - "morally", - "morbidity", - "morbidly", - "morphine", - "morphing", - "morse", - "mortality", - "mortally", - "mortician", - "mortified", - "mortify", - "mortuary", - "mosaic", - "mossy", - "most", - "mothball", - "mothproof", - "motion", - "motivate", - "motivator", - "motive", - "motocross", - "motor", - "motto", - "mountable", - "mountain", - "mounted", - "mounting", - "mourner", - "mournful", - "mouse", - "mousiness", - "moustache", - "mousy", - "mouth", - "movable", - "move", - "movie", - "moving", - "mower", - "mowing", - "much", - "muck", - "mud", - "mug", - "mulberry", - "mulch", - "mule", - "mulled", - "mullets", - "multiple", - "multiply", - "multitask", - "multitude", - "mumble", - "mumbling", - "mumbo", - "mummified", - "mummify", - "mummy", - "mumps", - "munchkin", - "mundane", - "municipal", - "muppet", - "mural", - "murkiness", - "murky", - "murmuring", - "muscular", - "museum", - "mushily", - "mushiness", - "mushroom", - "mushy", - "music", - "musket", - "muskiness", - "musky", - "mustang", - "mustard", - "muster", - "mustiness", - "musty", - "mutable", - "mutate", - "mutation", - "mute", - "mutilated", - "mutilator", - "mutiny", - "mutt", - "mutual", - "muzzle", - "myself", - "myspace", - "mystified", - "mystify", - "myth", - "nacho", - "nag", - "nail", - "name", - "naming", - "nanny", - "nanometer", - "nape", - "napkin", - "napped", - "napping", - "nappy", - "narrow", - "nastily", - "nastiness", - "national", - "native", - "nativity", - "natural", - "nature", - "naturist", - "nautical", - "navigate", - "navigator", - "navy", - "nearby", - "nearest", - "nearly", - "nearness", - "neatly", - "neatness", - "nebula", - "nebulizer", - "nectar", - "negate", - "negation", - "negative", - "neglector", - "negligee", - "negligent", - "negotiate", - "nemeses", - "nemesis", - "neon", - "nephew", - "nerd", - "nervous", - "nervy", - "nest", - "net", - "neurology", - "neuron", - "neurosis", - "neurotic", - "neuter", - "neutron", - "never", - "next", - "nibble", - "nickname", - "nicotine", - "niece", - "nifty", - "nimble", - "nimbly", - "nineteen", - "ninetieth", - "ninja", - "nintendo", - "ninth", - "nuclear", - "nuclei", - "nucleus", - "nugget", - "nullify", - "number", - "numbing", - "numbly", - "numbness", - "numeral", - "numerate", - "numerator", - "numeric", - "numerous", - "nuptials", - "nursery", - "nursing", - "nurture", - "nutcase", - "nutlike", - "nutmeg", - "nutrient", - "nutshell", - "nuttiness", - "nutty", - "nuzzle", - "nylon", - "oaf", - "oak", - "oasis", - "oat", - "obedience", - "obedient", - "obituary", - "object", - "obligate", - "obliged", - "oblivion", - "oblivious", - "oblong", - "obnoxious", - "oboe", - "obscure", - "obscurity", - "observant", - "observer", - "observing", - "obsessed", - "obsession", - "obsessive", - "obsolete", - "obstacle", - "obstinate", - "obstruct", - "obtain", - "obtrusive", - "obtuse", - "obvious", - "occultist", - "occupancy", - "occupant", - "occupier", - "occupy", - "ocean", - "ocelot", - "octagon", - "octane", - "october", - "octopus", - "ogle", - "oil", - "oink", - "ointment", - "okay", - "old", - "olive", - "olympics", - "omega", - "omen", - "ominous", - "omission", - "omit", - "omnivore", - "onboard", - "oncoming", - "ongoing", - "onion", - "online", - "onlooker", - "only", - "onscreen", - "onset", - "onshore", - "onslaught", - "onstage", - "onto", - "onward", - "onyx", - "oops", - "ooze", - "oozy", - "opacity", - "opal", - "open", - "operable", - "operate", - "operating", - "operation", - "operative", - "operator", - "opium", - "opossum", - "opponent", - "oppose", - "opposing", - "opposite", - "oppressed", - "oppressor", - "opt", - "opulently", - "osmosis", - "other", - "otter", - "ouch", - "ought", - "ounce", - "outage", - "outback", - "outbid", - "outboard", - "outbound", - "outbreak", - "outburst", - "outcast", - "outclass", - "outcome", - "outdated", - "outdoors", - "outer", - "outfield", - "outfit", - "outflank", - "outgoing", - "outgrow", - "outhouse", - "outing", - "outlast", - "outlet", - "outline", - "outlook", - "outlying", - "outmatch", - "outmost", - "outnumber", - "outplayed", - "outpost", - "outpour", - "output", - "outrage", - "outrank", - "outreach", - "outright", - "outscore", - "outsell", - "outshine", - "outshoot", - "outsider", - "outskirts", - "outsmart", - "outsource", - "outspoken", - "outtakes", - "outthink", - "outward", - "outweigh", - "outwit", - "oval", - "ovary", - "oven", - "overact", - "overall", - "overarch", - "overbid", - "overbill", - "overbite", - "overblown", - "overboard", - "overbook", - "overbuilt", - "overcast", - "overcoat", - "overcome", - "overcook", - "overcrowd", - "overdraft", - "overdrawn", - "overdress", - "overdrive", - "overdue", - "overeager", - "overeater", - "overexert", - "overfed", - "overfeed", - "overfill", - "overflow", - "overfull", - "overgrown", - "overhand", - "overhang", - "overhaul", - "overhead", - "overhear", - "overheat", - "overhung", - "overjoyed", - "overkill", - "overlabor", - "overlaid", - "overlap", - "overlay", - "overload", - "overlook", - "overlord", - "overlying", - "overnight", - "overpass", - "overpay", - "overplant", - "overplay", - "overpower", - "overprice", - "overrate", - "overreach", - "overreact", - "override", - "overripe", - "overrule", - "overrun", - "overshoot", - "overshot", - "oversight", - "oversized", - "oversleep", - "oversold", - "overspend", - "overstate", - "overstay", - "overstep", - "overstock", - "overstuff", - "oversweet", - "overtake", - "overthrow", - "overtime", - "overtly", - "overtone", - "overture", - "overturn", - "overuse", - "overvalue", - "overview", - "overwrite", - "owl", - "oxford", - "oxidant", - "oxidation", - "oxidize", - "oxidizing", - "oxygen", - "oxymoron", - "oyster", - "ozone", - "paced", - "pacemaker", - "pacific", - "pacifier", - "pacifism", - "pacifist", - "pacify", - "padded", - "padding", - "paddle", - "paddling", - "padlock", - "pagan", - "pager", - "paging", - "pajamas", - "palace", - "palatable", - "palm", - "palpable", - "palpitate", - "paltry", - "pampered", - "pamperer", - "pampers", - "pamphlet", - "panama", - "pancake", - "pancreas", - "panda", - "pandemic", - "pang", - "panhandle", - "panic", - "panning", - "panorama", - "panoramic", - "panther", - "pantomime", - "pantry", - "pants", - "pantyhose", - "paparazzi", - "papaya", - "paper", - "paprika", - "papyrus", - "parabola", - "parachute", - "parade", - "paradox", - "paragraph", - "parakeet", - "paralegal", - "paralyses", - "paralysis", - "paralyze", - "paramedic", - "parameter", - "paramount", - "parasail", - "parasite", - "parasitic", - "parcel", - "parched", - "parchment", - "pardon", - "parish", - "parka", - "parking", - "parkway", - "parlor", - "parmesan", - "parole", - "parrot", - "parsley", - "parsnip", - "partake", - "parted", - "parting", - "partition", - "partly", - "partner", - "partridge", - "party", - "passable", - "passably", - "passage", - "passcode", - "passenger", - "passerby", - "passing", - "passion", - "passive", - "passivism", - "passover", - "passport", - "password", - "pasta", - "pasted", - "pastel", - "pastime", - "pastor", - "pastrami", - "pasture", - "pasty", - "patchwork", - "patchy", - "paternal", - "paternity", - "path", - "patience", - "patient", - "patio", - "patriarch", - "patriot", - "patrol", - "patronage", - "patronize", - "pauper", - "pavement", - "paver", - "pavestone", - "pavilion", - "paving", - "pawing", - "payable", - "payback", - "paycheck", - "payday", - "payee", - "payer", - "paying", - "payment", - "payphone", - "payroll", - "pebble", - "pebbly", - "pecan", - "pectin", - "peculiar", - "peddling", - "pediatric", - "pedicure", - "pedigree", - "pedometer", - "pegboard", - "pelican", - "pellet", - "pelt", - "pelvis", - "penalize", - "penalty", - "pencil", - "pendant", - "pending", - "penholder", - "penknife", - "pennant", - "penniless", - "penny", - "penpal", - "pension", - "pentagon", - "pentagram", - "pep", - "perceive", - "percent", - "perch", - "percolate", - "perennial", - "perfected", - "perfectly", - "perfume", - "periscope", - "perish", - "perjurer", - "perjury", - "perkiness", - "perky", - "perm", - "peroxide", - "perpetual", - "perplexed", - "persecute", - "persevere", - "persuaded", - "persuader", - "pesky", - "peso", - "pessimism", - "pessimist", - "pester", - "pesticide", - "petal", - "petite", - "petition", - "petri", - "petroleum", - "petted", - "petticoat", - "pettiness", - "petty", - "petunia", - "phantom", - "phobia", - "phoenix", - "phonebook", - "phoney", - "phonics", - "phoniness", - "phony", - "phosphate", - "photo", - "phrase", - "phrasing", - "placard", - "placate", - "placidly", - "plank", - "planner", - "plant", - "plasma", - "plaster", - "plastic", - "plated", - "platform", - "plating", - "platinum", - "platonic", - "platter", - "platypus", - "plausible", - "plausibly", - "playable", - "playback", - "player", - "playful", - "playgroup", - "playhouse", - "playing", - "playlist", - "playmaker", - "playmate", - "playoff", - "playpen", - "playroom", - "playset", - "plaything", - "playtime", - "plaza", - "pleading", - "pleat", - "pledge", - "plentiful", - "plenty", - "plethora", - "plexiglas", - "pliable", - "plod", - "plop", - "plot", - "plow", - "ploy", - "pluck", - "plug", - "plunder", - "plunging", - "plural", - "plus", - "plutonium", - "plywood", - "poach", - "pod", - "poem", - "poet", - "pogo", - "pointed", - "pointer", - "pointing", - "pointless", - "pointy", - "poise", - "poison", - "poker", - "poking", - "polar", - "police", - "policy", - "polio", - "polish", - "politely", - "polka", - "polo", - "polyester", - "polygon", - "polygraph", - "polymer", - "poncho", - "pond", - "pony", - "popcorn", - "pope", - "poplar", - "popper", - "poppy", - "popsicle", - "populace", - "popular", - "populate", - "porcupine", - "pork", - "porous", - "porridge", - "portable", - "portal", - "portfolio", - "porthole", - "portion", - "portly", - "portside", - "poser", - "posh", - "posing", - "possible", - "possibly", - "possum", - "postage", - "postal", - "postbox", - "postcard", - "posted", - "poster", - "posting", - "postnasal", - "posture", - "postwar", - "pouch", - "pounce", - "pouncing", - "pound", - "pouring", - "pout", - "powdered", - "powdering", - "powdery", - "power", - "powwow", - "pox", - "praising", - "prance", - "prancing", - "pranker", - "prankish", - "prankster", - "prayer", - "praying", - "preacher", - "preaching", - "preachy", - "preamble", - "precinct", - "precise", - "precision", - "precook", - "precut", - "predator", - "predefine", - "predict", - "preface", - "prefix", - "preflight", - "preformed", - "pregame", - "pregnancy", - "pregnant", - "preheated", - "prelaunch", - "prelaw", - "prelude", - "premiere", - "premises", - "premium", - "prenatal", - "preoccupy", - "preorder", - "prepaid", - "prepay", - "preplan", - "preppy", - "preschool", - "prescribe", - "preseason", - "preset", - "preshow", - "president", - "presoak", - "press", - "presume", - "presuming", - "preteen", - "pretended", - "pretender", - "pretense", - "pretext", - "pretty", - "pretzel", - "prevail", - "prevalent", - "prevent", - "preview", - "previous", - "prewar", - "prewashed", - "prideful", - "pried", - "primal", - "primarily", - "primary", - "primate", - "primer", - "primp", - "princess", - "print", - "prior", - "prism", - "prison", - "prissy", - "pristine", - "privacy", - "private", - "privatize", - "prize", - "proactive", - "probable", - "probably", - "probation", - "probe", - "probing", - "probiotic", - "problem", - "procedure", - "process", - "proclaim", - "procreate", - "procurer", - "prodigal", - "prodigy", - "produce", - "product", - "profane", - "profanity", - "professed", - "professor", - "profile", - "profound", - "profusely", - "progeny", - "prognosis", - "program", - "progress", - "projector", - "prologue", - "prolonged", - "promenade", - "prominent", - "promoter", - "promotion", - "prompter", - "promptly", - "prone", - "prong", - "pronounce", - "pronto", - "proofing", - "proofread", - "proofs", - "propeller", - "properly", - "property", - "proponent", - "proposal", - "propose", - "props", - "prorate", - "protector", - "protegee", - "proton", - "prototype", - "protozoan", - "protract", - "protrude", - "proud", - "provable", - "proved", - "proven", - "provided", - "provider", - "providing", - "province", - "proving", - "provoke", - "provoking", - "provolone", - "prowess", - "prowler", - "prowling", - "proximity", - "proxy", - "prozac", - "prude", - "prudishly", - "prune", - "pruning", - "pry", - "psychic", - "public", - "publisher", - "pucker", - "pueblo", - "pug", - "pull", - "pulmonary", - "pulp", - "pulsate", - "pulse", - "pulverize", - "puma", - "pumice", - "pummel", - "punch", - "punctual", - "punctuate", - "punctured", - "pungent", - "punisher", - "punk", - "pupil", - "puppet", - "puppy", - "purchase", - "pureblood", - "purebred", - "purely", - "pureness", - "purgatory", - "purge", - "purging", - "purifier", - "purify", - "purist", - "puritan", - "purity", - "purple", - "purplish", - "purposely", - "purr", - "purse", - "pursuable", - "pursuant", - "pursuit", - "purveyor", - "pushcart", - "pushchair", - "pusher", - "pushiness", - "pushing", - "pushover", - "pushpin", - "pushup", - "pushy", - "putdown", - "putt", - "puzzle", - "puzzling", - "pyramid", - "pyromania", - "python", - "quack", - "quadrant", - "quail", - "quaintly", - "quake", - "quaking", - "qualified", - "qualifier", - "qualify", - "quality", - "qualm", - "quantum", - "quarrel", - "quarry", - "quartered", - "quarterly", - "quarters", - "quartet", - "quench", - "query", - "quicken", - "quickly", - "quickness", - "quicksand", - "quickstep", - "quiet", - "quill", - "quilt", - "quintet", - "quintuple", - "quirk", - "quit", - "quiver", - "quizzical", - "quotable", - "quotation", - "quote", - "rabid", - "race", - "racing", - "racism", - "rack", - "racoon", - "radar", - "radial", - "radiance", - "radiantly", - "radiated", - "radiation", - "radiator", - "radio", - "radish", - "raffle", - "raft", - "rage", - "ragged", - "raging", - "ragweed", - "raider", - "railcar", - "railing", - "railroad", - "railway", - "raisin", - "rake", - "raking", - "rally", - "ramble", - "rambling", - "ramp", - "ramrod", - "ranch", - "rancidity", - "random", - "ranged", - "ranger", - "ranging", - "ranked", - "ranking", - "ransack", - "ranting", - "rants", - "rare", - "rarity", - "rascal", - "rash", - "rasping", - "ravage", - "raven", - "ravine", - "raving", - "ravioli", - "ravishing", - "reabsorb", - "reach", - "reacquire", - "reaction", - "reactive", - "reactor", - "reaffirm", - "ream", - "reanalyze", - "reappear", - "reapply", - "reappoint", - "reapprove", - "rearrange", - "rearview", - "reason", - "reassign", - "reassure", - "reattach", - "reawake", - "rebalance", - "rebate", - "rebel", - "rebirth", - "reboot", - "reborn", - "rebound", - "rebuff", - "rebuild", - "rebuilt", - "reburial", - "rebuttal", - "recall", - "recant", - "recapture", - "recast", - "recede", - "recent", - "recess", - "recharger", - "recipient", - "recital", - "recite", - "reckless", - "reclaim", - "recliner", - "reclining", - "recluse", - "reclusive", - "recognize", - "recoil", - "recollect", - "recolor", - "reconcile", - "reconfirm", - "reconvene", - "recopy", - "record", - "recount", - "recoup", - "recovery", - "recreate", - "rectal", - "rectangle", - "rectified", - "rectify", - "recycled", - "recycler", - "recycling", - "reemerge", - "reenact", - "reenter", - "reentry", - "reexamine", - "referable", - "referee", - "reference", - "refill", - "refinance", - "refined", - "refinery", - "refining", - "refinish", - "reflected", - "reflector", - "reflex", - "reflux", - "refocus", - "refold", - "reforest", - "reformat", - "reformed", - "reformer", - "reformist", - "refract", - "refrain", - "refreeze", - "refresh", - "refried", - "refueling", - "refund", - "refurbish", - "refurnish", - "refusal", - "refuse", - "refusing", - "refutable", - "refute", - "regain", - "regalia", - "regally", - "reggae", - "regime", - "region", - "register", - "registrar", - "registry", - "regress", - "regretful", - "regroup", - "regular", - "regulate", - "regulator", - "rehab", - "reheat", - "rehire", - "rehydrate", - "reimburse", - "reissue", - "reiterate", - "rejoice", - "rejoicing", - "rejoin", - "rekindle", - "relapse", - "relapsing", - "relatable", - "related", - "relation", - "relative", - "relax", - "relay", - "relearn", - "release", - "relenting", - "reliable", - "reliably", - "reliance", - "reliant", - "relic", - "relieve", - "relieving", - "relight", - "relish", - "relive", - "reload", - "relocate", - "relock", - "reluctant", - "rely", - "remake", - "remark", - "remarry", - "rematch", - "remedial", - "remedy", - "remember", - "reminder", - "remindful", - "remission", - "remix", - "remnant", - "remodeler", - "remold", - "remorse", - "remote", - "removable", - "removal", - "removed", - "remover", - "removing", - "rename", - "renderer", - "rendering", - "rendition", - "renegade", - "renewable", - "renewably", - "renewal", - "renewed", - "renounce", - "renovate", - "renovator", - "rentable", - "rental", - "rented", - "renter", - "reoccupy", - "reoccur", - "reopen", - "reorder", - "repackage", - "repacking", - "repaint", - "repair", - "repave", - "repaying", - "repayment", - "repeal", - "repeated", - "repeater", - "repent", - "rephrase", - "replace", - "replay", - "replica", - "reply", - "reporter", - "repose", - "repossess", - "repost", - "repressed", - "reprimand", - "reprint", - "reprise", - "reproach", - "reprocess", - "reproduce", - "reprogram", - "reps", - "reptile", - "reptilian", - "repugnant", - "repulsion", - "repulsive", - "repurpose", - "reputable", - "reputably", - "request", - "require", - "requisite", - "reroute", - "rerun", - "resale", - "resample", - "rescuer", - "reseal", - "research", - "reselect", - "reseller", - "resemble", - "resend", - "resent", - "reset", - "reshape", - "reshoot", - "reshuffle", - "residence", - "residency", - "resident", - "residual", - "residue", - "resigned", - "resilient", - "resistant", - "resisting", - "resize", - "resolute", - "resolved", - "resonant", - "resonate", - "resort", - "resource", - "respect", - "resubmit", - "result", - "resume", - "resupply", - "resurface", - "resurrect", - "retail", - "retainer", - "retaining", - "retake", - "retaliate", - "retention", - "rethink", - "retinal", - "retired", - "retiree", - "retiring", - "retold", - "retool", - "retorted", - "retouch", - "retrace", - "retract", - "retrain", - "retread", - "retreat", - "retrial", - "retrieval", - "retriever", - "retry", - "return", - "retying", - "retype", - "reunion", - "reunite", - "reusable", - "reuse", - "reveal", - "reveler", - "revenge", - "revenue", - "reverb", - "revered", - "reverence", - "reverend", - "reversal", - "reverse", - "reversing", - "reversion", - "revert", - "revisable", - "revise", - "revision", - "revisit", - "revivable", - "revival", - "reviver", - "reviving", - "revocable", - "revoke", - "revolt", - "revolver", - "revolving", - "reward", - "rewash", - "rewind", - "rewire", - "reword", - "rework", - "rewrap", - "rewrite", - "rhyme", - "ribbon", - "ribcage", - "rice", - "riches", - "richly", - "richness", - "rickety", - "ricotta", - "riddance", - "ridden", - "ride", - "riding", - "rifling", - "rift", - "rigging", - "rigid", - "rigor", - "rimless", - "rimmed", - "rind", - "rink", - "rinse", - "rinsing", - "riot", - "ripcord", - "ripeness", - "ripening", - "ripping", - "ripple", - "rippling", - "riptide", - "rise", - "rising", - "risk", - "risotto", - "ritalin", - "ritzy", - "rival", - "riverbank", - "riverbed", - "riverboat", - "riverside", - "riveter", - "riveting", - "roamer", - "roaming", - "roast", - "robbing", - "robe", - "robin", - "robotics", - "robust", - "rockband", - "rocker", - "rocket", - "rockfish", - "rockiness", - "rocking", - "rocklike", - "rockslide", - "rockstar", - "rocky", - "rogue", - "roman", - "romp", - "rope", - "roping", - "roster", - "rosy", - "rotten", - "rotting", - "rotunda", - "roulette", - "rounding", - "roundish", - "roundness", - "roundup", - "roundworm", - "routine", - "routing", - "rover", - "roving", - "royal", - "rubbed", - "rubber", - "rubbing", - "rubble", - "rubdown", - "ruby", - "ruckus", - "rudder", - "rug", - "ruined", - "rule", - "rumble", - "rumbling", - "rummage", - "rumor", - "runaround", - "rundown", - "runner", - "running", - "runny", - "runt", - "runway", - "rupture", - "rural", - "ruse", - "rush", - "rust", - "rut", - "sabbath", - "sabotage", - "sacrament", - "sacred", - "sacrifice", - "sadden", - "saddlebag", - "saddled", - "saddling", - "sadly", - "sadness", - "safari", - "safeguard", - "safehouse", - "safely", - "safeness", - "saffron", - "saga", - "sage", - "sagging", - "saggy", - "said", - "saint", - "sake", - "salad", - "salami", - "salaried", - "salary", - "saline", - "salon", - "saloon", - "salsa", - "salt", - "salutary", - "salute", - "salvage", - "salvaging", - "salvation", - "same", - "sample", - "sampling", - "sanction", - "sanctity", - "sanctuary", - "sandal", - "sandbag", - "sandbank", - "sandbar", - "sandblast", - "sandbox", - "sanded", - "sandfish", - "sanding", - "sandlot", - "sandpaper", - "sandpit", - "sandstone", - "sandstorm", - "sandworm", - "sandy", - "sanitary", - "sanitizer", - "sank", - "santa", - "sapling", - "sappiness", - "sappy", - "sarcasm", - "sarcastic", - "sardine", - "sash", - "sasquatch", - "sassy", - "satchel", - "satiable", - "satin", - "satirical", - "satisfied", - "satisfy", - "saturate", - "saturday", - "sauciness", - "saucy", - "sauna", - "savage", - "savanna", - "saved", - "savings", - "savior", - "savor", - "saxophone", - "say", - "scabbed", - "scabby", - "scalded", - "scalding", - "scale", - "scaling", - "scallion", - "scallop", - "scalping", - "scam", - "scandal", - "scanner", - "scanning", - "scant", - "scapegoat", - "scarce", - "scarcity", - "scarecrow", - "scared", - "scarf", - "scarily", - "scariness", - "scarring", - "scary", - "scavenger", - "scenic", - "schedule", - "schematic", - "scheme", - "scheming", - "schilling", - "schnapps", - "scholar", - "science", - "scientist", - "scion", - "scoff", - "scolding", - "scone", - "scoop", - "scooter", - "scope", - "scorch", - "scorebook", - "scorecard", - "scored", - "scoreless", - "scorer", - "scoring", - "scorn", - "scorpion", - "scotch", - "scoundrel", - "scoured", - "scouring", - "scouting", - "scouts", - "scowling", - "scrabble", - "scraggly", - "scrambled", - "scrambler", - "scrap", - "scratch", - "scrawny", - "screen", - "scribble", - "scribe", - "scribing", - "scrimmage", - "script", - "scroll", - "scrooge", - "scrounger", - "scrubbed", - "scrubber", - "scruffy", - "scrunch", - "scrutiny", - "scuba", - "scuff", - "sculptor", - "sculpture", - "scurvy", - "scuttle", - "secluded", - "secluding", - "seclusion", - "second", - "secrecy", - "secret", - "sectional", - "sector", - "secular", - "securely", - "security", - "sedan", - "sedate", - "sedation", - "sedative", - "sediment", - "seduce", - "seducing", - "segment", - "seismic", - "seizing", - "seldom", - "selected", - "selection", - "selective", - "selector", - "self", - "seltzer", - "semantic", - "semester", - "semicolon", - "semifinal", - "seminar", - "semisoft", - "semisweet", - "senate", - "senator", - "send", - "senior", - "senorita", - "sensation", - "sensitive", - "sensitize", - "sensually", - "sensuous", - "sepia", - "september", - "septic", - "septum", - "sequel", - "sequence", - "sequester", - "series", - "sermon", - "serotonin", - "serpent", - "serrated", - "serve", - "service", - "serving", - "sesame", - "sessions", - "setback", - "setting", - "settle", - "settling", - "setup", - "sevenfold", - "seventeen", - "seventh", - "seventy", - "severity", - "shabby", - "shack", - "shaded", - "shadily", - "shadiness", - "shading", - "shadow", - "shady", - "shaft", - "shakable", - "shakily", - "shakiness", - "shaking", - "shaky", - "shale", - "shallot", - "shallow", - "shame", - "shampoo", - "shamrock", - "shank", - "shanty", - "shape", - "shaping", - "share", - "sharpener", - "sharper", - "sharpie", - "sharply", - "sharpness", - "shawl", - "sheath", - "shed", - "sheep", - "sheet", - "shelf", - "shell", - "shelter", - "shelve", - "shelving", - "sherry", - "shield", - "shifter", - "shifting", - "shiftless", - "shifty", - "shimmer", - "shimmy", - "shindig", - "shine", - "shingle", - "shininess", - "shining", - "shiny", - "ship", - "shirt", - "shivering", - "shock", - "shone", - "shoplift", - "shopper", - "shopping", - "shoptalk", - "shore", - "shortage", - "shortcake", - "shortcut", - "shorten", - "shorter", - "shorthand", - "shortlist", - "shortly", - "shortness", - "shorts", - "shortwave", - "shorty", - "shout", - "shove", - "showbiz", - "showcase", - "showdown", - "shower", - "showgirl", - "showing", - "showman", - "shown", - "showoff", - "showpiece", - "showplace", - "showroom", - "showy", - "shrank", - "shrapnel", - "shredder", - "shredding", - "shrewdly", - "shriek", - "shrill", - "shrimp", - "shrine", - "shrink", - "shrivel", - "shrouded", - "shrubbery", - "shrubs", - "shrug", - "shrunk", - "shucking", - "shudder", - "shuffle", - "shuffling", - "shun", - "shush", - "shut", - "shy", - "siamese", - "siberian", - "sibling", - "siding", - "sierra", - "siesta", - "sift", - "sighing", - "silenced", - "silencer", - "silent", - "silica", - "silicon", - "silk", - "silliness", - "silly", - "silo", - "silt", - "silver", - "similarly", - "simile", - "simmering", - "simple", - "simplify", - "simply", - "sincere", - "sincerity", - "singer", - "singing", - "single", - "singular", - "sinister", - "sinless", - "sinner", - "sinuous", - "sip", - "siren", - "sister", - "sitcom", - "sitter", - "sitting", - "situated", - "situation", - "sixfold", - "sixteen", - "sixth", - "sixties", - "sixtieth", - "sixtyfold", - "sizable", - "sizably", - "size", - "sizing", - "sizzle", - "sizzling", - "skater", - "skating", - "skedaddle", - "skeletal", - "skeleton", - "skeptic", - "sketch", - "skewed", - "skewer", - "skid", - "skied", - "skier", - "skies", - "skiing", - "skilled", - "skillet", - "skillful", - "skimmed", - "skimmer", - "skimming", - "skimpily", - "skincare", - "skinhead", - "skinless", - "skinning", - "skinny", - "skintight", - "skipper", - "skipping", - "skirmish", - "skirt", - "skittle", - "skydiver", - "skylight", - "skyline", - "skype", - "skyrocket", - "skyward", - "slab", - "slacked", - "slacker", - "slacking", - "slackness", - "slacks", - "slain", - "slam", - "slander", - "slang", - "slapping", - "slapstick", - "slashed", - "slashing", - "slate", - "slather", - "slaw", - "sled", - "sleek", - "sleep", - "sleet", - "sleeve", - "slept", - "sliceable", - "sliced", - "slicer", - "slicing", - "slick", - "slider", - "slideshow", - "sliding", - "slighted", - "slighting", - "slightly", - "slimness", - "slimy", - "slinging", - "slingshot", - "slinky", - "slip", - "slit", - "sliver", - "slobbery", - "slogan", - "sloped", - "sloping", - "sloppily", - "sloppy", - "slot", - "slouching", - "slouchy", - "sludge", - "slug", - "slum", - "slurp", - "slush", - "sly", - "small", - "smartly", - "smartness", - "smasher", - "smashing", - "smashup", - "smell", - "smelting", - "smile", - "smilingly", - "smirk", - "smite", - "smith", - "smitten", - "smock", - "smog", - "smoked", - "smokeless", - "smokiness", - "smoking", - "smoky", - "smolder", - "smooth", - "smother", - "smudge", - "smudgy", - "smuggler", - "smuggling", - "smugly", - "smugness", - "snack", - "snagged", - "snaking", - "snap", - "snare", - "snarl", - "snazzy", - "sneak", - "sneer", - "sneeze", - "sneezing", - "snide", - "sniff", - "snippet", - "snipping", - "snitch", - "snooper", - "snooze", - "snore", - "snoring", - "snorkel", - "snort", - "snout", - "snowbird", - "snowboard", - "snowbound", - "snowcap", - "snowdrift", - "snowdrop", - "snowfall", - "snowfield", - "snowflake", - "snowiness", - "snowless", - "snowman", - "snowplow", - "snowshoe", - "snowstorm", - "snowsuit", - "snowy", - "snub", - "snuff", - "snuggle", - "snugly", - "snugness", - "speak", - "spearfish", - "spearhead", - "spearman", - "spearmint", - "species", - "specimen", - "specked", - "speckled", - "specks", - "spectacle", - "spectator", - "spectrum", - "speculate", - "speech", - "speed", - "spellbind", - "speller", - "spelling", - "spendable", - "spender", - "spending", - "spent", - "spew", - "sphere", - "spherical", - "sphinx", - "spider", - "spied", - "spiffy", - "spill", - "spilt", - "spinach", - "spinal", - "spindle", - "spinner", - "spinning", - "spinout", - "spinster", - "spiny", - "spiral", - "spirited", - "spiritism", - "spirits", - "spiritual", - "splashed", - "splashing", - "splashy", - "splatter", - "spleen", - "splendid", - "splendor", - "splice", - "splicing", - "splinter", - "splotchy", - "splurge", - "spoilage", - "spoiled", - "spoiler", - "spoiling", - "spoils", - "spoken", - "spokesman", - "sponge", - "spongy", - "sponsor", - "spoof", - "spookily", - "spooky", - "spool", - "spoon", - "spore", - "sporting", - "sports", - "sporty", - "spotless", - "spotlight", - "spotted", - "spotter", - "spotting", - "spotty", - "spousal", - "spouse", - "spout", - "sprain", - "sprang", - "sprawl", - "spray", - "spree", - "sprig", - "spring", - "sprinkled", - "sprinkler", - "sprint", - "sprite", - "sprout", - "spruce", - "sprung", - "spry", - "spud", - "spur", - "sputter", - "spyglass", - "squabble", - "squad", - "squall", - "squander", - "squash", - "squatted", - "squatter", - "squatting", - "squeak", - "squealer", - "squealing", - "squeamish", - "squeegee", - "squeeze", - "squeezing", - "squid", - "squiggle", - "squiggly", - "squint", - "squire", - "squirt", - "squishier", - "squishy", - "stability", - "stabilize", - "stable", - "stack", - "stadium", - "staff", - "stage", - "staging", - "stagnant", - "stagnate", - "stainable", - "stained", - "staining", - "stainless", - "stalemate", - "staleness", - "stalling", - "stallion", - "stamina", - "stammer", - "stamp", - "stand", - "stank", - "staple", - "stapling", - "starboard", - "starch", - "stardom", - "stardust", - "starfish", - "stargazer", - "staring", - "stark", - "starless", - "starlet", - "starlight", - "starlit", - "starring", - "starry", - "starship", - "starter", - "starting", - "startle", - "startling", - "startup", - "starved", - "starving", - "stash", - "state", - "static", - "statistic", - "statue", - "stature", - "status", - "statute", - "statutory", - "staunch", - "stays", - "steadfast", - "steadier", - "steadily", - "steadying", - "steam", - "steed", - "steep", - "steerable", - "steering", - "steersman", - "stegosaur", - "stellar", - "stem", - "stench", - "stencil", - "step", - "stereo", - "sterile", - "sterility", - "sterilize", - "sterling", - "sternness", - "sternum", - "stew", - "stick", - "stiffen", - "stiffly", - "stiffness", - "stifle", - "stifling", - "stillness", - "stilt", - "stimulant", - "stimulate", - "stimuli", - "stimulus", - "stinger", - "stingily", - "stinging", - "stingray", - "stingy", - "stinking", - "stinky", - "stipend", - "stipulate", - "stir", - "stitch", - "stock", - "stoic", - "stoke", - "stole", - "stomp", - "stonewall", - "stoneware", - "stonework", - "stoning", - "stony", - "stood", - "stooge", - "stool", - "stoop", - "stoplight", - "stoppable", - "stoppage", - "stopped", - "stopper", - "stopping", - "stopwatch", - "storable", - "storage", - "storeroom", - "storewide", - "storm", - "stout", - "stove", - "stowaway", - "stowing", - "straddle", - "straggler", - "strained", - "strainer", - "straining", - "strangely", - "stranger", - "strangle", - "strategic", - "strategy", - "stratus", - "straw", - "stray", - "streak", - "stream", - "street", - "strength", - "strenuous", - "strep", - "stress", - "stretch", - "strewn", - "stricken", - "strict", - "stride", - "strife", - "strike", - "striking", - "strive", - "striving", - "strobe", - "strode", - "stroller", - "strongbox", - "strongly", - "strongman", - "struck", - "structure", - "strudel", - "struggle", - "strum", - "strung", - "strut", - "stubbed", - "stubble", - "stubbly", - "stubborn", - "stucco", - "stuck", - "student", - "studied", - "studio", - "study", - "stuffed", - "stuffing", - "stuffy", - "stumble", - "stumbling", - "stump", - "stung", - "stunned", - "stunner", - "stunning", - "stunt", - "stupor", - "sturdily", - "sturdy", - "styling", - "stylishly", - "stylist", - "stylized", - "stylus", - "suave", - "subarctic", - "subatomic", - "subdivide", - "subdued", - "subduing", - "subfloor", - "subgroup", - "subheader", - "subject", - "sublease", - "sublet", - "sublevel", - "sublime", - "submarine", - "submerge", - "submersed", - "submitter", - "subpanel", - "subpar", - "subplot", - "subprime", - "subscribe", - "subscript", - "subsector", - "subside", - "subsiding", - "subsidize", - "subsidy", - "subsoil", - "subsonic", - "substance", - "subsystem", - "subtext", - "subtitle", - "subtly", - "subtotal", - "subtract", - "subtype", - "suburb", - "subway", - "subwoofer", - "subzero", - "succulent", - "such", - "suction", - "sudden", - "sudoku", - "suds", - "sufferer", - "suffering", - "suffice", - "suffix", - "suffocate", - "suffrage", - "sugar", - "suggest", - "suing", - "suitable", - "suitably", - "suitcase", - "suitor", - "sulfate", - "sulfide", - "sulfite", - "sulfur", - "sulk", - "sullen", - "sulphate", - "sulphuric", - "sultry", - "superbowl", - "superglue", - "superhero", - "superior", - "superjet", - "superman", - "supermom", - "supernova", - "supervise", - "supper", - "supplier", - "supply", - "support", - "supremacy", - "supreme", - "surcharge", - "surely", - "sureness", - "surface", - "surfacing", - "surfboard", - "surfer", - "surgery", - "surgical", - "surging", - "surname", - "surpass", - "surplus", - "surprise", - "surreal", - "surrender", - "surrogate", - "surround", - "survey", - "survival", - "survive", - "surviving", - "survivor", - "sushi", - "suspect", - "suspend", - "suspense", - "sustained", - "sustainer", - "swab", - "swaddling", - "swagger", - "swampland", - "swan", - "swapping", - "swarm", - "sway", - "swear", - "sweat", - "sweep", - "swell", - "swept", - "swerve", - "swifter", - "swiftly", - "swiftness", - "swimmable", - "swimmer", - "swimming", - "swimsuit", - "swimwear", - "swinger", - "swinging", - "swipe", - "swirl", - "switch", - "swivel", - "swizzle", - "swooned", - "swoop", - "swoosh", - "swore", - "sworn", - "swung", - "sycamore", - "sympathy", - "symphonic", - "symphony", - "symptom", - "synapse", - "syndrome", - "synergy", - "synopses", - "synopsis", - "synthesis", - "synthetic", - "syrup", - "system", - "t-shirt", - "tabasco", - "tabby", - "tableful", - "tables", - "tablet", - "tableware", - "tabloid", - "tackiness", - "tacking", - "tackle", - "tackling", - "tacky", - "taco", - "tactful", - "tactical", - "tactics", - "tactile", - "tactless", - "tadpole", - "taekwondo", - "tag", - "tainted", - "take", - "taking", - "talcum", - "talisman", - "tall", - "talon", - "tamale", - "tameness", - "tamer", - "tamper", - "tank", - "tanned", - "tannery", - "tanning", - "tantrum", - "tapeless", - "tapered", - "tapering", - "tapestry", - "tapioca", - "tapping", - "taps", - "tarantula", - "target", - "tarmac", - "tarnish", - "tarot", - "tartar", - "tartly", - "tartness", - "task", - "tassel", - "taste", - "tastiness", - "tasting", - "tasty", - "tattered", - "tattle", - "tattling", - "tattoo", - "taunt", - "tavern", - "thank", - "that", - "thaw", - "theater", - "theatrics", - "thee", - "theft", - "theme", - "theology", - "theorize", - "thermal", - "thermos", - "thesaurus", - "these", - "thesis", - "thespian", - "thicken", - "thicket", - "thickness", - "thieving", - "thievish", - "thigh", - "thimble", - "thing", - "think", - "thinly", - "thinner", - "thinness", - "thinning", - "thirstily", - "thirsting", - "thirsty", - "thirteen", - "thirty", - "thong", - "thorn", - "those", - "thousand", - "thrash", - "thread", - "threaten", - "threefold", - "thrift", - "thrill", - "thrive", - "thriving", - "throat", - "throbbing", - "throng", - "throttle", - "throwaway", - "throwback", - "thrower", - "throwing", - "thud", - "thumb", - "thumping", - "thursday", - "thus", - "thwarting", - "thyself", - "tiara", - "tibia", - "tidal", - "tidbit", - "tidiness", - "tidings", - "tidy", - "tiger", - "tighten", - "tightly", - "tightness", - "tightrope", - "tightwad", - "tigress", - "tile", - "tiling", - "till", - "tilt", - "timid", - "timing", - "timothy", - "tinderbox", - "tinfoil", - "tingle", - "tingling", - "tingly", - "tinker", - "tinkling", - "tinsel", - "tinsmith", - "tint", - "tinwork", - "tiny", - "tipoff", - "tipped", - "tipper", - "tipping", - "tiptoeing", - "tiptop", - "tiring", - "tissue", - "trace", - "tracing", - "track", - "traction", - "tractor", - "trade", - "trading", - "tradition", - "traffic", - "tragedy", - "trailing", - "trailside", - "train", - "traitor", - "trance", - "tranquil", - "transfer", - "transform", - "translate", - "transpire", - "transport", - "transpose", - "trapdoor", - "trapeze", - "trapezoid", - "trapped", - "trapper", - "trapping", - "traps", - "trash", - "travel", - "traverse", - "travesty", - "tray", - "treachery", - "treading", - "treadmill", - "treason", - "treat", - "treble", - "tree", - "trekker", - "tremble", - "trembling", - "tremor", - "trench", - "trend", - "trespass", - "triage", - "trial", - "triangle", - "tribesman", - "tribunal", - "tribune", - "tributary", - "tribute", - "triceps", - "trickery", - "trickily", - "tricking", - "trickle", - "trickster", - "tricky", - "tricolor", - "tricycle", - "trident", - "tried", - "trifle", - "trifocals", - "trillion", - "trilogy", - "trimester", - "trimmer", - "trimming", - "trimness", - "trinity", - "trio", - "tripod", - "tripping", - "triumph", - "trivial", - "trodden", - "trolling", - "trombone", - "trophy", - "tropical", - "tropics", - "trouble", - "troubling", - "trough", - "trousers", - "trout", - "trowel", - "truce", - "truck", - "truffle", - "trump", - "trunks", - "trustable", - "trustee", - "trustful", - "trusting", - "trustless", - "truth", - "try", - "tubby", - "tubeless", - "tubular", - "tucking", - "tuesday", - "tug", - "tuition", - "tulip", - "tumble", - "tumbling", - "tummy", - "turban", - "turbine", - "turbofan", - "turbojet", - "turbulent", - "turf", - "turkey", - "turmoil", - "turret", - "turtle", - "tusk", - "tutor", - "tutu", - "tux", - "tweak", - "tweed", - "tweet", - "tweezers", - "twelve", - "twentieth", - "twenty", - "twerp", - "twice", - "twiddle", - "twiddling", - "twig", - "twilight", - "twine", - "twins", - "twirl", - "twistable", - "twisted", - "twister", - "twisting", - "twisty", - "twitch", - "twitter", - "tycoon", - "tying", - "tyke", - "udder", - "ultimate", - "ultimatum", - "ultra", - "umbilical", - "umbrella", - "umpire", - "unabashed", - "unable", - "unadorned", - "unadvised", - "unafraid", - "unaired", - "unaligned", - "unaltered", - "unarmored", - "unashamed", - "unaudited", - "unawake", - "unaware", - "unbaked", - "unbalance", - "unbeaten", - "unbend", - "unbent", - "unbiased", - "unbitten", - "unblended", - "unblessed", - "unblock", - "unbolted", - "unbounded", - "unboxed", - "unbraided", - "unbridle", - "unbroken", - "unbuckled", - "unbundle", - "unburned", - "unbutton", - "uncanny", - "uncapped", - "uncaring", - "uncertain", - "unchain", - "unchanged", - "uncharted", - "uncheck", - "uncivil", - "unclad", - "unclaimed", - "unclamped", - "unclasp", - "uncle", - "unclip", - "uncloak", - "unclog", - "unclothed", - "uncoated", - "uncoiled", - "uncolored", - "uncombed", - "uncommon", - "uncooked", - "uncork", - "uncorrupt", - "uncounted", - "uncouple", - "uncouth", - "uncover", - "uncross", - "uncrown", - "uncrushed", - "uncured", - "uncurious", - "uncurled", - "uncut", - "undamaged", - "undated", - "undaunted", - "undead", - "undecided", - "undefined", - "underage", - "underarm", - "undercoat", - "undercook", - "undercut", - "underdog", - "underdone", - "underfed", - "underfeed", - "underfoot", - "undergo", - "undergrad", - "underhand", - "underline", - "underling", - "undermine", - "undermost", - "underpaid", - "underpass", - "underpay", - "underrate", - "undertake", - "undertone", - "undertook", - "undertow", - "underuse", - "underwear", - "underwent", - "underwire", - "undesired", - "undiluted", - "undivided", - "undocked", - "undoing", - "undone", - "undrafted", - "undress", - "undrilled", - "undusted", - "undying", - "unearned", - "unearth", - "unease", - "uneasily", - "uneasy", - "uneatable", - "uneaten", - "unedited", - "unelected", - "unending", - "unengaged", - "unenvied", - "unequal", - "unethical", - "uneven", - "unexpired", - "unexposed", - "unfailing", - "unfair", - "unfasten", - "unfazed", - "unfeeling", - "unfiled", - "unfilled", - "unfitted", - "unfitting", - "unfixable", - "unfixed", - "unflawed", - "unfocused", - "unfold", - "unfounded", - "unframed", - "unfreeze", - "unfrosted", - "unfrozen", - "unfunded", - "unglazed", - "ungloved", - "unglue", - "ungodly", - "ungraded", - "ungreased", - "unguarded", - "unguided", - "unhappily", - "unhappy", - "unharmed", - "unhealthy", - "unheard", - "unhearing", - "unheated", - "unhelpful", - "unhidden", - "unhinge", - "unhitched", - "unholy", - "unhook", - "unicorn", - "unicycle", - "unified", - "unifier", - "uniformed", - "uniformly", - "unify", - "unimpeded", - "uninjured", - "uninstall", - "uninsured", - "uninvited", - "union", - "uniquely", - "unisexual", - "unison", - "unissued", - "unit", - "universal", - "universe", - "unjustly", - "unkempt", - "unkind", - "unknotted", - "unknowing", - "unknown", - "unlaced", - "unlatch", - "unlawful", - "unleaded", - "unlearned", - "unleash", - "unless", - "unleveled", - "unlighted", - "unlikable", - "unlimited", - "unlined", - "unlinked", - "unlisted", - "unlit", - "unlivable", - "unloaded", - "unloader", - "unlocked", - "unlocking", - "unlovable", - "unloved", - "unlovely", - "unloving", - "unluckily", - "unlucky", - "unmade", - "unmanaged", - "unmanned", - "unmapped", - "unmarked", - "unmasked", - "unmasking", - "unmatched", - "unmindful", - "unmixable", - "unmixed", - "unmolded", - "unmoral", - "unmovable", - "unmoved", - "unmoving", - "unnamable", - "unnamed", - "unnatural", - "unneeded", - "unnerve", - "unnerving", - "unnoticed", - "unopened", - "unopposed", - "unpack", - "unpadded", - "unpaid", - "unpainted", - "unpaired", - "unpaved", - "unpeeled", - "unpicked", - "unpiloted", - "unpinned", - "unplanned", - "unplanted", - "unpleased", - "unpledged", - "unplowed", - "unplug", - "unpopular", - "unproven", - "unquote", - "unranked", - "unrated", - "unraveled", - "unreached", - "unread", - "unreal", - "unreeling", - "unrefined", - "unrelated", - "unrented", - "unrest", - "unretired", - "unrevised", - "unrigged", - "unripe", - "unrivaled", - "unroasted", - "unrobed", - "unroll", - "unruffled", - "unruly", - "unrushed", - "unsaddle", - "unsafe", - "unsaid", - "unsalted", - "unsaved", - "unsavory", - "unscathed", - "unscented", - "unscrew", - "unsealed", - "unseated", - "unsecured", - "unseeing", - "unseemly", - "unseen", - "unselect", - "unselfish", - "unsent", - "unsettled", - "unshackle", - "unshaken", - "unshaved", - "unshaven", - "unsheathe", - "unshipped", - "unsightly", - "unsigned", - "unskilled", - "unsliced", - "unsmooth", - "unsnap", - "unsocial", - "unsoiled", - "unsold", - "unsolved", - "unsorted", - "unspoiled", - "unspoken", - "unstable", - "unstaffed", - "unstamped", - "unsteady", - "unsterile", - "unstirred", - "unstitch", - "unstopped", - "unstuck", - "unstuffed", - "unstylish", - "unsubtle", - "unsubtly", - "unsuited", - "unsure", - "unsworn", - "untagged", - "untainted", - "untaken", - "untamed", - "untangled", - "untapped", - "untaxed", - "unthawed", - "unthread", - "untidy", - "untie", - "until", - "untimed", - "untimely", - "untitled", - "untoasted", - "untold", - "untouched", - "untracked", - "untrained", - "untreated", - "untried", - "untrimmed", - "untrue", - "untruth", - "unturned", - "untwist", - "untying", - "unusable", - "unused", - "unusual", - "unvalued", - "unvaried", - "unvarying", - "unveiled", - "unveiling", - "unvented", - "unviable", - "unvisited", - "unvocal", - "unwanted", - "unwarlike", - "unwary", - "unwashed", - "unwatched", - "unweave", - "unwed", - "unwelcome", - "unwell", - "unwieldy", - "unwilling", - "unwind", - "unwired", - "unwitting", - "unwomanly", - "unworldly", - "unworn", - "unworried", - "unworthy", - "unwound", - "unwoven", - "unwrapped", - "unwritten", - "unzip", - "upbeat", - "upchuck", - "upcoming", - "upcountry", - "update", - "upfront", - "upgrade", - "upheaval", - "upheld", - "uphill", - "uphold", - "uplifted", - "uplifting", - "upload", - "upon", - "upper", - "upright", - "uprising", - "upriver", - "uproar", - "uproot", - "upscale", - "upside", - "upstage", - "upstairs", - "upstart", - "upstate", - "upstream", - "upstroke", - "upswing", - "uptake", - "uptight", - "uptown", - "upturned", - "upward", - "upwind", - "uranium", - "urban", - "urchin", - "urethane", - "urgency", - "urgent", - "urging", - "urologist", - "urology", - "usable", - "usage", - "useable", - "used", - "uselessly", - "user", - "usher", - "usual", - "utensil", - "utility", - "utilize", - "utmost", - "utopia", - "utter", - "vacancy", - "vacant", - "vacate", - "vacation", - "vagabond", - "vagrancy", - "vagrantly", - "vaguely", - "vagueness", - "valiant", - "valid", - "valium", - "valley", - "valuables", - "value", - "vanilla", - "vanish", - "vanity", - "vanquish", - "vantage", - "vaporizer", - "variable", - "variably", - "varied", - "variety", - "various", - "varmint", - "varnish", - "varsity", - "varying", - "vascular", - "vaseline", - "vastly", - "vastness", - "veal", - "vegan", - "veggie", - "vehicular", - "velcro", - "velocity", - "velvet", - "vendetta", - "vending", - "vendor", - "veneering", - "vengeful", - "venomous", - "ventricle", - "venture", - "venue", - "venus", - "verbalize", - "verbally", - "verbose", - "verdict", - "verify", - "verse", - "version", - "versus", - "vertebrae", - "vertical", - "vertigo", - "very", - "vessel", - "vest", - "veteran", - "veto", - "vexingly", - "viability", - "viable", - "vibes", - "vice", - "vicinity", - "victory", - "video", - "viewable", - "viewer", - "viewing", - "viewless", - "viewpoint", - "vigorous", - "village", - "villain", - "vindicate", - "vineyard", - "vintage", - "violate", - "violation", - "violator", - "violet", - "violin", - "viper", - "viral", - "virtual", - "virtuous", - "virus", - "visa", - "viscosity", - "viscous", - "viselike", - "visible", - "visibly", - "vision", - "visiting", - "visitor", - "visor", - "vista", - "vitality", - "vitalize", - "vitally", - "vitamins", - "vivacious", - "vividly", - "vividness", - "vixen", - "vocalist", - "vocalize", - "vocally", - "vocation", - "voice", - "voicing", - "void", - "volatile", - "volley", - "voltage", - "volumes", - "voter", - "voting", - "voucher", - "vowed", - "vowel", - "voyage", - "wackiness", - "wad", - "wafer", - "waffle", - "waged", - "wager", - "wages", - "waggle", - "wagon", - "wake", - "waking", - "walk", - "walmart", - "walnut", - "walrus", - "waltz", - "wand", - "wannabe", - "wanted", - "wanting", - "wasabi", - "washable", - "washbasin", - "washboard", - "washbowl", - "washcloth", - "washday", - "washed", - "washer", - "washhouse", - "washing", - "washout", - "washroom", - "washstand", - "washtub", - "wasp", - "wasting", - "watch", - "water", - "waviness", - "waving", - "wavy", - "whacking", - "whacky", - "wham", - "wharf", - "wheat", - "whenever", - "whiff", - "whimsical", - "whinny", - "whiny", - "whisking", - "whoever", - "whole", - "whomever", - "whoopee", - "whooping", - "whoops", - "why", - "wick", - "widely", - "widen", - "widget", - "widow", - "width", - "wieldable", - "wielder", - "wife", - "wifi", - "wikipedia", - "wildcard", - "wildcat", - "wilder", - "wildfire", - "wildfowl", - "wildland", - "wildlife", - "wildly", - "wildness", - "willed", - "willfully", - "willing", - "willow", - "willpower", - "wilt", - "wimp", - "wince", - "wincing", - "wind", - "wing", - "winking", - "winner", - "winnings", - "winter", - "wipe", - "wired", - "wireless", - "wiring", - "wiry", - "wisdom", - "wise", - "wish", - "wisplike", - "wispy", - "wistful", - "wizard", - "wobble", - "wobbling", - "wobbly", - "wok", - "wolf", - "wolverine", - "womanhood", - "womankind", - "womanless", - "womanlike", - "womanly", - "womb", - "woof", - "wooing", - "wool", - "woozy", - "word", - "work", - "worried", - "worrier", - "worrisome", - "worry", - "worsening", - "worshiper", - "worst", - "wound", - "woven", - "wow", - "wrangle", - "wrath", - "wreath", - "wreckage", - "wrecker", - "wrecking", - "wrench", - "wriggle", - "wriggly", - "wrinkle", - "wrinkly", - "wrist", - "writing", - "written", - "wrongdoer", - "wronged", - "wrongful", - "wrongly", - "wrongness", - "wrought", - "xbox", - "xerox", - "yahoo", - "yam", - "yanking", - "yapping", - "yard", - "yarn", - "yeah", - "yearbook", - "yearling", - "yearly", - "yearning", - "yeast", - "yelling", - "yelp", - "yen", - "yesterday", - "yiddish", - "yield", - "yin", - "yippee", - "yo-yo", - "yodel", - "yoga", - "yogurt", - "yonder", - "yoyo", - "yummy", - "zap", - "zealous", - "zebra", - "zen", - "zeppelin", - "zero", - "zestfully", - "zesty", - "zigzagged", - "zipfile", - "zipping", - "zippy", - "zips", - "zit", - "zodiac", - "zombie", - "zone", - "zoning", - "zookeeper", - "zoologist", - "zoology", - "zoom", -]; - -#[cfg(test)] -#[path = "tests/words.rs"] -mod words_tests; From 6bdf49990a5fafc1e31717ca252db519e0da3730 Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 29 Oct 2025 11:20:07 -0400 Subject: [PATCH 02/18] Removed .swp and .swo files I forgot to remove as well as some code for some buttons I was going to implement in cursive. --- cursive/src/.main.rs.swo | Bin 20480 -> 0 bytes cursive/src/.main.rs.swp | Bin 102400 -> 0 bytes cursive/src/main.rs | 24 ------------------------ src/.lib.rs.swp | Bin 12288 -> 0 bytes src/tests/.password_generator.rs.swp | Bin 12288 -> 0 bytes 5 files changed, 24 deletions(-) delete mode 100644 cursive/src/.main.rs.swo delete mode 100644 cursive/src/.main.rs.swp delete mode 100644 src/.lib.rs.swp delete mode 100644 src/tests/.password_generator.rs.swp diff --git a/cursive/src/.main.rs.swo b/cursive/src/.main.rs.swo deleted file mode 100644 index e4348d1d21145d734ab5b9398c1ae85798c2b511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 E7qm~!r~m)} diff --git a/cursive/src/.main.rs.swp b/cursive/src/.main.rs.swp deleted file mode 100644 index ede32565eb3901c2f235423a24011e31d85a9437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 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 M!KA=loK4052VMhXga7~l diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 321f63a0..0c721464 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -2310,30 +2310,6 @@ fn main() -> Result<()> { pgp_pull(ui, store.clone(), &xdg_data_home); } }) - - .leaf(CATALOG.gettext("Logout"), { - let store = store.clone(); - move |ui: &mut Cursive| { - create(ui, store.clone()); - } - }) - - .leaf(CATALOG.gettext("Edit Notes"), { - let store = store.clone(); - move |ui: &mut Cursive| { - create(ui, store.clone()); - } - }) - - .leaf(CATALOG.gettext("Edit Username"), { - let store = store.clone(); - move |ui: &mut Cursive| { - create(ui, store.clone()); - } - }) - - - .leaf(CATALOG.gettext("Import PGP Certificate from text"), { let store = store.clone(); move |ui: &mut Cursive| { diff --git a/src/.lib.rs.swp b/src/.lib.rs.swp deleted file mode 100644 index 33911d600b25601c3cfe8f3fd813649ee99adb01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&ubJh6vwj)o@^ES54^SrEyzr}o@}*HJS+<;1*;b+-R#WUnZQgkCRx_?pf^GA z*pmp}{j>BW=*5c%FTTv|k5Ve#lc2m|zsx3i`6lo4a#=S0t*70Ga3|Up^jsI>N;Qu7xtCo08sa=|+w=#LR z&b%j0elYNfC(@GCcp%k025#W{~!UG3i0-;5Z_7R|NrUl|M%B~*d^_d zek=>|ne>TtLh_`HbcOVDNr=lR!1>Lupd*==^bxMTOSwiuGre^f}yvwb1Y4)1!1LdF_ZIl0mi+`Ztfn)FfP9 z9vPb+XQrxvG5&lm}H-1(vi{6FT3dMogQ1l~Su}7`6$L zJluTsO!;|!)R<*ss1~wLHabfNt(~%6h)NwlV>7E)V#k#?&FX*5)#uVTQ>lKEYJj?) zM^&h~rZ{a1g0>2W1nX1?;j3#x82V%Abq+cu_P|)^Ieb1eO7?1(fH)+tv`4xNAJPuw zM~aRip{JpCs7bI7HJJmKv$R508n!U2BP6DzqpbP`HePpg?<=lPx# diff --git a/src/tests/.password_generator.rs.swp b/src/tests/.password_generator.rs.swp deleted file mode 100644 index a800dc865c73eba5d444ca6798c25ab9d96d9863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&y-or_5C`zV&ccuA3oO_i$;kmW2(h#<(S$}DV#s;y0SVsW?&3!b@&YEto)@vV z)aUR8G#19hSv^DiNTAg4pJZ6}Zg!9Tbrz%@GO&5jFx08WVf@?kw(}XV&i@I+STs7@0?G{ z!&uoziFPDvC07)Rt|;dB#W{u1Xe}2sO{;$FtG3kjAXbWhROigea@|VJw$JYq^|TZL Q_sz?4`DZKrZ`UgH2HyULi2wiq From 3ad00c45f5ea0a1c0e9def99707b4743b6f99b80 Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Fri, 31 Oct 2025 16:05:40 -0500 Subject: [PATCH 03/18] Added passphrase_generator.rs --- cursive/src/main.rs | 35 +- default.nix | 12 + flake.lock | 27 + flake.nix | 51 + share/wordlists/eff_large.wordlist | 7772 ++++++++++++++++++++++++++++ src/lib.rs | 2 + src/passphrase_generator.rs | 37 + 7 files changed, 7932 insertions(+), 4 deletions(-) create mode 100644 default.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 share/wordlists/eff_large.wordlist create mode 100644 src/passphrase_generator.rs diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 0c721464..dbd3f1ef 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -37,6 +37,7 @@ use hex::FromHex; use pass::Result; use ripasso::{ password_generator::password_generator, + passphrase_generator::passphrase_generator, crypto::CryptoImpl, git::{pull, push}, pass, @@ -443,11 +444,26 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { new_secret.zeroize(); }) - .button(CATALOG.gettext("Generate"), move |s| { + .button(CATALOG.gettext("Generate Password"), move |s| { let mut new_password = password_generator(20, 0); s.call_on_name("editbox", |e: &mut TextArea| { e.set_content(&new_password); }); + new_password.zeroize() + }) + + + .button(CATALOG.gettext("Generate Passphrase"), move |s| { + let mut new_password = match passphrase_generator(8) { + Ok(words) => words.join(" "), + Err(err) => { + eprintln!("Error generating passphrase: {}", err); + return; + } + }; + s.call_on_name("editbox", |e: &mut TextArea| { + e.set_content(&new_password); + }); new_password.zeroize(); }) .dismiss_button(CATALOG.gettext("Close")); @@ -695,8 +711,20 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { let d = Dialog::around(fields) .title(CATALOG.gettext("Add new password")) - .button(CATALOG.gettext("Generate"), move |s| { - let new_password = password_generator(20, 1); + .button(CATALOG.gettext("Generate Password"), move |s| { + let new_password = ripasso::password_generator::password_generator(20, 1); + s.call_on_name("new_password_input", |e: &mut EditView| { + e.set_content(new_password); + }); + }) + .button(CATALOG.gettext("Generate Passphrase"), move |s| { + let new_password = match ripasso::passphrase_generator::passphrase_generator(10) { + Ok(words) => words.join(" "), + Err(err) => { + eprintln!("Error generating passphrase: {}", err); + "error".to_string() + } + }; s.call_on_name("new_password_input", |e: &mut EditView| { e.set_content(new_password); }); @@ -716,7 +744,6 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { ui.add_layer(ev); } - fn delete_recipient(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { let mut l = ui .find_name::>>("recipients") diff --git a/default.nix b/default.nix new file mode 100644 index 00000000..7327b537 --- /dev/null +++ b/default.nix @@ -0,0 +1,12 @@ +{ + rustPlatform, + glib, + pkg-config, +}: +rustPlatform.buildRustPackage { + name = "ripasso"; + src = ./.; + buildInputs = [ glib ]; + nativeBuildInputs = [ pkg-config ]; + cargoHash = "sha256-UMhQgijZuZW2O/0Jk5Zn8P368KnDWZRXj5e1nDG40Gw="; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..d4068481 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1761672384, + "narHash": "sha256-o9KF3DJL7g7iYMZq9SWgfS1BFlNbsm6xplRjVlOCkXI=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "08dacfca559e1d7da38f3cf05f1f45ee9bfd213c", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..b8bf40e0 --- /dev/null +++ b/flake.nix @@ -0,0 +1,51 @@ +{ + description = "Rust flake"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs, ... }@inputs: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { inherit system; }; + + clangLibPath = "${pkgs.libclang.lib}/lib"; + opensslDev = pkgs.openssl.dev; + opensslOut = pkgs.openssl.out; + in + { + devShells.${system}.default = pkgs.mkShell { + packages = with pkgs; [ + rustc + cargo + clang + libclang + openssl + pkg-config + libgpg-error + nettle + gpgme + ripasso-cursive + ]; + + shellHook = '' + # Clang + export LIBCLANG_PATH=${clangLibPath} + export LD_LIBRARY_PATH=${clangLibPath}:${opensslOut}/lib:$LD_LIBRARY_PATH + + # OpenSSL + export OPENSSL_NO_VENDOR=1 + export OPENSSL_LIB_DIR=${opensslOut}/lib + export OPENSSL_INCLUDE_DIR=${opensslDev}/include + + echo "🔧 Environment configured:" + echo " LIBCLANG_PATH = $LIBCLANG_PATH" + echo " LD_LIBRARY_PATH = $LD_LIBRARY_PATH" + echo " OPENSSL_LIB_DIR = $OPENSSL_LIB_DIR" + echo " OPENSSL_INCLUDE_DIR = $OPENSSL_INCLUDE_DIR" + echo "🚀 Welcome to the Rust dev shell" + ''; + }; + }; +} diff --git a/share/wordlists/eff_large.wordlist b/share/wordlists/eff_large.wordlist new file mode 100644 index 00000000..1a5ae786 --- /dev/null +++ b/share/wordlists/eff_large.wordlist @@ -0,0 +1,7772 @@ +abacus +abdomen +abdominal +abide +abiding +ability +ablaze +able +abnormal +abrasion +abrasive +abreast +abridge +abroad +abruptly +absence +absentee +absently +absinthe +absolute +absolve +abstain +abstract +absurd +accent +acclaim +acclimate +accompany +account +accuracy +accurate +accustom +acetone +achiness +aching +acid +acorn +acquaint +acquire +acre +acrobat +acronym +acting +action +activate +activator +active +activism +activist +activity +actress +acts +acutely +acuteness +aeration +aerobics +aerosol +aerospace +afar +affair +affected +affecting +affection +affidavit +affiliate +affirm +affix +afflicted +affluent +afford +affront +aflame +afloat +aflutter +afoot +afraid +afterglow +afterlife +aftermath +aftermost +afternoon +aged +ageless +agency +agenda +agent +aggregate +aghast +agile +agility +aging +agnostic +agonize +agonizing +agony +agreeable +agreeably +agreed +agreeing +agreement +aground +ahead +ahoy +aide +aids +aim +ajar +alabaster +alarm +albatross +album +alfalfa +algebra +algorithm +alias +alibi +alienable +alienate +aliens +alike +alive +alkaline +alkalize +almanac +almighty +almost +aloe +aloft +aloha +alone +alongside +aloof +alphabet +alright +although +altitude +alto +aluminum +alumni +always +amaretto +amaze +amazingly +amber +ambiance +ambiguity +ambiguous +ambition +ambitious +ambulance +ambush +amendable +amendment +amends +amenity +amiable +amicably +amid +amigo +amino +amiss +ammonia +ammonium +amnesty +amniotic +among +amount +amperage +ample +amplifier +amplify +amply +amuck +amulet +amusable +amused +amusement +amuser +amusing +anaconda +anaerobic +anagram +anatomist +anatomy +anchor +anchovy +ancient +android +anemia +anemic +aneurism +anew +angelfish +angelic +anger +angled +angler +angles +angling +angrily +angriness +anguished +angular +animal +animate +animating +animation +animator +anime +animosity +ankle +annex +annotate +announcer +annoying +annually +annuity +anointer +another +answering +antacid +antarctic +anteater +antelope +antennae +anthem +anthill +anthology +antibody +antics +antidote +antihero +antiquely +antiques +antiquity +antirust +antitoxic +antitrust +antiviral +antivirus +antler +antonym +antsy +anvil +anybody +anyhow +anymore +anyone +anyplace +anything +anytime +anyway +anywhere +aorta +apache +apostle +appealing +appear +appease +appeasing +appendage +appendix +appetite +appetizer +applaud +applause +apple +appliance +applicant +applied +apply +appointee +appraisal +appraiser +apprehend +approach +approval +approve +apricot +april +apron +aptitude +aptly +aqua +aqueduct +arbitrary +arbitrate +ardently +area +arena +arguable +arguably +argue +arise +armadillo +armband +armchair +armed +armful +armhole +arming +armless +armoire +armored +armory +armrest +army +aroma +arose +around +arousal +arrange +array +arrest +arrival +arrive +arrogance +arrogant +arson +art +ascend +ascension +ascent +ascertain +ashamed +ashen +ashes +ashy +aside +askew +asleep +asparagus +aspect +aspirate +aspire +aspirin +astonish +astound +astride +astrology +astronaut +astronomy +astute +atlantic +atlas +atom +atonable +atop +atrium +atrocious +atrophy +attach +attain +attempt +attendant +attendee +attention +attentive +attest +attic +attire +attitude +attractor +attribute +atypical +auction +audacious +audacity +audible +audibly +audience +audio +audition +augmented +august +authentic +author +autism +autistic +autograph +automaker +automated +automatic +autopilot +available +avalanche +avatar +avenge +avenging +avenue +average +aversion +avert +aviation +aviator +avid +avoid +await +awaken +award +aware +awhile +awkward +awning +awoke +awry +axis +babble +babbling +babied +baboon +backache +backboard +backboned +backdrop +backed +backer +backfield +backfire +backhand +backing +backlands +backlash +backless +backlight +backlit +backlog +backpack +backpedal +backrest +backroom +backshift +backside +backslid +backspace +backspin +backstab +backstage +backtalk +backtrack +backup +backward +backwash +backwater +backyard +bacon +bacteria +bacterium +badass +badge +badland +badly +badness +baffle +baffling +bagel +bagful +baggage +bagged +baggie +bagginess +bagging +baggy +bagpipe +baguette +baked +bakery +bakeshop +baking +balance +balancing +balcony +balmy +balsamic +bamboo +banana +banish +banister +banjo +bankable +bankbook +banked +banker +banking +banknote +bankroll +banner +bannister +banshee +banter +barbecue +barbed +barbell +barber +barcode +barge +bargraph +barista +baritone +barley +barmaid +barman +barn +barometer +barrack +barracuda +barrel +barrette +barricade +barrier +barstool +bartender +barterer +bash +basically +basics +basil +basin +basis +basket +batboy +batch +bath +baton +bats +battalion +battered +battering +battery +batting +battle +bauble +bazooka +blabber +bladder +blade +blah +blame +blaming +blanching +blandness +blank +blaspheme +blasphemy +blast +blatancy +blatantly +blazer +blazing +bleach +bleak +bleep +blemish +blend +bless +blighted +blimp +bling +blinked +blinker +blinking +blinks +blip +blissful +blitz +blizzard +bloated +bloating +blob +blog +bloomers +blooming +blooper +blot +blouse +blubber +bluff +bluish +blunderer +blunt +blurb +blurred +blurry +blurt +blush +blustery +boaster +boastful +boasting +boat +bobbed +bobbing +bobble +bobcat +bobsled +bobtail +bodacious +body +bogged +boggle +bogus +boil +bok +bolster +bolt +bonanza +bonded +bonding +bondless +boned +bonehead +boneless +bonelike +boney +bonfire +bonnet +bonsai +bonus +bony +boogeyman +boogieman +book +boondocks +booted +booth +bootie +booting +bootlace +bootleg +boots +boozy +borax +boring +borough +borrower +borrowing +boss +botanical +botanist +botany +botch +both +bottle +bottling +bottom +bounce +bouncing +bouncy +bounding +boundless +bountiful +bovine +boxcar +boxer +boxing +boxlike +boxy +breach +breath +breeches +breeching +breeder +breeding +breeze +breezy +brethren +brewery +brewing +briar +bribe +brick +bride +bridged +brigade +bright +brilliant +brim +bring +brink +brisket +briskly +briskness +bristle +brittle +broadband +broadcast +broaden +broadly +broadness +broadside +broadways +broiler +broiling +broken +broker +bronchial +bronco +bronze +bronzing +brook +broom +brought +browbeat +brownnose +browse +browsing +bruising +brunch +brunette +brunt +brush +brussels +brute +brutishly +bubble +bubbling +bubbly +buccaneer +bucked +bucket +buckle +buckshot +buckskin +bucktooth +buckwheat +buddhism +buddhist +budding +buddy +budget +buffalo +buffed +buffer +buffing +buffoon +buggy +bulb +bulge +bulginess +bulgur +bulk +bulldog +bulldozer +bullfight +bullfrog +bullhorn +bullion +bullish +bullpen +bullring +bullseye +bullwhip +bully +bunch +bundle +bungee +bunion +bunkbed +bunkhouse +bunkmate +bunny +bunt +busboy +bush +busily +busload +bust +busybody +buzz +cabana +cabbage +cabbie +cabdriver +cable +caboose +cache +cackle +cacti +cactus +caddie +caddy +cadet +cadillac +cadmium +cage +cahoots +cake +calamari +calamity +calcium +calculate +calculus +caliber +calibrate +calm +caloric +calorie +calzone +camcorder +cameo +camera +camisole +camper +campfire +camping +campsite +campus +canal +canary +cancel +candied +candle +candy +cane +canine +canister +cannabis +canned +canning +cannon +cannot +canola +canon +canopener +canopy +canteen +canyon +capable +capably +capacity +cape +capillary +capital +capitol +capped +capricorn +capsize +capsule +caption +captivate +captive +captivity +capture +caramel +carat +caravan +carbon +cardboard +carded +cardiac +cardigan +cardinal +cardstock +carefully +caregiver +careless +caress +caretaker +cargo +caring +carless +carload +carmaker +carnage +carnation +carnival +carnivore +carol +carpenter +carpentry +carpool +carport +carried +carrot +carrousel +carry +cartel +cartload +carton +cartoon +cartridge +cartwheel +carve +carving +carwash +cascade +case +cash +casing +casino +casket +cassette +casually +casualty +catacomb +catalog +catalyst +catalyze +catapult +cataract +catatonic +catcall +catchable +catcher +catching +catchy +caterer +catering +catfight +catfish +cathedral +cathouse +catlike +catnap +catnip +catsup +cattail +cattishly +cattle +catty +catwalk +caucasian +caucus +causal +causation +cause +causing +cauterize +caution +cautious +cavalier +cavalry +caviar +cavity +cedar +celery +celestial +celibacy +celibate +celtic +cement +census +ceramics +ceremony +certainly +certainty +certified +certify +cesarean +cesspool +chafe +chaffing +chain +chair +chalice +challenge +chamber +chamomile +champion +chance +change +channel +chant +chaos +chaperone +chaplain +chapped +chaps +chapter +character +charbroil +charcoal +charger +charging +chariot +charity +charm +charred +charter +charting +chase +chasing +chaste +chastise +chastity +chatroom +chatter +chatting +chatty +cheating +cheddar +cheek +cheer +cheese +cheesy +chef +chemicals +chemist +chemo +cherisher +cherub +chess +chest +chevron +chevy +chewable +chewer +chewing +chewy +chief +chihuahua +childcare +childhood +childish +childless +childlike +chili +chill +chimp +chip +chirping +chirpy +chitchat +chivalry +chive +chloride +chlorine +choice +chokehold +choking +chomp +chooser +choosing +choosy +chop +chosen +chowder +chowtime +chrome +chubby +chuck +chug +chummy +chump +chunk +churn +chute +cider +cilantro +cinch +cinema +cinnamon +circle +circling +circular +circulate +circus +citable +citadel +citation +citizen +citric +citrus +city +civic +civil +clad +claim +clambake +clammy +clamor +clamp +clamshell +clang +clanking +clapped +clapper +clapping +clarify +clarinet +clarity +clash +clasp +class +clatter +clause +clavicle +claw +clay +clean +clear +cleat +cleaver +cleft +clench +clergyman +clerical +clerk +clever +clicker +client +climate +climatic +cling +clinic +clinking +clip +clique +cloak +clobber +clock +clone +cloning +closable +closure +clothes +clothing +cloud +clover +clubbed +clubbing +clubhouse +clump +clumsily +clumsy +clunky +clustered +clutch +clutter +coach +coagulant +coastal +coaster +coasting +coastland +coastline +coat +coauthor +cobalt +cobbler +cobweb +cocoa +coconut +cod +coeditor +coerce +coexist +coffee +cofounder +cognition +cognitive +cogwheel +coherence +coherent +cohesive +coil +coke +cola +cold +coleslaw +coliseum +collage +collapse +collar +collected +collector +collide +collie +collision +colonial +colonist +colonize +colony +colossal +colt +coma +come +comfort +comfy +comic +coming +comma +commence +commend +comment +commerce +commode +commodity +commodore +common +commotion +commute +commuting +compacted +compacter +compactly +compactor +companion +company +compare +compel +compile +comply +component +composed +composer +composite +compost +composure +compound +compress +comprised +computer +computing +comrade +concave +conceal +conceded +concept +concerned +concert +conch +concierge +concise +conclude +concrete +concur +condense +condiment +condition +condone +conducive +conductor +conduit +cone +confess +confetti +confidant +confident +confider +confiding +configure +confined +confining +confirm +conflict +conform +confound +confront +confused +confusing +confusion +congenial +congested +congrats +congress +conical +conjoined +conjure +conjuror +connected +connector +consensus +consent +console +consoling +consonant +constable +constant +constrain +constrict +construct +consult +consumer +consuming +contact +container +contempt +contend +contented +contently +contents +contest +context +contort +contour +contrite +control +contusion +convene +convent +copartner +cope +copied +copier +copilot +coping +copious +copper +copy +coral +cork +cornball +cornbread +corncob +cornea +corned +corner +cornfield +cornflake +cornhusk +cornmeal +cornstalk +corny +coronary +coroner +corporal +corporate +corral +correct +corridor +corrode +corroding +corrosive +corsage +corset +cortex +cosigner +cosmetics +cosmic +cosmos +cosponsor +cost +cottage +cotton +couch +cough +could +countable +countdown +counting +countless +country +county +courier +covenant +cover +coveted +coveting +coyness +cozily +coziness +cozy +crabbing +crabgrass +crablike +crabmeat +cradle +cradling +crafter +craftily +craftsman +craftwork +crafty +cramp +cranberry +crane +cranial +cranium +crank +crate +crave +craving +crawfish +crawlers +crawling +crayfish +crayon +crazed +crazily +craziness +crazy +creamed +creamer +creamlike +crease +creasing +creatable +create +creation +creative +creature +credible +credibly +credit +creed +creme +creole +crepe +crept +crescent +crested +cresting +crestless +crevice +crewless +crewman +crewmate +crib +cricket +cried +crier +crimp +crimson +cringe +cringing +crinkle +crinkly +crisped +crisping +crisply +crispness +crispy +criteria +critter +croak +crock +crook +croon +crop +cross +crouch +crouton +crowbar +crowd +crown +crucial +crudely +crudeness +cruelly +cruelness +cruelty +crumb +crummiest +crummy +crumpet +crumpled +cruncher +crunching +crunchy +crusader +crushable +crushed +crusher +crushing +crust +crux +crying +cryptic +crystal +cubbyhole +cube +cubical +cubicle +cucumber +cuddle +cuddly +cufflink +culinary +culminate +culpable +culprit +cultivate +cultural +culture +cupbearer +cupcake +cupid +cupped +cupping +curable +curator +curdle +cure +curfew +curing +curled +curler +curliness +curling +curly +curry +curse +cursive +cursor +curtain +curtly +curtsy +curvature +curve +curvy +cushy +cusp +cussed +custard +custodian +custody +customary +customer +customize +customs +cut +cycle +cyclic +cycling +cyclist +cylinder +cymbal +cytoplasm +cytoplast +dab +dad +daffodil +dagger +daily +daintily +dainty +dairy +daisy +dallying +dance +dancing +dandelion +dander +dandruff +dandy +danger +dangle +dangling +daredevil +dares +daringly +darkened +darkening +darkish +darkness +darkroom +darling +darn +dart +darwinism +dash +dastardly +data +datebook +dating +daughter +daunting +dawdler +dawn +daybed +daybreak +daycare +daydream +daylight +daylong +dayroom +daytime +dazzler +dazzling +deacon +deafening +deafness +dealer +dealing +dealmaker +dealt +dean +debatable +debate +debating +debit +debrief +debtless +debtor +debug +debunk +decade +decaf +decal +decathlon +decay +deceased +deceit +deceiver +deceiving +december +decency +decent +deception +deceptive +decibel +decidable +decimal +decimeter +decipher +deck +declared +decline +decode +decompose +decorated +decorator +decoy +decrease +decree +dedicate +dedicator +deduce +deduct +deed +deem +deepen +deeply +deepness +deface +defacing +defame +default +defeat +defection +defective +defendant +defender +defense +defensive +deferral +deferred +defiance +defiant +defile +defiling +define +definite +deflate +deflation +deflator +deflected +deflector +defog +deforest +defraud +defrost +deftly +defuse +defy +degraded +degrading +degrease +degree +dehydrate +deity +dejected +delay +delegate +delegator +delete +deletion +delicacy +delicate +delicious +delighted +delirious +delirium +deliverer +delivery +delouse +delta +deluge +delusion +deluxe +demanding +demeaning +demeanor +demise +democracy +democrat +demote +demotion +demystify +denatured +deniable +denial +denim +denote +dense +density +dental +dentist +denture +deny +deodorant +deodorize +departed +departure +depict +deplete +depletion +deplored +deploy +deport +depose +depraved +depravity +deprecate +depress +deprive +depth +deputize +deputy +derail +deranged +derby +derived +desecrate +deserve +deserving +designate +designed +designer +designing +deskbound +desktop +deskwork +desolate +despair +despise +despite +destiny +destitute +destruct +detached +detail +detection +detective +detector +detention +detergent +detest +detonate +detonator +detoxify +detract +deuce +devalue +deviancy +deviant +deviate +deviation +deviator +device +devious +devotedly +devotee +devotion +devourer +devouring +devoutly +dexterity +dexterous +diabetes +diabetic +diabolic +diagnoses +diagnosis +diagram +dial +diameter +diaper +diaphragm +diary +dice +dicing +dictate +dictation +dictator +difficult +diffused +diffuser +diffusion +diffusive +dig +dilation +diligence +diligent +dill +dilute +dime +diminish +dimly +dimmed +dimmer +dimness +dimple +diner +dingbat +dinghy +dinginess +dingo +dingy +dining +dinner +diocese +dioxide +diploma +dipped +dipper +dipping +directed +direction +directive +directly +directory +direness +dirtiness +disabled +disagree +disallow +disarm +disarray +disaster +disband +disbelief +disburse +discard +discern +discharge +disclose +discolor +discount +discourse +discover +discuss +disdain +disengage +disfigure +disgrace +dish +disinfect +disjoin +disk +dislike +disliking +dislocate +dislodge +disloyal +dismantle +dismay +dismiss +dismount +disobey +disorder +disown +disparate +disparity +dispatch +dispense +dispersal +dispersed +disperser +displace +display +displease +disposal +dispose +disprove +dispute +disregard +disrupt +dissuade +distance +distant +distaste +distill +distinct +distort +distract +distress +district +distrust +ditch +ditto +ditzy +dividable +divided +dividend +dividers +dividing +divinely +diving +divinity +divisible +divisibly +division +divisive +divorcee +dizziness +dizzy +doable +docile +dock +doctrine +document +dodge +dodgy +doily +doing +dole +dollar +dollhouse +dollop +dolly +dolphin +domain +domelike +domestic +dominion +dominoes +donated +donation +donator +donor +donut +doodle +doorbell +doorframe +doorknob +doorman +doormat +doornail +doorpost +doorstep +doorstop +doorway +doozy +dork +dormitory +dorsal +dosage +dose +dotted +doubling +douche +dove +down +dowry +doze +drab +dragging +dragonfly +dragonish +dragster +drainable +drainage +drained +drainer +drainpipe +dramatic +dramatize +drank +drapery +drastic +draw +dreaded +dreadful +dreadlock +dreamboat +dreamily +dreamland +dreamless +dreamlike +dreamt +dreamy +drearily +dreary +drench +dress +drew +dribble +dried +drier +drift +driller +drilling +drinkable +drinking +dripping +drippy +drivable +driven +driver +driveway +driving +drizzle +drizzly +drone +drool +droop +dropforge +dropkick +droplet +dropout +dropper +drove +drown +drowsily +drudge +drum +dry +dubbed +dubiously +duchess +duckbill +ducking +duckling +ducktail +ducky +duct +dude +duffel +dugout +duh +duke +duller +dullness +duly +dumping +dumpling +dumpster +duo +dupe +duplex +duplicate +duplicity +durable +durably +duration +duress +during +dusk +dust +dutiful +duty +duvet +dwarf +dweeb +dwelled +dweller +dwelling +dwindle +dwindling +dynamic +dynamite +dynasty +dyslexia +dyslexic +each +eagle +earache +eardrum +earflap +earful +earlobe +early +earmark +earmuff +earphone +earpiece +earplugs +earring +earshot +earthen +earthlike +earthling +earthly +earthworm +earthy +earwig +easeful +easel +easiest +easily +easiness +easing +eastbound +eastcoast +easter +eastward +eatable +eaten +eatery +eating +eats +eaves +ebony +ebook +echelon +echidna +echo +eclair +eclipse +ecologist +ecology +economic +economist +economy +ecosphere +ecosystem +edge +edginess +edging +edgy +edition +editor +educated +education +educator +eel +effective +effects +efficient +effort +eggbeater +egging +eggnog +eggplant +eggshell +egomaniac +egotism +egotistic +either +eject +elaborate +elastic +elated +elbow +eldercare +elderly +eldest +electable +election +elective +elephant +elevate +elevating +elevation +elevator +eleven +elf +eligible +eligibly +eliminate +elite +elitism +elixir +elk +ellipse +elliptic +elm +elongated +elope +eloquence +eloquent +elsewhere +elude +elusive +elves +email +embargo +embark +embassy +embattled +embellish +ember +embezzle +emblaze +emblem +embody +embolism +emboss +embroider +emcee +emerald +emergency +emission +emit +emote +emoticon +emotion +empathic +empathy +emperor +emphases +emphasis +emphasize +emphatic +empirical +employed +employee +employer +emporium +empower +emptier +emptiness +empty +emu +enable +enactment +enamel +enchanted +enchilada +encircle +enclose +enclosure +encode +encore +encounter +encourage +encroach +encrust +encrypt +endanger +endeared +endearing +ended +ending +endless +endnote +endocrine +endorphin +endorse +endowment +endpoint +endurable +endurance +enduring +energetic +energize +energy +enforced +enforcer +engaged +engaging +engine +engorge +engraved +engraver +engraving +engross +engulf +enhance +enigmatic +enjoyable +enjoyably +enjoyer +enjoying +enjoyment +enlarged +enlarging +enlighten +enlisted +enquirer +enrage +enrich +enroll +enslave +ensnare +ensure +entail +entangled +entering +entertain +enticing +entire +entitle +entity +entomb +entourage +entrap +entree +entrench +entrust +entryway +entwine +enunciate +envelope +enviable +enviably +envious +envision +envoy +envy +enzyme +epic +epidemic +epidermal +epidermis +epidural +epilepsy +epileptic +epilogue +epiphany +episode +equal +equate +equation +equator +equinox +equipment +equity +equivocal +eradicate +erasable +erased +eraser +erasure +ergonomic +errand +errant +erratic +error +erupt +escalate +escalator +escapable +escapade +escapist +escargot +eskimo +esophagus +espionage +espresso +esquire +essay +essence +essential +establish +estate +esteemed +estimate +estimator +estranged +estrogen +etching +eternal +eternity +ethanol +ether +ethically +ethics +euphemism +evacuate +evacuee +evade +evaluate +evaluator +evaporate +evasion +evasive +even +everglade +evergreen +everybody +everyday +everyone +evict +evidence +evident +evil +evoke +evolution +evolve +exact +exalted +example +excavate +excavator +exceeding +exception +excess +exchange +excitable +exciting +exclaim +exclude +excluding +exclusion +exclusive +excretion +excretory +excursion +excusable +excusably +excuse +exemplary +exemplify +exemption +exerciser +exert +exes +exfoliate +exhale +exhaust +exhume +exile +existing +exit +exodus +exonerate +exorcism +exorcist +expand +expanse +expansion +expansive +expectant +expedited +expediter +expel +expend +expenses +expensive +expert +expire +expiring +explain +expletive +explicit +explode +exploit +explore +exploring +exponent +exporter +exposable +expose +exposure +express +expulsion +exquisite +extended +extending +extent +extenuate +exterior +external +extinct +extortion +extradite +extras +extrovert +extrude +extruding +exuberant +fable +fabric +fabulous +facebook +facecloth +facedown +faceless +facelift +faceplate +faceted +facial +facility +facing +facsimile +faction +factoid +factor +factsheet +factual +faculty +fade +fading +failing +falcon +fall +false +falsify +fame +familiar +family +famine +famished +fanatic +fancied +fanciness +fancy +fanfare +fang +fanning +fantasize +fantastic +fantasy +fascism +fastball +faster +fasting +fastness +faucet +favorable +favorably +favored +favoring +favorite +fax +feast +federal +fedora +feeble +feed +feel +feisty +feline +feminine +feminism +feminist +feminize +femur +fence +fencing +fender +ferment +fernlike +ferocious +ferocity +ferret +ferris +ferry +fervor +fester +festival +festive +festivity +fetal +fetch +fever +fiber +fiction +fiddle +fiddling +fidelity +fidgeting +fidgety +fifteen +fifth +fiftieth +fifty +figment +figure +figurine +filing +filled +filler +filling +film +filter +filth +filtrate +finale +finalist +finalize +finally +finance +financial +finch +fineness +finer +finicky +finished +finisher +finishing +finite +finless +finlike +fiscally +fit +five +flaccid +flagman +flagpole +flagship +flagstick +flagstone +flail +flakily +flaky +flame +flammable +flanked +flanking +flannels +flap +flaring +flashback +flashbulb +flashcard +flashily +flashing +flashy +flask +flatbed +flatfoot +flatly +flatness +flatten +flattered +flatterer +flattery +flattop +flatware +flatworm +flavored +flavorful +flavoring +flaxseed +fled +fleshed +fleshy +flick +flier +flight +flinch +fling +flint +flip +flirt +float +flock +flogging +flop +floral +florist +floss +flounder +flyable +flyaway +flyer +flying +flyover +flypaper +foam +foe +fog +foil +folic +folk +follicle +follow +fondling +fondly +fondness +fondue +font +food +fool +footage +football +footbath +footboard +footer +footgear +foothill +foothold +footing +footless +footman +footnote +footpad +footpath +footprint +footrest +footstool +footway +footwear +footwork +fossil +foster +founder +founding +fountain +fox +foyer +fraction +fracture +fragile +fragility +fragment +fragrance +fragrant +frail +frame +framing +frantic +fraternal +frayed +fraying +frays +freckled +freckles +freebase +freebee +freebie +freedom +freefall +freehand +freeing +freeload +freely +freemason +freeness +freestyle +freeware +freeway +freewill +freezable +freezing +freight +french +frenzied +frenzy +frequency +frequent +fresh +fretful +fretted +friction +friday +fridge +fried +friend +frighten +frightful +frigidity +frigidly +frill +fringe +frisbee +frisk +fritter +frivolous +frolic +from +front +frostbite +frosted +frostily +frosting +frostlike +frosty +froth +frown +frozen +fructose +frugality +frugally +fruit +frustrate +frying +gab +gaffe +gag +gainfully +gaining +gains +gala +gallantly +galleria +gallery +galley +gallon +gallows +gallstone +galore +galvanize +gambling +game +gaming +gamma +gander +gangly +gangrene +gangway +gap +garage +garbage +garden +gargle +garland +garlic +garment +garnet +garnish +garter +gas +gatherer +gathering +gating +gauging +gauntlet +gauze +gave +gawk +gazing +gear +gecko +geek +geiger +gem +gender +generic +generous +genetics +genre +gentile +gentleman +gently +gents +geography +geologic +geologist +geology +geometric +geometry +geranium +gerbil +geriatric +germicide +germinate +germless +germproof +gestate +gestation +gesture +getaway +getting +getup +giant +gibberish +giblet +giddily +giddiness +giddy +gift +gigabyte +gigahertz +gigantic +giggle +giggling +giggly +gigolo +gilled +gills +gimmick +girdle +giveaway +given +giver +giving +gizmo +gizzard +glacial +glacier +glade +gladiator +gladly +glamorous +glamour +glance +glancing +glandular +glare +glaring +glass +glaucoma +glazing +gleaming +gleeful +glider +gliding +glimmer +glimpse +glisten +glitch +glitter +glitzy +gloater +gloating +gloomily +gloomy +glorified +glorifier +glorify +glorious +glory +gloss +glove +glowing +glowworm +glucose +glue +gluten +glutinous +glutton +gnarly +gnat +goal +goatskin +goes +goggles +going +goldfish +goldmine +goldsmith +golf +goliath +golly +gondola +gone +gong +good +gooey +goofball +goofiness +goofy +gooseneck +goosey +gopher +gore +gorged +gorgeous +gory +gosling +gossip +gothic +gotten +gout +gown +grab +graceful +graceless +gracious +gradation +graded +grader +gradient +grading +gradually +graduate +graffiti +grafted +grafting +grain +granddad +grandkid +grandly +grandma +grandpa +grandson +granite +granny +granola +grant +granular +grape +graph +grapple +grappling +grasp +grass +gratified +gratify +grating +gratitude +gratuity +gravel +graveness +graves +graveyard +gravitate +gravity +gravy +gray +grazing +greasily +greedily +greedless +greedy +green +greeter +greeting +grew +greyhound +grid +grief +grievance +grieving +grievous +grill +grimace +grimacing +grime +griminess +grimy +grinch +grinning +grip +gristle +grit +groggily +groggy +groin +groom +groove +grooving +groovy +grouch +ground +grouped +grout +grove +grower +growing +growl +grub +grudge +grudging +grueling +gruffly +grumble +grumbling +grumbly +grumpily +grunge +grunt +guacamole +guidable +guidance +guide +guiding +guileless +guise +gulf +gullible +gully +gulp +gumball +gumdrop +gumminess +gumming +gummy +gurgle +gurgling +guru +gush +gusto +gusty +gutless +guts +gutter +guy +guzzler +gyration +habitable +habitant +habitat +habitual +hacked +hacker +hacking +hacksaw +had +haggler +haiku +half +halogen +halt +halved +halves +hamburger +hamlet +hammock +hamper +hamster +hamstring +handbag +handball +handbook +handbrake +handcart +handclap +handclasp +handcraft +handcuff +handed +handful +handgrip +handgun +handheld +handiness +handiwork +handlebar +handled +handler +handling +handmade +handoff +handpick +handprint +handrail +handsaw +handset +handsfree +handshake +handstand +handwash +handwork +handwoven +handwrite +handyman +hangnail +hangout +hangover +hangup +hankering +hankie +hanoi +haphazard +happening +happier +happiest +happily +happiness +happy +harbor +hardback +hardball +hardcover +hardedge +hardened +hardener +hardening +hardhat +hardhead +hardiness +hardly +hardness +hardship +hardware +hardwired +hardwood +hardy +harmful +harmless +harmonica +harmonics +harmonize +harmony +harness +harpist +harsh +harvest +hash +hassle +haste +hastily +hastiness +hasty +hatbox +hatchback +hatchery +hatchet +hatching +hatchling +hate +hatless +hatred +haunt +haven +hazard +hazelnut +hazily +haziness +hazing +hazy +headache +headband +headboard +headcount +headdress +headed +header +headfirst +headgear +heading +headlamp +headless +headlock +headphone +headpiece +headrest +headroom +headscarf +headset +headsman +headstand +headstone +headway +headwear +heap +heat +heave +heavily +heaviness +heaving +hedge +hedging +heftiness +hefty +helium +helmet +helper +helpful +helping +helpless +helpline +hemlock +hemstitch +hence +henchman +henna +herald +herbal +herbicide +herbs +heritage +hermit +heroics +heroism +herring +herself +hertz +hesitancy +hesitant +hesitate +hexagon +hexagram +hubcap +huddle +huddling +huff +hug +hula +hulk +hull +human +humble +humbling +humbly +humid +humiliate +humility +humming +hummus +humongous +humorist +humorless +humorous +humpback +humped +humvee +hunchback +hundredth +hunger +hungrily +hungry +hunk +hunter +hunting +huntress +huntsman +hurdle +hurled +hurler +hurling +hurray +hurricane +hurried +hurry +hurt +husband +hush +husked +huskiness +hut +hybrid +hydrant +hydrated +hydration +hydrogen +hydroxide +hyperlink +hypertext +hyphen +hypnoses +hypnosis +hypnotic +hypnotism +hypnotist +hypnotize +hypocrisy +hypocrite +ibuprofen +ice +iciness +icing +icky +icon +icy +idealism +idealist +idealize +ideally +idealness +identical +identify +identity +ideology +idiocy +idiom +idly +igloo +ignition +ignore +iguana +illicitly +illusion +illusive +image +imaginary +imagines +imaging +imbecile +imitate +imitation +immature +immerse +immersion +imminent +immobile +immodest +immorally +immortal +immovable +immovably +immunity +immunize +impaired +impale +impart +impatient +impeach +impeding +impending +imperfect +imperial +impish +implant +implement +implicate +implicit +implode +implosion +implosive +imply +impolite +important +importer +impose +imposing +impotence +impotency +impotent +impound +imprecise +imprint +imprison +impromptu +improper +improve +improving +improvise +imprudent +impulse +impulsive +impure +impurity +iodine +iodize +ion +iota +ire +iridium +iris +irk +iron +irregular +irrigate +irritable +irritably +irritant +irritate +islamic +island +isolated +isolating +isolation +isotope +issue +issuing +italicize +italics +item +itinerary +itunes +ivory +ivy +jab +jackal +jacket +jackknife +jackpot +jailbird +jailbreak +jailer +jailhouse +jalapeno +jam +janitor +january +jargon +jarring +jasmine +jaundice +jaunt +java +jawed +jawless +jawline +jaws +jaybird +jaywalker +jazz +jeep +jeeringly +jellied +jelly +jersey +jester +jet +jiffy +jigsaw +jimmy +jingle +jingling +jinx +jitters +jittery +job +jockey +jockstrap +jogger +jogging +john +joining +jokester +jokingly +jolliness +jolly +jolt +jot +jovial +joyfully +joylessly +joyous +joyride +joystick +jubilance +jubilant +judge +judgingly +judicial +judiciary +judo +juggle +juggling +jugular +juice +juiciness +juicy +jujitsu +jukebox +july +jumble +jumbo +jump +junction +juncture +june +junior +juniper +junkie +junkman +junkyard +jurist +juror +jury +justice +justifier +justify +justly +justness +juvenile +kabob +kangaroo +karaoke +karate +karma +kebab +keenly +keenness +keep +keg +kelp +kennel +kept +kerchief +kerosene +kettle +kick +kiln +kilobyte +kilogram +kilometer +kilowatt +kilt +kimono +kindle +kindling +kindly +kindness +kindred +kinetic +kinfolk +king +kinship +kinsman +kinswoman +kissable +kisser +kissing +kitchen +kite +kitten +kitty +kiwi +knack +knapsack +knee +knelt +knickers +knoll +koala +kooky +kosher +krypton +kudos +kung +labored +laborer +laboring +laborious +labrador +ladder +ladies +ladle +ladybug +ladylike +lagged +lagging +lagoon +lair +lake +lance +landed +landfall +landfill +landing +landlady +landless +landline +landlord +landmark +landmass +landmine +landowner +landscape +landside +landslide +language +lankiness +lanky +lantern +lapdog +lapel +lapped +lapping +laptop +lard +large +lark +lash +lasso +last +latch +late +lather +latitude +latrine +latter +latticed +launch +launder +laundry +laurel +lavender +lavish +laxative +lazily +laziness +lazy +lecturer +left +legacy +legal +legend +legged +leggings +legible +legibly +legislate +legitimate +legroom +legume +legwarmer +legwork +lemon +lend +length +lens +lent +leotard +lesser +letdown +lethargic +lethargy +letter +lettuce +level +leverage +levers +levitate +levitator +liability +liable +liberty +librarian +library +licking +licorice +lid +life +lifter +lifting +liftoff +ligament +likely +likeness +likewise +liking +lilac +lilly +lily +limb +limeade +limelight +limes +limit +limping +limpness +line +lingo +linguini +linguist +lining +linked +linoleum +linseed +lint +lion +lip +liquefy +liqueur +liquid +lisp +list +litigate +litigator +litmus +litter +little +livable +lived +lively +liver +livestock +lividly +living +lizard +lubricant +lubricate +lucid +luckily +luckiness +luckless +lucrative +ludicrous +lugged +lukewarm +lullaby +lumber +luminance +luminous +lumpiness +lumping +lumpish +lunacy +lunar +lunchbox +luncheon +lunchroom +lunchtime +lung +lurch +lure +luridness +lurk +lushly +lushness +luster +lustfully +lustily +lustiness +lustrous +lusty +luxurious +luxury +lying +lyrically +lyricism +lyricist +lyrics +macarena +macaroni +macaw +mace +machine +machinist +magazine +magenta +maggot +magical +magician +magma +magnesium +magnetic +magnetism +magnetize +magnifier +magnify +magnitude +magnolia +mahogany +maimed +majestic +majesty +majorette +majority +makeover +maker +makeshift +making +malformed +malt +mama +mammal +mammary +mammogram +manager +managing +manatee +mandarin +mandate +mandatory +mandolin +manger +mangle +mango +mangy +manhandle +manhole +manhood +manhunt +manicotti +manicure +manifesto +manila +mankind +manlike +manliness +manly +manmade +manned +mannish +manor +manpower +mantis +mantra +manual +many +map +marathon +marauding +marbled +marbles +marbling +march +mardi +margarine +margarita +margin +marigold +marina +marine +marital +maritime +marlin +marmalade +maroon +married +marrow +marry +marshland +marshy +marsupial +marvelous +marzipan +mascot +masculine +mashed +mashing +massager +masses +massive +mastiff +matador +matchbook +matchbox +matcher +matching +matchless +material +maternal +maternity +math +mating +matriarch +matrimony +matrix +matron +matted +matter +maturely +maturing +maturity +mauve +maverick +maximize +maximum +maybe +mayday +mayflower +moaner +moaning +mobile +mobility +mobilize +mobster +mocha +mocker +mockup +modified +modify +modular +modulator +module +moisten +moistness +moisture +molar +molasses +mold +molecular +molecule +molehill +mollusk +mom +monastery +monday +monetary +monetize +moneybags +moneyless +moneywise +mongoose +mongrel +monitor +monkhood +monogamy +monogram +monologue +monopoly +monorail +monotone +monotype +monoxide +monsieur +monsoon +monstrous +monthly +monument +moocher +moodiness +moody +mooing +moonbeam +mooned +moonlight +moonlike +moonlit +moonrise +moonscape +moonshine +moonstone +moonwalk +mop +morale +morality +morally +morbidity +morbidly +morphine +morphing +morse +mortality +mortally +mortician +mortified +mortify +mortuary +mosaic +mossy +most +mothball +mothproof +motion +motivate +motivator +motive +motocross +motor +motto +mountable +mountain +mounted +mounting +mourner +mournful +mouse +mousiness +moustache +mousy +mouth +movable +move +movie +moving +mower +mowing +much +muck +mud +mug +mulberry +mulch +mule +mulled +mullets +multiple +multiply +multitask +multitude +mumble +mumbling +mumbo +mummified +mummify +mummy +mumps +munchkin +mundane +municipal +muppet +mural +murkiness +murky +murmuring +muscular +museum +mushily +mushiness +mushroom +mushy +music +musket +muskiness +musky +mustang +mustard +muster +mustiness +musty +mutable +mutate +mutation +mute +mutilated +mutilator +mutiny +mutt +mutual +muzzle +myself +myspace +mystified +mystify +myth +nacho +nag +nail +name +naming +nanny +nanometer +nape +napkin +napped +napping +nappy +narrow +nastily +nastiness +national +native +nativity +natural +nature +naturist +nautical +navigate +navigator +navy +nearby +nearest +nearly +nearness +neatly +neatness +nebula +nebulizer +nectar +negate +negation +negative +neglector +negligee +negligent +negotiate +nemeses +nemesis +neon +nephew +nerd +nervous +nervy +nest +net +neurology +neuron +neurosis +neurotic +neuter +neutron +never +next +nibble +nickname +nicotine +niece +nifty +nimble +nimbly +nineteen +ninetieth +ninja +nintendo +ninth +nuclear +nuclei +nucleus +nugget +nullify +number +numbing +numbly +numbness +numeral +numerate +numerator +numeric +numerous +nuptials +nursery +nursing +nurture +nutcase +nutlike +nutmeg +nutrient +nutshell +nuttiness +nutty +nuzzle +nylon +oaf +oak +oasis +oat +obedience +obedient +obituary +object +obligate +obliged +oblivion +oblivious +oblong +obnoxious +oboe +obscure +obscurity +observant +observer +observing +obsessed +obsession +obsessive +obsolete +obstacle +obstinate +obstruct +obtain +obtrusive +obtuse +obvious +occultist +occupancy +occupant +occupier +occupy +ocean +ocelot +octagon +octane +october +octopus +ogle +oil +oink +ointment +okay +old +olive +olympics +omega +omen +ominous +omission +omit +omnivore +onboard +oncoming +ongoing +onion +online +onlooker +only +onscreen +onset +onshore +onslaught +onstage +onto +onward +onyx +oops +ooze +oozy +opacity +opal +open +operable +operate +operating +operation +operative +operator +opium +opossum +opponent +oppose +opposing +opposite +oppressed +oppressor +opt +opulently +osmosis +other +otter +ouch +ought +ounce +outage +outback +outbid +outboard +outbound +outbreak +outburst +outcast +outclass +outcome +outdated +outdoors +outer +outfield +outfit +outflank +outgoing +outgrow +outhouse +outing +outlast +outlet +outline +outlook +outlying +outmatch +outmost +outnumber +outplayed +outpost +outpour +output +outrage +outrank +outreach +outright +outscore +outsell +outshine +outshoot +outsider +outskirts +outsmart +outsource +outspoken +outtakes +outthink +outward +outweigh +outwit +oval +ovary +oven +overact +overall +overarch +overbid +overbill +overbite +overblown +overboard +overbook +overbuilt +overcast +overcoat +overcome +overcook +overcrowd +overdraft +overdrawn +overdress +overdrive +overdue +overeager +overeater +overexert +overfed +overfeed +overfill +overflow +overfull +overgrown +overhand +overhang +overhaul +overhead +overhear +overheat +overhung +overjoyed +overkill +overlabor +overlaid +overlap +overlay +overload +overlook +overlord +overlying +overnight +overpass +overpay +overplant +overplay +overpower +overprice +overrate +overreach +overreact +override +overripe +overrule +overrun +overshoot +overshot +oversight +oversized +oversleep +oversold +overspend +overstate +overstay +overstep +overstock +overstuff +oversweet +overtake +overthrow +overtime +overtly +overtone +overture +overturn +overuse +overvalue +overview +overwrite +owl +oxford +oxidant +oxidation +oxidize +oxidizing +oxygen +oxymoron +oyster +ozone +paced +pacemaker +pacific +pacifier +pacifism +pacifist +pacify +padded +padding +paddle +paddling +padlock +pagan +pager +paging +pajamas +palace +palatable +palm +palpable +palpitate +paltry +pampered +pamperer +pampers +pamphlet +panama +pancake +pancreas +panda +pandemic +pang +panhandle +panic +panning +panorama +panoramic +panther +pantomime +pantry +pants +pantyhose +paparazzi +papaya +paper +paprika +papyrus +parabola +parachute +parade +paradox +paragraph +parakeet +paralegal +paralyses +paralysis +paralyze +paramedic +parameter +paramount +parasail +parasite +parasitic +parcel +parched +parchment +pardon +parish +parka +parking +parkway +parlor +parmesan +parole +parrot +parsley +parsnip +partake +parted +parting +partition +partly +partner +partridge +party +passable +passably +passage +passcode +passenger +passerby +passing +passion +passive +passivism +passover +passport +password +pasta +pasted +pastel +pastime +pastor +pastrami +pasture +pasty +patchwork +patchy +paternal +paternity +path +patience +patient +patio +patriarch +patriot +patrol +patronage +patronize +pauper +pavement +paver +pavestone +pavilion +paving +pawing +payable +payback +paycheck +payday +payee +payer +paying +payment +payphone +payroll +pebble +pebbly +pecan +pectin +peculiar +peddling +pediatric +pedicure +pedigree +pedometer +pegboard +pelican +pellet +pelt +pelvis +penalize +penalty +pencil +pendant +pending +penholder +penknife +pennant +penniless +penny +penpal +pension +pentagon +pentagram +pep +perceive +percent +perch +percolate +perennial +perfected +perfectly +perfume +periscope +perish +perjurer +perjury +perkiness +perky +perm +peroxide +perpetual +perplexed +persecute +persevere +persuaded +persuader +pesky +peso +pessimism +pessimist +pester +pesticide +petal +petite +petition +petri +petroleum +petted +petticoat +pettiness +petty +petunia +phantom +phobia +phoenix +phonebook +phoney +phonics +phoniness +phony +phosphate +photo +phrase +phrasing +placard +placate +placidly +plank +planner +plant +plasma +plaster +plastic +plated +platform +plating +platinum +platonic +platter +platypus +plausible +plausibly +playable +playback +player +playful +playgroup +playhouse +playing +playlist +playmaker +playmate +playoff +playpen +playroom +playset +plaything +playtime +plaza +pleading +pleat +pledge +plentiful +plenty +plethora +plexiglas +pliable +plod +plop +plot +plow +ploy +pluck +plug +plunder +plunging +plural +plus +plutonium +plywood +poach +pod +poem +poet +pogo +pointed +pointer +pointing +pointless +pointy +poise +poison +poker +poking +polar +police +policy +polio +polish +politely +polka +polo +polyester +polygon +polygraph +polymer +poncho +pond +pony +popcorn +pope +poplar +popper +poppy +popsicle +populace +popular +populate +porcupine +pork +porous +porridge +portable +portal +portfolio +porthole +portion +portly +portside +poser +posh +posing +possible +possibly +possum +postage +postal +postbox +postcard +posted +poster +posting +postnasal +posture +postwar +pouch +pounce +pouncing +pound +pouring +pout +powdered +powdering +powdery +power +powwow +pox +praising +prance +prancing +pranker +prankish +prankster +prayer +praying +preacher +preaching +preachy +preamble +precinct +precise +precision +precook +precut +predator +predefine +predict +preface +prefix +preflight +preformed +pregame +pregnancy +pregnant +preheated +prelaunch +prelaw +prelude +premiere +premises +premium +prenatal +preoccupy +preorder +prepaid +prepay +preplan +preppy +preschool +prescribe +preseason +preset +preshow +president +presoak +press +presume +presuming +preteen +pretended +pretender +pretense +pretext +pretty +pretzel +prevail +prevalent +prevent +preview +previous +prewar +prewashed +prideful +pried +primal +primarily +primary +primate +primer +primp +princess +print +prior +prism +prison +prissy +pristine +privacy +private +privatize +prize +proactive +probable +probably +probation +probe +probing +probiotic +problem +procedure +process +proclaim +procreate +procurer +prodigal +prodigy +produce +product +profane +profanity +professed +professor +profile +profound +profusely +progeny +prognosis +program +progress +projector +prologue +prolonged +promenade +prominent +promoter +promotion +prompter +promptly +prone +prong +pronounce +pronto +proofing +proofread +proofs +propeller +properly +property +proponent +proposal +propose +props +prorate +protector +protegee +proton +prototype +protozoan +protract +protrude +proud +provable +proved +proven +provided +provider +providing +province +proving +provoke +provoking +provolone +prowess +prowler +prowling +proximity +proxy +prozac +prude +prudishly +prune +pruning +pry +psychic +public +publisher +pucker +pueblo +pug +pull +pulmonary +pulp +pulsate +pulse +pulverize +puma +pumice +pummel +punch +punctual +punctuate +punctured +pungent +punisher +punk +pupil +puppet +puppy +purchase +pureblood +purebred +purely +pureness +purgatory +purge +purging +purifier +purify +purist +puritan +purity +purple +purplish +purposely +purr +purse +pursuable +pursuant +pursuit +purveyor +pushcart +pushchair +pusher +pushiness +pushing +pushover +pushpin +pushup +pushy +putdown +putt +puzzle +puzzling +pyramid +pyromania +python +quack +quadrant +quail +quaintly +quake +quaking +qualified +qualifier +qualify +quality +qualm +quantum +quarrel +quarry +quartered +quarterly +quarters +quartet +quench +query +quicken +quickly +quickness +quicksand +quickstep +quiet +quill +quilt +quintet +quintuple +quirk +quit +quiver +quizzical +quotable +quotation +quote +rabid +race +racing +racism +rack +racoon +radar +radial +radiance +radiantly +radiated +radiation +radiator +radio +radish +raffle +raft +rage +ragged +raging +ragweed +raider +railcar +railing +railroad +railway +raisin +rake +raking +rally +ramble +rambling +ramp +ramrod +ranch +rancidity +random +ranged +ranger +ranging +ranked +ranking +ransack +ranting +rants +rare +rarity +rascal +rash +rasping +ravage +raven +ravine +raving +ravioli +ravishing +reabsorb +reach +reacquire +reaction +reactive +reactor +reaffirm +ream +reanalyze +reappear +reapply +reappoint +reapprove +rearrange +rearview +reason +reassign +reassure +reattach +reawake +rebalance +rebate +rebel +rebirth +reboot +reborn +rebound +rebuff +rebuild +rebuilt +reburial +rebuttal +recall +recant +recapture +recast +recede +recent +recess +recharger +recipient +recital +recite +reckless +reclaim +recliner +reclining +recluse +reclusive +recognize +recoil +recollect +recolor +reconcile +reconfirm +reconvene +recopy +record +recount +recoup +recovery +recreate +rectal +rectangle +rectified +rectify +recycled +recycler +recycling +reemerge +reenact +reenter +reentry +reexamine +referable +referee +reference +refill +refinance +refined +refinery +refining +refinish +reflected +reflector +reflex +reflux +refocus +refold +reforest +reformat +reformed +reformer +reformist +refract +refrain +refreeze +refresh +refried +refueling +refund +refurbish +refurnish +refusal +refuse +refusing +refutable +refute +regain +regalia +regally +reggae +regime +region +register +registrar +registry +regress +regretful +regroup +regular +regulate +regulator +rehab +reheat +rehire +rehydrate +reimburse +reissue +reiterate +rejoice +rejoicing +rejoin +rekindle +relapse +relapsing +relatable +related +relation +relative +relax +relay +relearn +release +relenting +reliable +reliably +reliance +reliant +relic +relieve +relieving +relight +relish +relive +reload +relocate +relock +reluctant +rely +remake +remark +remarry +rematch +remedial +remedy +remember +reminder +remindful +remission +remix +remnant +remodeler +remold +remorse +remote +removable +removal +removed +remover +removing +rename +renderer +rendering +rendition +renegade +renewable +renewably +renewal +renewed +renounce +renovate +renovator +rentable +rental +rented +renter +reoccupy +reoccur +reopen +reorder +repackage +repacking +repaint +repair +repave +repaying +repayment +repeal +repeated +repeater +repent +rephrase +replace +replay +replica +reply +reporter +repose +repossess +repost +repressed +reprimand +reprint +reprise +reproach +reprocess +reproduce +reprogram +reps +reptile +reptilian +repugnant +repulsion +repulsive +repurpose +reputable +reputably +request +require +requisite +reroute +rerun +resale +resample +rescuer +reseal +research +reselect +reseller +resemble +resend +resent +reset +reshape +reshoot +reshuffle +residence +residency +resident +residual +residue +resigned +resilient +resistant +resisting +resize +resolute +resolved +resonant +resonate +resort +resource +respect +resubmit +result +resume +resupply +resurface +resurrect +retail +retainer +retaining +retake +retaliate +retention +rethink +retinal +retired +retiree +retiring +retold +retool +retorted +retouch +retrace +retract +retrain +retread +retreat +retrial +retrieval +retriever +retry +return +retying +retype +reunion +reunite +reusable +reuse +reveal +reveler +revenge +revenue +reverb +revered +reverence +reverend +reversal +reverse +reversing +reversion +revert +revisable +revise +revision +revisit +revivable +revival +reviver +reviving +revocable +revoke +revolt +revolver +revolving +reward +rewash +rewind +rewire +reword +rework +rewrap +rewrite +rhyme +ribbon +ribcage +rice +riches +richly +richness +rickety +ricotta +riddance +ridden +ride +riding +rifling +rift +rigging +rigid +rigor +rimless +rimmed +rind +rink +rinse +rinsing +riot +ripcord +ripeness +ripening +ripping +ripple +rippling +riptide +rise +rising +risk +risotto +ritalin +ritzy +rival +riverbank +riverbed +riverboat +riverside +riveter +riveting +roamer +roaming +roast +robbing +robe +robin +robotics +robust +rockband +rocker +rocket +rockfish +rockiness +rocking +rocklike +rockslide +rockstar +rocky +rogue +roman +romp +rope +roping +roster +rosy +rotten +rotting +rotunda +roulette +rounding +roundish +roundness +roundup +roundworm +routine +routing +rover +roving +royal +rubbed +rubber +rubbing +rubble +rubdown +ruby +ruckus +rudder +rug +ruined +rule +rumble +rumbling +rummage +rumor +runaround +rundown +runner +running +runny +runt +runway +rupture +rural +ruse +rush +rust +rut +sabbath +sabotage +sacrament +sacred +sacrifice +sadden +saddlebag +saddled +saddling +sadly +sadness +safari +safeguard +safehouse +safely +safeness +saffron +saga +sage +sagging +saggy +said +saint +sake +salad +salami +salaried +salary +saline +salon +saloon +salsa +salt +salutary +salute +salvage +salvaging +salvation +same +sample +sampling +sanction +sanctity +sanctuary +sandal +sandbag +sandbank +sandbar +sandblast +sandbox +sanded +sandfish +sanding +sandlot +sandpaper +sandpit +sandstone +sandstorm +sandworm +sandy +sanitary +sanitizer +sank +santa +sapling +sappiness +sappy +sarcasm +sarcastic +sardine +sash +sasquatch +sassy +satchel +satiable +satin +satirical +satisfied +satisfy +saturate +saturday +sauciness +saucy +sauna +savage +savanna +saved +savings +savior +savor +saxophone +say +scabbed +scabby +scalded +scalding +scale +scaling +scallion +scallop +scalping +scam +scandal +scanner +scanning +scant +scapegoat +scarce +scarcity +scarecrow +scared +scarf +scarily +scariness +scarring +scary +scavenger +scenic +schedule +schematic +scheme +scheming +schilling +schnapps +scholar +science +scientist +scion +scoff +scolding +scone +scoop +scooter +scope +scorch +scorebook +scorecard +scored +scoreless +scorer +scoring +scorn +scorpion +scotch +scoundrel +scoured +scouring +scouting +scouts +scowling +scrabble +scraggly +scrambled +scrambler +scrap +scratch +scrawny +screen +scribble +scribe +scribing +scrimmage +script +scroll +scrooge +scrounger +scrubbed +scrubber +scruffy +scrunch +scrutiny +scuba +scuff +sculptor +sculpture +scurvy +scuttle +secluded +secluding +seclusion +second +secrecy +secret +sectional +sector +secular +securely +security +sedan +sedate +sedation +sedative +sediment +seduce +seducing +segment +seismic +seizing +seldom +selected +selection +selective +selector +self +seltzer +semantic +semester +semicolon +semifinal +seminar +semisoft +semisweet +senate +senator +send +senior +senorita +sensation +sensitive +sensitize +sensually +sensuous +sepia +september +septic +septum +sequel +sequence +sequester +series +sermon +serotonin +serpent +serrated +serve +service +serving +sesame +sessions +setback +setting +settle +settling +setup +sevenfold +seventeen +seventh +seventy +severity +shabby +shack +shaded +shadily +shadiness +shading +shadow +shady +shaft +shakable +shakily +shakiness +shaking +shaky +shale +shallot +shallow +shame +shampoo +shamrock +shank +shanty +shape +shaping +share +sharpener +sharper +sharpie +sharply +sharpness +shawl +sheath +shed +sheep +sheet +shelf +shell +shelter +shelve +shelving +sherry +shield +shifter +shifting +shiftless +shifty +shimmer +shimmy +shindig +shine +shingle +shininess +shining +shiny +ship +shirt +shivering +shock +shone +shoplift +shopper +shopping +shoptalk +shore +shortage +shortcake +shortcut +shorten +shorter +shorthand +shortlist +shortly +shortness +shorts +shortwave +shorty +shout +shove +showbiz +showcase +showdown +shower +showgirl +showing +showman +shown +showoff +showpiece +showplace +showroom +showy +shrank +shrapnel +shredder +shredding +shrewdly +shriek +shrill +shrimp +shrine +shrink +shrivel +shrouded +shrubbery +shrubs +shrug +shrunk +shucking +shudder +shuffle +shuffling +shun +shush +shut +shy +sial +siberian +sibling +siding +sierra +siesta +sift +sighing +silenced +silencer +silent +silica +silicon +silk +silliness +silly +silo +silt +silver +similarly +simile +simmering +simple +simplify +simply +sincere +sincerity +singer +singing +single +singular +sinister +sinless +sinner +sinuous +sip +siren +sister +sitcom +sitter +sitting +situated +situation +sixfold +sixteen +sixth +sixties +sixtieth +sixtyfold +sizable +sizably +size +sizing +sizzle +sizzling +skater +skating +skedaddle +skeletal +skeleton +skeptic +sketch +skewed +skewer +skid +skied +skier +skies +skiing +skilled +skillet +skillful +skimmed +skimmer +skimming +skimpily +skincare +skinhead +skinless +skinning +skinny +skintight +skipper +skipping +skirmish +skirt +skittle +skydiver +skylight +skyline +skype +skyrocket +skyward +slab +slacked +slacker +slacking +slackness +slacks +slain +slam +slander +slang +slapping +slapstick +slashed +slashing +slate +slather +slaw +sled +sleek +sleep +sleet +sleeve +slept +sliceable +sliced +slicer +slicing +slick +slider +slideshow +sliding +slighted +slighting +slightly +slimness +slimy +slinging +slingshot +slinky +slip +slit +sliver +slobbery +slogan +sloped +sloping +sloppily +sloppy +slot +slouching +slouchy +sludge +slug +slum +slurp +slush +sly +small +smartly +smartness +smasher +smashing +smashup +smell +smelting +smile +smilingly +smirk +smite +smith +smitten +smock +smog +smoked +smokeless +smokiness +smoking +smoky +smolder +smooth +smother +smudge +smudgy +smuggler +smuggling +smugly +smugness +snack +snagged +snaking +snap +snare +snarl +snazzy +sneak +sneer +sneeze +sneezing +snide +sniff +snippet +snipping +snitch +snooper +snooze +snore +snoring +snorkel +snort +snout +snowbird +snowboard +snowbound +snowcap +snowdrift +snowdrop +snowfall +snowfield +snowflake +snowiness +snowless +snowman +snowplow +snowshoe +snowstorm +snowsuit +snowy +snub +snuff +snuggle +snugly +snugness +speak +spearfish +spearhead +spearman +spearmint +species +specimen +specked +speckled +specks +spectacle +spectator +spectrum +speculate +speech +speed +spellbind +speller +spelling +spendable +spender +spending +spent +spew +sphere +spherical +sphinx +spider +spied +spiffy +spill +spilt +spinach +spinal +spindle +spinner +spinning +spinout +spinster +spiny +spiral +spirited +spiritism +spirits +spiritual +splashed +splashing +splashy +splatter +spleen +splendid +splendor +splice +splicing +splinter +splotchy +splurge +spoilage +spoiled +spoiler +spoiling +spoils +spoken +spokesman +sponge +spongy +sponsor +spoof +spookily +spooky +spool +spoon +spore +sporting +sports +sporty +spotless +spotlight +spotted +spotter +spotting +spotty +spousal +spouse +spout +sprain +sprang +sprawl +spray +spree +sprig +spring +sprinkled +sprinkler +sprint +sprite +sprout +spruce +sprung +spry +spud +spur +sputter +spyglass +squabble +squad +squall +squander +squash +squatted +squatter +squatting +squeak +squealer +squealing +squeamish +squeegee +squeeze +squeezing +squid +squiggle +squiggly +squint +squire +squirt +squishier +squishy +stability +stabilize +stable +stack +stadium +staff +stage +staging +stagnant +stagnate +stainable +stained +staining +stainless +stalemate +staleness +stalling +stallion +stamina +stammer +stamp +stand +stank +staple +stapling +starboard +starch +stardom +stardust +starfish +stargazer +staring +stark +starless +starlet +starlight +starlit +starring +starry +starship +starter +starting +startle +startling +startup +starved +starving +stash +state +static +statistic +statue +stature +status +statute +statutory +staunch +stays +steadfast +steadier +steadily +steadying +steam +steed +steep +steerable +steering +steersman +stegosaur +stellar +stem +stench +stencil +step +stereo +sterile +sterility +sterilize +sterling +sternness +sternum +stew +stick +stiffen +stiffly +stiffness +stifle +stifling +stillness +stilt +stimulant +stimulate +stimuli +stimulus +stinger +stingily +stinging +stingray +stingy +stinking +stinky +stipend +stipulate +stir +stitch +stock +stoic +stoke +stole +stomp +stonewall +stoneware +stonework +stoning +stony +stood +stooge +stool +stoop +stoplight +stoppable +stoppage +stopped +stopper +stopping +stopwatch +storable +storage +storeroom +storewide +storm +stout +stove +stowaway +stowing +straddle +straggler +strained +strainer +straining +strangely +stranger +strangle +strategic +strategy +stratus +straw +stray +streak +stream +street +strength +strenuous +strep +stress +stretch +strewn +stricken +strict +stride +strife +strike +striking +strive +striving +strobe +strode +stroller +strongbox +strongly +strongman +struck +structure +strudel +struggle +strum +strung +strut +stubbed +stubble +stubbly +stubborn +stucco +stuck +student +studied +studio +study +stuffed +stuffing +stuffy +stumble +stumbling +stump +stung +stunned +stunner +stunning +stunt +stupor +sturdily +sturdy +styling +stylishly +stylist +stylized +stylus +suave +subarctic +subatomic +subdivide +subdued +subduing +subfloor +subgroup +subheader +subject +sublease +sublet +sublevel +sublime +submarine +submerge +submersed +submitter +subpanel +subpar +subplot +subprime +subscribe +subscript +subsector +subside +subsiding +subsidize +subsidy +subsoil +subsonic +substance +subsystem +subtext +subtitle +subtly +subtotal +subtract +subtype +suburb +subway +subwoofer +subzero +succulent +such +suction +sudden +sudoku +suds +sufferer +suffering +suffice +suffix +suffocate +suffrage +sugar +suggest +suing +suitable +suitably +suitcase +suitor +sulfate +sulfide +sulfite +sulfur +sulk +sullen +sulphate +sulphuric +sultry +superbowl +superglue +superhero +superior +superjet +superman +supermom +supernova +supervise +supper +supplier +supply +support +supremacy +supreme +surcharge +surely +sureness +surface +surfacing +surfboard +surfer +surgery +surgical +surging +surname +surpass +surplus +surprise +surreal +surrender +surrogate +surround +survey +survival +survive +surviving +survivor +sushi +suspect +suspend +suspense +sustained +sustainer +swab +swaddling +swagger +swampland +swan +swapping +swarm +sway +swear +sweat +sweep +swell +swept +swerve +swifter +swiftly +swiftness +swimmable +swimmer +swimming +swimsuit +swimwear +swindle +swinging +swipe +swirl +switch +swivel +swizzle +swooned +swoop +swoosh +swore +sworn +swung +sycamore +sympathy +symphonic +symphony +symptom +synapse +syndrome +synergy +synopses +synopsis +synthesis +synthetic +syrup +system +tabasco +tabby +tableful +tables +tablet +tableware +tabloid +tackiness +tacking +tackle +tackling +tacky +taco +tactful +tactical +tactics +tactile +tactless +tadpole +taekwondo +tag +tainted +take +taking +talcum +talisman +tall +talon +tamale +tameness +tamer +tamper +tank +tanned +tannery +tanning +tantrum +tapeless +tapered +tapering +tapestry +tapioca +tapping +taps +tarantula +target +tarmac +tarnish +tarot +tartar +tartly +tartness +task +tassel +taste +tastiness +tasting +tasty +tattered +tattle +tattling +tattoo +taunt +tavern +thank +that +thaw +theater +theatrics +thee +theft +theme +theology +theorize +thermal +thermos +thesaurus +these +thesis +thespian +thicken +thicket +thickness +thieving +thievish +thigh +thimble +thing +think +thinly +thinner +thinness +thinning +thirstily +thirsting +thirsty +thirteen +thirty +thong +thorn +those +thousand +thrash +thread +threaten +threefold +thrift +thrill +thrive +thriving +throat +throbbing +throng +throttle +throwaway +throwback +thrower +throwing +thud +thumb +thumping +thursday +thus +thwarting +thyself +tiara +tibia +tidal +tidbit +tidiness +tidings +tidy +tiger +tighten +tightly +tightness +tightrope +tightwad +tigress +tile +tiling +till +tilt +timid +timing +timothy +tinderbox +tinfoil +tingle +tingling +tingly +tinker +tinkling +tinsel +tinsmith +tint +tinwork +tiny +tipoff +tipped +tipper +tipping +tiptoeing +tiptop +tiring +tissue +trace +tracing +track +traction +tractor +trade +trading +tradition +traffic +tragedy +trailing +trailside +train +traitor +trance +tranquil +transfer +transform +translate +transpire +transport +transpose +trapdoor +trapeze +trapezoid +trapped +trapper +trapping +traps +trash +travel +traverse +travesty +tray +treachery +treading +treadmill +treason +treat +treble +tree +trekker +tremble +trembling +tremor +trench +trend +trespass +triage +trial +triangle +tribesman +tribunal +tribune +tributary +tribute +triceps +trickery +trickily +tricking +trickle +trickster +tricky +tricolor +tricycle +trident +tried +trifle +trifocals +trillion +trilogy +trimester +trimmer +trimming +trimness +trinity +trio +tripod +tripping +triumph +trivial +trodden +trolling +trombone +trophy +tropical +tropics +trouble +troubling +trough +trousers +trout +trowel +truce +truck +truffle +trump +trunks +trustable +trustee +trustful +trusting +trustless +truth +try +tubby +tubeless +tubular +tucking +tuesday +tug +tuition +tulip +tumble +tumbling +tummy +turban +turbine +turbofan +turbojet +turbulent +turf +turkey +turmoil +turret +turtle +tusk +tutor +tutu +tux +tweak +tweed +tweet +tweezers +twelve +twentieth +twenty +twerp +twice +twiddle +twiddling +twig +twilight +twine +twins +twirl +twistable +twisted +twister +twisting +twisty +twitch +twitter +tycoon +tying +tyke +udder +ultimate +ultimatum +ultra +umbilical +umbrella +umpire +unabashed +unable +unadorned +unadvised +unafraid +unaired +unaligned +unaltered +unarmored +unashamed +unaudited +unawake +unaware +unbaked +unbalance +unbeaten +unbend +unbent +unbiased +unbitten +unblended +unblessed +unblock +unbolted +unbounded +unboxed +unbraided +unbridle +unbroken +unbuckled +unbundle +unburned +unbutton +uncanny +uncapped +uncaring +uncertain +unchain +unchanged +uncharted +uncheck +uncivil +unclad +unclaimed +unclamped +unclasp +uncle +unclip +uncloak +unclog +unclothed +uncoated +uncoiled +uncolored +uncombed +uncommon +uncooked +uncork +uncorrupt +uncounted +uncouple +uncouth +uncover +uncross +uncrown +uncrushed +uncured +uncurious +uncurled +uncut +undamaged +undated +undaunted +undead +undecided +undefined +underage +underarm +undercoat +undercook +undercut +underdog +underdone +underfed +underfeed +underfoot +undergo +undergrad +underhand +underline +underling +undermine +undermost +underpaid +underpass +underpay +underrate +undertake +undertone +undertook +undertow +underuse +underwear +underwent +underwire +undesired +undiluted +undivided +undocked +undoing +undone +undrafted +undress +undrilled +undusted +undying +unearned +unearth +unease +uneasily +uneasy +uneatable +uneaten +unedited +unelected +unending +unengaged +unenvied +unequal +unethical +uneven +unexpired +unexposed +unfailing +unfair +unfasten +unfazed +unfeeling +unfiled +unfilled +unfitted +unfitting +unfixable +unfixed +unflawed +unfocused +unfold +unfounded +unframed +unfreeze +unfrosted +unfrozen +unfunded +unglazed +ungloved +unglue +ungodly +ungraded +ungreased +unguarded +unguided +unhappily +unhappy +unharmed +unhealthy +unheard +unhearing +unheated +unhelpful +unhidden +unhinge +unhitched +unholy +unhook +unicorn +unicycle +unified +unifier +uniformed +uniformly +unify +unimpeded +uninjured +uninstall +uninsured +uninvited +union +uniquely +unisexual +unison +unissued +unit +universal +universe +unjustly +unkempt +unkind +unknotted +unknowing +unknown +unlaced +unlatch +unlawful +unleaded +unlearned +unleash +unless +unleveled +unlighted +unlikable +unlimited +unlined +unlinked +unlisted +unlit +unlivable +unloaded +unloader +unlocked +unlocking +unlovable +unloved +unlovely +unloving +unluckily +unlucky +unmade +unmanaged +unmanned +unmapped +unmarked +unmasked +unmasking +unmatched +unmindful +unmixable +unmixed +unmolded +unmoral +unmovable +unmoved +unmoving +unnamable +unnamed +unnatural +unneeded +unnerve +unnerving +unnoticed +unopened +unopposed +unpack +unpadded +unpaid +unpainted +unpaired +unpaved +unpeeled +unpicked +unpiloted +unpinned +unplanned +unplanted +unpleased +unpledged +unplowed +unplug +unpopular +unproven +unquote +unranked +unrated +unraveled +unreached +unread +unreal +unreeling +unrefined +unrelated +unrented +unrest +unretired +unrevised +unrigged +unripe +unrivaled +unroasted +unrobed +unroll +unruffled +unruly +unrushed +unsaddle +unsafe +unsaid +unsalted +unsaved +unsavory +unscathed +unscented +unscrew +unsealed +unseated +unsecured +unseeing +unseemly +unseen +unselect +unselfish +unsent +unsettled +unshackle +unshaken +unshaved +unshaven +unsheathe +unshipped +unsightly +unsigned +unskilled +unsliced +unsmooth +unsnap +unsocial +unsoiled +unsold +unsolved +unsorted +unspoiled +unspoken +unstable +unstaffed +unstamped +unsteady +unsterile +unstirred +unstitch +unstopped +unstuck +unstuffed +unstylish +unsubtle +unsubtly +unsuited +unsure +unsworn +untagged +untainted +untaken +untamed +untangled +untapped +untaxed +unthawed +unthread +untidy +untie +until +untimed +untimely +untitled +untoasted +untold +untouched +untracked +untrained +untreated +untried +untrimmed +untrue +untruth +unturned +untwist +untying +unusable +unused +unusual +unvalued +unvaried +unvarying +unveiled +unveiling +unvented +unviable +unvisited +unvocal +unwanted +unwarlike +unwary +unwashed +unwatched +unweave +unwed +unwelcome +unwell +unwieldy +unwilling +unwind +unwired +unwitting +unwomanly +unworldly +unworn +unworried +unworthy +unwound +unwoven +unwrapped +unwritten +unzip +upbeat +upchuck +upcoming +upcountry +update +upfront +upgrade +upheaval +upheld +uphill +uphold +uplifted +uplifting +upload +upon +upper +upright +uprising +upriver +uproar +uproot +upscale +upside +upstage +upstairs +upstart +upstate +upstream +upstroke +upswing +uptake +uptight +uptown +upturned +upward +upwind +uranium +urban +urchin +urethane +urgency +urgent +urging +urologist +urology +usable +usage +useable +used +uselessly +user +usher +usual +utensil +utility +utilize +utmost +utopia +utter +vacancy +vacant +vacate +vacation +vagabond +vagrancy +vagrantly +vaguely +vagueness +valiant +valid +valium +valley +valuables +value +vanilla +vanish +vanity +vanquish +vantage +vaporizer +variable +variably +varied +variety +various +varmint +varnish +varsity +varying +vascular +vaseline +vastly +vastness +veal +vegan +veggie +vehicular +velcro +velocity +velvet +vendetta +vending +vendor +veneering +vengeful +venomous +ventricle +venture +venue +venus +verbalize +verbally +verbose +verdict +verify +verse +version +versus +vertebrae +vertical +vertigo +very +vessel +vest +veteran +veto +vexingly +viability +viable +vibes +vice +vicinity +victory +video +viewable +viewer +viewing +viewless +viewpoint +vigorous +village +villain +vindicate +vineyard +vintage +violate +violation +violator +violet +violin +viper +viral +virtual +virtuous +virus +visa +viscosity +viscous +viselike +visible +visibly +vision +visiting +visitor +visor +vista +vitality +vitalize +vitally +vitamins +vivacious +vividly +vividness +vixen +vocalist +vocalize +vocally +vocation +voice +voicing +void +volatile +volley +voltage +volumes +voter +voting +voucher +vowed +vowel +voyage +wackiness +wad +wafer +waffle +waged +wager +wages +waggle +wagon +wake +waking +walk +walmart +walnut +walrus +waltz +wand +wannabe +wanted +wanting +wasabi +washable +washbasin +washboard +washbowl +washcloth +washday +washed +washer +washhouse +washing +washout +washroom +washstand +washtub +wasp +wasting +watch +water +waviness +waving +wavy +whacking +whacky +wham +wharf +wheat +whenever +whiff +whimsical +whinny +whiny +whisking +whoever +whole +whomever +whoopee +whooping +whoops +why +wick +widely +widen +widget +widow +width +wieldable +wielder +wife +wifi +wikipedia +wildcard +wildcat +wilder +wildfire +wildfowl +wildland +wildlife +wildly +wildness +willed +willfully +willing +willow +willpower +wilt +wimp +wince +wincing +wind +wing +winking +winner +winnings +winter +wipe +wired +wireless +wiring +wiry +wisdom +wise +wish +wisplike +wispy +wistful +wizard +wobble +wobbling +wobbly +wok +wolf +wolverine +womanhood +womankind +womanless +womanlike +womanly +womb +woof +wooing +wool +woozy +word +work +worried +worrier +worrisome +worry +worsening +worshiper +worst +wound +woven +wow +wrangle +wrath +wreath +wreckage +wrecker +wrecking +wrench +wriggle +wriggly +wrinkle +wrinkly +wrist +writing +written +wrongdoer +wronged +wrongful +wrongly +wrongness +wrought +xenon +xerox +yahoo +yam +yanking +yapping +yard +yarn +yeah +yearbook +yearling +yearly +yearning +yeast +yelling +yelp +yen +yesterday +yiddish +yield +yin +yippee +yodel +yoga +yogurt +yonder +young +yummy +zap +zealous +zebra +zen +zeppelin +zero +zestfully +zesty +zigzagged +zipfile +zipping +zippy +zips +zit +zodiac +zombie +zone +zoning +zookeeper +zoologist +zoology +zoom diff --git a/src/lib.rs b/src/lib.rs index c3f2df53..99e5c751 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,6 +14,8 @@ pub mod pass; pub(crate) mod signature; /// Generates ASCII and non ASCII passwords pub mod password_generator; +/// Generates passphrases +pub mod passphrase_generator; #[cfg(test)] #[path = "tests/test_helpers.rs"] pub mod test_helpers; diff --git a/src/passphrase_generator.rs b/src/passphrase_generator.rs new file mode 100644 index 00000000..e60b3df5 --- /dev/null +++ b/src/passphrase_generator.rs @@ -0,0 +1,37 @@ +use std::fs::File; +use std::io::{self, BufRead}; +use rand::seq::SliceRandom; // Add rand = "0.8" (or latest) in Cargo.toml + +pub fn passphrase_generator(wordcount: i32) -> io::Result> { + let filename = "share/wordlists/eff_large.wordlist"; + let file = File::open(filename)?; + let reader = io::BufReader::new(file); + + + let words: Vec = reader + .lines() + .filter_map(Result::ok) + .map(|line| line.trim().to_string()) + .filter(|line| !line.is_empty()) + .collect(); + + if words.is_empty() { + eprintln!("The word list is empty!"); + return Ok(Vec::new()); + } + + let mut rng = rand::thread_rng(); + + let selected: Vec = if (words.len() as i32) <= wordcount { + words.clone() + } else { + words + .choose_multiple(&mut rng, wordcount as usize) + .cloned() + .collect() + }; + + Ok(selected) +} + + From 0fe5136f4e518465c7e7bdff7f141ba83d575b2f Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Fri, 31 Oct 2025 16:23:10 -0500 Subject: [PATCH 04/18] Removed unncessary comment --- src/passphrase_generator.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/passphrase_generator.rs b/src/passphrase_generator.rs index e60b3df5..8ad10074 100644 --- a/src/passphrase_generator.rs +++ b/src/passphrase_generator.rs @@ -1,6 +1,6 @@ use std::fs::File; use std::io::{self, BufRead}; -use rand::seq::SliceRandom; // Add rand = "0.8" (or latest) in Cargo.toml +use rand::seq::SliceRandom; pub fn passphrase_generator(wordcount: i32) -> io::Result> { let filename = "share/wordlists/eff_large.wordlist"; From 46a6bb41d84acacfa665e9069fee333536389b02 Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Fri, 31 Oct 2025 16:25:06 -0500 Subject: [PATCH 05/18] Removed .nix files --- default.nix | 12 ------------ flake.lock | 27 --------------------------- flake.nix | 51 --------------------------------------------------- 3 files changed, 90 deletions(-) delete mode 100644 default.nix delete mode 100644 flake.lock delete mode 100644 flake.nix diff --git a/default.nix b/default.nix deleted file mode 100644 index 7327b537..00000000 --- a/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ - rustPlatform, - glib, - pkg-config, -}: -rustPlatform.buildRustPackage { - name = "ripasso"; - src = ./.; - buildInputs = [ glib ]; - nativeBuildInputs = [ pkg-config ]; - cargoHash = "sha256-UMhQgijZuZW2O/0Jk5Zn8P368KnDWZRXj5e1nDG40Gw="; -} diff --git a/flake.lock b/flake.lock deleted file mode 100644 index d4068481..00000000 --- a/flake.lock +++ /dev/null @@ -1,27 +0,0 @@ -{ - "nodes": { - "nixpkgs": { - "locked": { - "lastModified": 1761672384, - "narHash": "sha256-o9KF3DJL7g7iYMZq9SWgfS1BFlNbsm6xplRjVlOCkXI=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "08dacfca559e1d7da38f3cf05f1f45ee9bfd213c", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index b8bf40e0..00000000 --- a/flake.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ - description = "Rust flake"; - - inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - }; - - outputs = { self, nixpkgs, ... }@inputs: - let - system = "x86_64-linux"; - pkgs = import nixpkgs { inherit system; }; - - clangLibPath = "${pkgs.libclang.lib}/lib"; - opensslDev = pkgs.openssl.dev; - opensslOut = pkgs.openssl.out; - in - { - devShells.${system}.default = pkgs.mkShell { - packages = with pkgs; [ - rustc - cargo - clang - libclang - openssl - pkg-config - libgpg-error - nettle - gpgme - ripasso-cursive - ]; - - shellHook = '' - # Clang - export LIBCLANG_PATH=${clangLibPath} - export LD_LIBRARY_PATH=${clangLibPath}:${opensslOut}/lib:$LD_LIBRARY_PATH - - # OpenSSL - export OPENSSL_NO_VENDOR=1 - export OPENSSL_LIB_DIR=${opensslOut}/lib - export OPENSSL_INCLUDE_DIR=${opensslDev}/include - - echo "🔧 Environment configured:" - echo " LIBCLANG_PATH = $LIBCLANG_PATH" - echo " LD_LIBRARY_PATH = $LD_LIBRARY_PATH" - echo " OPENSSL_LIB_DIR = $OPENSSL_LIB_DIR" - echo " OPENSSL_INCLUDE_DIR = $OPENSSL_INCLUDE_DIR" - echo "🚀 Welcome to the Rust dev shell" - ''; - }; - }; -} From 6f47d17876953cd4593f28f01a7768cfef76fefb Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Sat, 1 Nov 2025 12:19:54 -0500 Subject: [PATCH 06/18] Made passphrase generator option and password generator option the same for open and create in cursive --- cursive/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index dbd3f1ef..a39f8b6e 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -454,7 +454,7 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { .button(CATALOG.gettext("Generate Passphrase"), move |s| { - let mut new_password = match passphrase_generator(8) { + let mut new_password = match passphrase_generator(6) { Ok(words) => words.join(" "), Err(err) => { eprintln!("Error generating passphrase: {}", err); @@ -712,13 +712,13 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { let d = Dialog::around(fields) .title(CATALOG.gettext("Add new password")) .button(CATALOG.gettext("Generate Password"), move |s| { - let new_password = ripasso::password_generator::password_generator(20, 1); + let new_password = ripasso::password_generator::password_generator(20, 0); s.call_on_name("new_password_input", |e: &mut EditView| { e.set_content(new_password); }); }) .button(CATALOG.gettext("Generate Passphrase"), move |s| { - let new_password = match ripasso::passphrase_generator::passphrase_generator(10) { + let new_password = match ripasso::passphrase_generator::passphrase_generator(6) { Ok(words) => words.join(" "), Err(err) => { eprintln!("Error generating passphrase: {}", err); From 684f34885c6ba35b4961aa3dc8bd7e33624ea420 Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 12 Nov 2025 07:52:43 -0500 Subject: [PATCH 07/18] Made suggested changes --- cursive/src/main.rs | 4 ++-- src/password_generator.rs | 16 +++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index a39f8b6e..dc926c13 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -457,8 +457,8 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { let mut new_password = match passphrase_generator(6) { Ok(words) => words.join(" "), Err(err) => { - eprintln!("Error generating passphrase: {}", err); - return; + helpers::errorbox(s, &ripasso::pass::Error::from(err)); + return; } }; s.call_on_name("editbox", |e: &mut TextArea| { diff --git a/src/password_generator.rs b/src/password_generator.rs index f14266a6..5bb142f3 100644 --- a/src/password_generator.rs +++ b/src/password_generator.rs @@ -2,23 +2,21 @@ use rand::Rng; pub fn password_generator(length: usize, category: usize) -> String { let mut rng = rand::thread_rng(); - if category == 0 { - let password_chars: String = (0..length) + + if category == 0 { + (0..length) .map(|_| { let ascii_val = rng.gen_range(33..=126); ascii_val as u8 as char }) - .collect(); - password_chars - } - else { - let password_chars: String = (0..length) + .collect() + } else { + (0..length) .map(|_| { let ascii_val = rng.gen_range(33..=255); ascii_val as u8 as char }) - .collect(); - password_chars + .collect() } } From 1ccd6d4a3428ac32b93973bea993c2fbfcca53f0 Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 12 Nov 2025 08:05:20 -0500 Subject: [PATCH 08/18] Fixed Rustfmt and Clippy --- src/passphrase_generator.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/passphrase_generator.rs b/src/passphrase_generator.rs index 8ad10074..220a2901 100644 --- a/src/passphrase_generator.rs +++ b/src/passphrase_generator.rs @@ -10,7 +10,7 @@ pub fn passphrase_generator(wordcount: i32) -> io::Result> { let words: Vec = reader .lines() - .filter_map(Result::ok) + .map_while(Result::ok) .map(|line| line.trim().to_string()) .filter(|line| !line.is_empty()) .collect(); From f0c0295bc14f0724ce05037ad7cca1f59f3c962b Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 12 Nov 2025 08:16:39 -0500 Subject: [PATCH 09/18] Fixed Rustfmt and Clippy v2 --- cursive/src/main.rs | 4 ++-- src/lib.rs | 8 ++++---- src/passphrase_generator.rs | 5 +---- src/tests/password_generator.rs | 8 +++++++- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index dc926c13..37c531cf 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -36,14 +36,14 @@ use cursive::{ use hex::FromHex; use pass::Result; use ripasso::{ - password_generator::password_generator, - passphrase_generator::passphrase_generator, crypto::CryptoImpl, git::{pull, push}, pass, pass::{ OwnerTrustLevel, PasswordStore, Recipient, SignatureStatus, all_recipients_from_stores, }, + passphrase_generator::passphrase_generator, + password_generator::password_generator, }; use unic_langid::LanguageIdentifier; diff --git a/src/lib.rs b/src/lib.rs index 99e5c751..d52b6da5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,12 +10,12 @@ pub mod git; /// This is the library part of ripasso, it implements the functions needed to manipulate a pass /// directory. pub mod pass; -/// All functions and structs related to handling the identity and signing of things -pub(crate) mod signature; -/// Generates ASCII and non ASCII passwords -pub mod password_generator; /// Generates passphrases pub mod passphrase_generator; +/// Generates ASCII and non ASCII passwords +pub mod password_generator; +/// All functions and structs related to handling the identity and signing of things +pub(crate) mod signature; #[cfg(test)] #[path = "tests/test_helpers.rs"] pub mod test_helpers; diff --git a/src/passphrase_generator.rs b/src/passphrase_generator.rs index 220a2901..7e6f9fff 100644 --- a/src/passphrase_generator.rs +++ b/src/passphrase_generator.rs @@ -1,13 +1,12 @@ +use rand::seq::SliceRandom; use std::fs::File; use std::io::{self, BufRead}; -use rand::seq::SliceRandom; pub fn passphrase_generator(wordcount: i32) -> io::Result> { let filename = "share/wordlists/eff_large.wordlist"; let file = File::open(filename)?; let reader = io::BufReader::new(file); - let words: Vec = reader .lines() .map_while(Result::ok) @@ -33,5 +32,3 @@ pub fn passphrase_generator(wordcount: i32) -> io::Result> { Ok(selected) } - - diff --git a/src/tests/password_generator.rs b/src/tests/password_generator.rs index fe4bdfe1..a079be1a 100644 --- a/src/tests/password_generator.rs +++ b/src/tests/password_generator.rs @@ -4,6 +4,12 @@ use crate::password_generator::password_generator; fn password_length_varies_correctly() { for len in [8, 12, 20] { let pass = password_generator(len, 0); - assert_eq!(pass.len(), len, "Expected {} chars, got {}", len, pass.len()); + assert_eq!( + pass.len(), + len, + "Expected {} chars, got {}", + len, + pass.len() + ); } } From fb3286991656aeaf623baef53d6376c9354d7a67 Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 12 Nov 2025 08:30:02 -0500 Subject: [PATCH 10/18] Added errorbox to other generate passphrase button --- cursive/src/main.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 37c531cf..6a70057d 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -36,14 +36,14 @@ use cursive::{ use hex::FromHex; use pass::Result; use ripasso::{ + password_generator::password_generator, + passphrase_generator::passphrase_generator, crypto::CryptoImpl, git::{pull, push}, pass, pass::{ OwnerTrustLevel, PasswordStore, Recipient, SignatureStatus, all_recipients_from_stores, }, - passphrase_generator::passphrase_generator, - password_generator::password_generator, }; use unic_langid::LanguageIdentifier; @@ -457,8 +457,8 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { let mut new_password = match passphrase_generator(6) { Ok(words) => words.join(" "), Err(err) => { - helpers::errorbox(s, &ripasso::pass::Error::from(err)); - return; + helpers::errorbox(s, &err); + return; } }; s.call_on_name("editbox", |e: &mut TextArea| { @@ -721,8 +721,8 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { let new_password = match ripasso::passphrase_generator::passphrase_generator(6) { Ok(words) => words.join(" "), Err(err) => { - eprintln!("Error generating passphrase: {}", err); - "error".to_string() + helpers::errorbox(s, &ripasso::pass::Error::from(err)); + return; } }; s.call_on_name("new_password_input", |e: &mut EditView| { From c66eaee9b9d38f26b71176108bc276f7da316cc8 Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 12 Nov 2025 08:32:42 -0500 Subject: [PATCH 11/18] Added newline before function --- cursive/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 6a70057d..4848d200 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -744,6 +744,7 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { ui.add_layer(ev); } + fn delete_recipient(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { let mut l = ui .find_name::>>("recipients") From 754b55162e309fd3c58cb6f8d860016c19ceb61a Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 12 Nov 2025 08:37:15 -0500 Subject: [PATCH 12/18] Didn't save changes to parameter in errorbox --- cursive/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 4848d200..38696f3c 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -457,7 +457,7 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { let mut new_password = match passphrase_generator(6) { Ok(words) => words.join(" "), Err(err) => { - helpers::errorbox(s, &err); + helpers::errorbox(s, &ripasso::pass::Error::from(err)); return; } }; From 4b0aaf15e3707ba34ae554af2087354354f6d7ff Mon Sep 17 00:00:00 2001 From: niedzielski-work Date: Wed, 12 Nov 2025 08:40:49 -0500 Subject: [PATCH 13/18] fix for rustfmt --- cursive/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 38696f3c..1c809b90 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -36,14 +36,14 @@ use cursive::{ use hex::FromHex; use pass::Result; use ripasso::{ - password_generator::password_generator, - passphrase_generator::passphrase_generator, crypto::CryptoImpl, git::{pull, push}, pass, pass::{ OwnerTrustLevel, PasswordStore, Recipient, SignatureStatus, all_recipients_from_stores, }, + passphrase_generator::passphrase_generator, + password_generator::password_generator, }; use unic_langid::LanguageIdentifier; @@ -722,7 +722,7 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { Ok(words) => words.join(" "), Err(err) => { helpers::errorbox(s, &ripasso::pass::Error::from(err)); - return; + return; } }; s.call_on_name("new_password_input", |e: &mut EditView| { From 3415dde89ae61ea9f8146bd8768b655eb8527b5d Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Sun, 23 Nov 2025 16:16:15 -0600 Subject: [PATCH 14/18] Added new dialog for password options which includes which category 0 or 1 for less or more entropy in passwords. Also, included an option to reveal password and passphrase so you can see what your password will be before saving. --- cursive/src/main.rs | 83 ++++++++++++++++++++++++++++++++++++++++----- flake.lock | 27 +++++++++++++++ 2 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 flake.lock diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 1c809b90..8bfac54c 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -25,7 +25,7 @@ use std::{ use cursive::{ Cursive, CursiveExt, direction::Orientation, - event::{Event, Key}, + event::{Event, Key, EventResult}, menu::Tree, traits::*, views::{ @@ -670,12 +670,12 @@ fn create_save(s: &mut Cursive, store: PasswordStoreType) { do_new_password_save(s, path.as_ref(), password.as_ref(), store, false); } } - fn create(ui: &mut Cursive, store: PasswordStoreType) { let mut fields = LinearLayout::vertical(); let mut path_fields = LinearLayout::horizontal(); let mut password_fields = LinearLayout::horizontal(); let mut note_fields = LinearLayout::horizontal(); + path_fields.add_child( TextView::new(CATALOG.gettext("Path: ")) .with_name("path_name") @@ -686,6 +686,7 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { .with_name("new_path_input") .fixed_size((50_usize, 1_usize)), ); + password_fields.add_child( TextView::new(CATALOG.gettext("Password: ")) .with_name("password_name") @@ -697,28 +698,90 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { .with_name("new_password_input") .fixed_size((50_usize, 1_usize)), ); + note_fields.add_child( TextView::new(CATALOG.gettext("Note: ")) .with_name("note_name") .fixed_size((10_usize, 1_usize)), ); note_fields.add_child(TextArea::new().with_name("note_input").min_size((50, 1))); + fields.add_child(path_fields); fields.add_child(password_fields); fields.add_child(note_fields); let store2 = store.clone(); + // Shared category and reveal flag + let category_value = Arc::new(Mutex::new(0)); + let reveal_flag = Arc::new(Mutex::new(false)); + let d = Dialog::around(fields) .title(CATALOG.gettext("Add new password")) - .button(CATALOG.gettext("Generate Password"), move |s| { - let new_password = ripasso::password_generator::password_generator(20, 0); - s.call_on_name("new_password_input", |e: &mut EditView| { - e.set_content(new_password); - }); + .button(CATALOG.gettext("Password Options"), { + let category_value = category_value.clone(); + let reveal_flag = reveal_flag.clone(); + move |s| { + let mut select = SelectView::::new(); + select.add_item("Category 0 (ASCII 33–126)", 0); + select.add_item("Category 1 (ASCII 33–255)", 1); + select.set_selection(*category_value.lock().unwrap()); + let select = select.with_name("password_category"); + + let reveal_checkbox = LinearLayout::horizontal().child( + cursive::views::Checkbox::new().on_change({ + let reveal_flag = reveal_flag.clone(); + move |siv, checked| { + siv.call_on_name("new_password_input", |e: &mut EditView| { + e.set_secret(!checked); + }); + *reveal_flag.lock().unwrap() = checked; + } + }), + ).child(TextView::new("Reveal password")); + + let dialog_content = LinearLayout::vertical() + .child(select.scrollable().fixed_size((30, 5))) + .child(reveal_checkbox); + + let save_selection = { + let category_value = category_value.clone(); + move |s: &mut Cursive| { + s.call_on_name("password_category", |view: &mut SelectView| { + if let Some(sel) = view.selection() { + *category_value.lock().unwrap() = *sel; + } + }); + s.pop_layer(); + } + }; + + let popup = OnEventView::new( + Dialog::around(dialog_content) + .title("Password Options") + .button("OK", save_selection.clone()) + .dismiss_button("Cancel"), + ) + .on_event(Key::Enter, save_selection); + + s.add_layer(popup); + } + }) + .button(CATALOG.gettext("Generate Password"), { + let category_value = category_value.clone(); + move |s| { + let category = *category_value.lock().unwrap(); + let new_password = + ripasso::password_generator::password_generator(20, category); + + s.call_on_name("new_password_input", |e: &mut EditView| { + e.set_content(new_password); + }); + } }) .button(CATALOG.gettext("Generate Passphrase"), move |s| { - let new_password = match ripasso::passphrase_generator::passphrase_generator(6) { + let new_password = match ripasso::passphrase_generator::passphrase_generator(6) + { Ok(words) => words.join(" "), Err(err) => { helpers::errorbox(s, &ripasso::pass::Error::from(err)); @@ -739,7 +802,9 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { s.pop_layer(); }) .on_event(Key::Enter, move |ui: &mut Cursive| { - create_save(ui, store2.clone()) + if ui.screen_mut().len() == 1 { + create_save(ui, store2.clone()); + } }); ui.add_layer(ev); diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..fae3d582 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1763678758, + "narHash": "sha256-+hBiJ+kG5IoffUOdlANKFflTT5nO3FrrR2CA3178Y5s=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "117cc7f94e8072499b0a7aa4c52084fa4e11cc9b", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} From 1054fbbe571f02d65ff5a13140909ec4cf81bb88 Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Sun, 23 Nov 2025 16:44:06 -0600 Subject: [PATCH 15/18] Added dialog option for password length and removed EventResult import --- cursive/src/main.rs | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 8bfac54c..63ae58b0 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -25,7 +25,7 @@ use std::{ use cursive::{ Cursive, CursiveExt, direction::Orientation, - event::{Event, Key, EventResult}, + event::{Event, Key}, menu::Tree, traits::*, views::{ @@ -712,15 +712,16 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { let store2 = store.clone(); - // Shared category and reveal flag let category_value = Arc::new(Mutex::new(0)); let reveal_flag = Arc::new(Mutex::new(false)); + let password_length = Arc::new(Mutex::new(20_usize)); let d = Dialog::around(fields) .title(CATALOG.gettext("Add new password")) .button(CATALOG.gettext("Password Options"), { let category_value = category_value.clone(); let reveal_flag = reveal_flag.clone(); + let password_length = password_length.clone(); move |s| { let mut select = SelectView::::new(); select.add_item("Category 0 (ASCII 33–126)", 0); @@ -728,6 +729,11 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { select.set_selection(*category_value.lock().unwrap()); let select = select.with_name("password_category"); + let length_input = EditView::new() + .content(password_length.lock().unwrap().to_string()) + .with_name("password_length") + .fixed_width(5); + let reveal_checkbox = LinearLayout::horizontal().child( cursive::views::Checkbox::new().on_change({ let reveal_flag = reveal_flag.clone(); @@ -742,16 +748,29 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { let dialog_content = LinearLayout::vertical() .child(select.scrollable().fixed_size((30, 5))) + .child( + LinearLayout::horizontal() + .child(TextView::new("Length: ")) + .child(length_input) + ) .child(reveal_checkbox); let save_selection = { let category_value = category_value.clone(); + let password_length = password_length.clone(); move |s: &mut Cursive| { s.call_on_name("password_category", |view: &mut SelectView| { if let Some(sel) = view.selection() { *category_value.lock().unwrap() = *sel; } }); + + s.call_on_name("password_length", |view: &mut EditView| { + if let Ok(len) = view.get_content().parse::() { + *password_length.lock().unwrap() = len; + } + }); + s.pop_layer(); } }; @@ -769,10 +788,11 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { }) .button(CATALOG.gettext("Generate Password"), { let category_value = category_value.clone(); + let password_length = password_length.clone(); move |s| { let category = *category_value.lock().unwrap(); - let new_password = - ripasso::password_generator::password_generator(20, category); + let length = *password_length.lock().unwrap(); + let new_password = ripasso::password_generator::password_generator(length, category); s.call_on_name("new_password_input", |e: &mut EditView| { e.set_content(new_password); @@ -810,6 +830,7 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { ui.add_layer(ev); } + fn delete_recipient(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { let mut l = ui .find_name::>>("recipients") From f5ce2301fef01934e96eadeb9a90f3391bb46fed Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Sun, 23 Nov 2025 16:51:35 -0600 Subject: [PATCH 16/18] Ran rustfmt --- cursive/src/helpers.rs | 3 +-- cursive/src/main.rs | 17 ++++++++--------- cursive/src/tests/helpers.rs | 13 ++++++++----- src/passphrase_generator.rs | 7 +++++-- src/tests/pass.rs | 3 ++- src/tests/test_helpers.rs | 6 +++--- 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cursive/src/helpers.rs b/cursive/src/helpers.rs index 954c152c..5ce11856 100644 --- a/cursive/src/helpers.rs +++ b/cursive/src/helpers.rs @@ -24,8 +24,7 @@ use cursive::{ }; use lazy_static::lazy_static; use pass::Result; -use ripasso::pass::Recipient; -use ripasso::{crypto::CryptoImpl, pass}; +use ripasso::{crypto::CryptoImpl, pass, pass::Recipient}; lazy_static! { static ref CLIPBOARD: Arc> = Arc::new(Mutex::new(Clipboard::new().unwrap())); diff --git a/cursive/src/main.rs b/cursive/src/main.rs index 63ae58b0..362f23b1 100644 --- a/cursive/src/main.rs +++ b/cursive/src/main.rs @@ -734,8 +734,8 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { .with_name("password_length") .fixed_width(5); - let reveal_checkbox = LinearLayout::horizontal().child( - cursive::views::Checkbox::new().on_change({ + let reveal_checkbox = LinearLayout::horizontal() + .child(cursive::views::Checkbox::new().on_change({ let reveal_flag = reveal_flag.clone(); move |siv, checked| { siv.call_on_name("new_password_input", |e: &mut EditView| { @@ -743,15 +743,15 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { }); *reveal_flag.lock().unwrap() = checked; } - }), - ).child(TextView::new("Reveal password")); + })) + .child(TextView::new("Reveal password")); let dialog_content = LinearLayout::vertical() .child(select.scrollable().fixed_size((30, 5))) .child( LinearLayout::horizontal() .child(TextView::new("Length: ")) - .child(length_input) + .child(length_input), ) .child(reveal_checkbox); @@ -792,7 +792,8 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { move |s| { let category = *category_value.lock().unwrap(); let length = *password_length.lock().unwrap(); - let new_password = ripasso::password_generator::password_generator(length, category); + let new_password = + ripasso::password_generator::password_generator(length, category); s.call_on_name("new_password_input", |e: &mut EditView| { e.set_content(new_password); @@ -800,8 +801,7 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { } }) .button(CATALOG.gettext("Generate Passphrase"), move |s| { - let new_password = match ripasso::passphrase_generator::passphrase_generator(6) - { + let new_password = match ripasso::passphrase_generator::passphrase_generator(6) { Ok(words) => words.join(" "), Err(err) => { helpers::errorbox(s, &ripasso::pass::Error::from(err)); @@ -830,7 +830,6 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) { ui.add_layer(ev); } - fn delete_recipient(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> { let mut l = ui .find_name::>>("recipients") diff --git a/cursive/src/tests/helpers.rs b/cursive/src/tests/helpers.rs index 03dc1b2d..b77b6c9b 100644 --- a/cursive/src/tests/helpers.rs +++ b/cursive/src/tests/helpers.rs @@ -1,15 +1,18 @@ use std::sync::Arc; -use crate::helpers::{ - get_value_from_input, is_checkbox_checked, is_radio_button_selected, recipients_widths, -}; use cursive::{ view::Nameable, views::{Checkbox, EditView, LinearLayout, RadioButton, RadioGroup}, }; use hex::FromHex; -use ripasso::crypto::CryptoImpl; -use ripasso::pass::{Comment, KeyRingStatus, OwnerTrustLevel, Recipient}; +use ripasso::{ + crypto::CryptoImpl, + pass::{Comment, KeyRingStatus, OwnerTrustLevel, Recipient}, +}; + +use crate::helpers::{ + get_value_from_input, is_checkbox_checked, is_radio_button_selected, recipients_widths, +}; #[test] fn test_get_value_from_input() { diff --git a/src/passphrase_generator.rs b/src/passphrase_generator.rs index 7e6f9fff..7bf04bd7 100644 --- a/src/passphrase_generator.rs +++ b/src/passphrase_generator.rs @@ -1,6 +1,9 @@ +use std::{ + fs::File, + io::{self, BufRead}, +}; + use rand::seq::SliceRandom; -use std::fs::File; -use std::io::{self, BufRead}; pub fn passphrase_generator(wordcount: i32) -> io::Result> { let filename = "share/wordlists/eff_large.wordlist"; diff --git a/src/tests/pass.rs b/src/tests/pass.rs index e8fca627..b08b21a4 100644 --- a/src/tests/pass.rs +++ b/src/tests/pass.rs @@ -1,3 +1,5 @@ +use std::{env, fs::File, path::PathBuf}; + use config::ConfigBuilder; use git2::Repository; use hex::FromHex; @@ -8,7 +10,6 @@ use sequoia_openpgp::{ stream::{Armorer, Message, Signer}, }, }; -use std::{env, fs::File, path::PathBuf}; use tempfile::tempdir; use super::*; diff --git a/src/tests/test_helpers.rs b/src/tests/test_helpers.rs index d33a3009..1d156ed8 100644 --- a/src/tests/test_helpers.rs +++ b/src/tests/test_helpers.rs @@ -7,17 +7,17 @@ use std::{ use flate2::read::GzDecoder; use hex::FromHex; -use sequoia_openpgp::crypto::SessionKey; -use sequoia_openpgp::packet::UserID; -use sequoia_openpgp::types::SymmetricAlgorithm; use sequoia_openpgp::{ Cert, KeyHandle, KeyID, cert::CertBuilder, + crypto::SessionKey, + packet::UserID, parse::{ Parse, stream::{DecryptionHelper, DecryptorBuilder, MessageStructure, VerificationHelper}, }, policy::StandardPolicy, + types::SymmetricAlgorithm, }; use tar::Archive; From dbf2a3dc53df9a33aae9daeaecd18bf629e4ebed Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Sat, 27 Dec 2025 11:38:07 -0600 Subject: [PATCH 17/18] Embedded the wordlist for passphrase generator at compile time using include_str! --- src/passphrase_generator.rs | 21 ++++++++------------- {share => src}/wordlists/eff_large.wordlist | 0 2 files changed, 8 insertions(+), 13 deletions(-) rename {share => src}/wordlists/eff_large.wordlist (100%) diff --git a/src/passphrase_generator.rs b/src/passphrase_generator.rs index 7bf04bd7..c99a70de 100644 --- a/src/passphrase_generator.rs +++ b/src/passphrase_generator.rs @@ -1,20 +1,14 @@ -use std::{ - fs::File, - io::{self, BufRead}, -}; - use rand::seq::SliceRandom; +use std::io; -pub fn passphrase_generator(wordcount: i32) -> io::Result> { - let filename = "share/wordlists/eff_large.wordlist"; - let file = File::open(filename)?; - let reader = io::BufReader::new(file); +static WORDLIST: &str = include_str!("wordlists/eff_large.wordlist"); - let words: Vec = reader +pub fn passphrase_generator(wordcount: i32) -> io::Result> { + let words: Vec = WORDLIST .lines() - .map_while(Result::ok) - .map(|line| line.trim().to_string()) + .map(|line| line.trim()) .filter(|line| !line.is_empty()) + .map(String::from) .collect(); if words.is_empty() { @@ -24,7 +18,7 @@ pub fn passphrase_generator(wordcount: i32) -> io::Result> { let mut rng = rand::thread_rng(); - let selected: Vec = if (words.len() as i32) <= wordcount { + let selected = if words.len() <= wordcount as usize { words.clone() } else { words @@ -35,3 +29,4 @@ pub fn passphrase_generator(wordcount: i32) -> io::Result> { Ok(selected) } + diff --git a/share/wordlists/eff_large.wordlist b/src/wordlists/eff_large.wordlist similarity index 100% rename from share/wordlists/eff_large.wordlist rename to src/wordlists/eff_large.wordlist From beed8a3acdee1d3f68a5ee5ddab1e273e4e5b6de Mon Sep 17 00:00:00 2001 From: WinterPancake Date: Sat, 27 Dec 2025 11:41:21 -0600 Subject: [PATCH 18/18] Fixed rustfmt --- src/passphrase_generator.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/passphrase_generator.rs b/src/passphrase_generator.rs index c99a70de..9da35298 100644 --- a/src/passphrase_generator.rs +++ b/src/passphrase_generator.rs @@ -1,6 +1,7 @@ -use rand::seq::SliceRandom; use std::io; +use rand::seq::SliceRandom; + static WORDLIST: &str = include_str!("wordlists/eff_large.wordlist"); pub fn passphrase_generator(wordcount: i32) -> io::Result> { @@ -29,4 +30,3 @@ pub fn passphrase_generator(wordcount: i32) -> io::Result> { Ok(selected) } -