From 254d69fce6654dfdde7f197997229f66a7bbaa57 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 19:17:44 +0100 Subject: [PATCH 001/174] Added simple chrono widget with easier UI --- apps/chronosimplewid/ChangeLog | 6 ++ apps/chronosimplewid/README.md | 41 ++++++++++++ apps/chronosimplewid/app-icon.js | 1 + apps/chronosimplewid/app.js | 93 ++++++++++++++++++++++++++++ apps/chronosimplewid/app.png | Bin 0 -> 1060 bytes apps/chronosimplewid/metadata.json | 17 +++++ apps/chronosimplewid/screenshot.png | Bin 0 -> 2920 bytes apps/chronosimplewid/widget.js | 79 +++++++++++++++++++++++ 8 files changed, 237 insertions(+) create mode 100644 apps/chronosimplewid/ChangeLog create mode 100644 apps/chronosimplewid/README.md create mode 100644 apps/chronosimplewid/app-icon.js create mode 100644 apps/chronosimplewid/app.js create mode 100644 apps/chronosimplewid/app.png create mode 100644 apps/chronosimplewid/metadata.json create mode 100644 apps/chronosimplewid/screenshot.png create mode 100644 apps/chronosimplewid/widget.js diff --git a/apps/chronosimplewid/ChangeLog b/apps/chronosimplewid/ChangeLog new file mode 100644 index 000000000..ed230b737 --- /dev/null +++ b/apps/chronosimplewid/ChangeLog @@ -0,0 +1,6 @@ +0.01: New widget and app! +0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme) +0.03: Display only minutes:seconds when less than 1 hour left +0.04: Change to 7 segment font, move to top widget bar + Better auto-update behaviour, less RAM used +0.05: Fix error running app on new firmwares (fix #1140) diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md new file mode 100644 index 000000000..6e0aba681 --- /dev/null +++ b/apps/chronosimplewid/README.md @@ -0,0 +1,41 @@ +# Chronometer Widget + +Chronometer (timer) that runs as a widget. +The advantage is, that you can still see your normal watchface and other widgets when the timer is running. +The widget is always active, but only shown when the timer is on. +Hours, minutes, seconds and timer status can be set with an app. + +When there is less than one second left on the timer it buzzes. + +The widget has been tested on Bangle 1 and Bangle 2 + +## Screenshots + +![](screenshot.png) + + +## Features + +* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded) +* Target time is saved to a file and timer picks up again when widget is loaded again. + +## Settings + +There are no settings section in the settings app, timer can be set using an app. + +* Reset values: Reset hours, minutes, seconds to 0; set timer on to false; write to settings file +* Hours: Set the hours for the timer +* Minutes: Set the minutes for the timer +* Seconds: Set the seconds for the timer +* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. + + +## Releases + +* Official app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) +* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#) +* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid + +## Requests + +If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ diff --git a/apps/chronosimplewid/app-icon.js b/apps/chronosimplewid/app-icon.js new file mode 100644 index 000000000..db2010218 --- /dev/null +++ b/apps/chronosimplewid/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA=")) \ No newline at end of file diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js new file mode 100644 index 000000000..8e2c82b68 --- /dev/null +++ b/apps/chronosimplewid/app.js @@ -0,0 +1,93 @@ +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +const storage = require('Storage'); +let settingsChronowid; + +function updateSettings() { + var now = new Date(); + const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), + now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); + settingsChronowid.goal = goal.getTime(); + storage.writeJSON('chronowid.json', settingsChronowid); + if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); +} + +function resetSettings() { + settingsChronowid = { + hours : 0, + minutes : 0, + seconds : 0, + started : false, + counter : 0, + goal : 0, + }; + updateSettings(); +} + +settingsChronowid = storage.readJSON('chronowid.json',1); +if (!settingsChronowid) resetSettings(); + +E.on('kill', () => { + updateSettings(); +}); + +function showMenu() { + const timerMenu = { + '': { + 'title': 'Set timer' + }, + '< Back' : ()=>{load();}, + 'Reset Values': function() { + settingsChronowid.hours = 0; + settingsChronowid.minutes = 0; + settingsChronowid.seconds = 0; + settingsChronowid.started = false; + updateSettings(); + showMenu(); + }, + 'Hours': { + value: settingsChronowid.hours, + min: 0, + max: 24, + step: 1, + onchange: v => { + settingsChronowid.hours = v; + updateSettings(); + } + }, + 'Minutes': { + value: settingsChronowid.minutes, + min: 0, + max: 59, + step: 1, + onchange: v => { + settingsChronowid.minutes = v; + updateSettings(); + } + }, + 'Seconds': { + value: settingsChronowid.seconds, + min: 0, + max: 59, + step: 1, + onchange: v => { + settingsChronowid.seconds = v; + updateSettings(); + } + }, + 'Timer on': { + value: settingsChronowid.started, + format: v => v ? "On" : "Off", + onchange: v => { + settingsChronowid.started = v; + updateSettings(); + } + }, + }; + + return E.showMenu(timerMenu); +} + +showMenu(); diff --git a/apps/chronosimplewid/app.png b/apps/chronosimplewid/app.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac7a480c5d4533c9851ba6264b74aae48035eb0 GIT binary patch literal 1060 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 literal 0 HcmV?d00001 diff --git a/apps/chronosimplewid/widget.js b/apps/chronosimplewid/widget.js new file mode 100644 index 000000000..2d1c78941 --- /dev/null +++ b/apps/chronosimplewid/widget.js @@ -0,0 +1,79 @@ +(() => { + var settingsChronowid; + var interval = 0; //used for the 1 second interval timer + var diff; + + //Convert ms to time + function getTime(t) { + var milliseconds = parseInt((t % 1000) / 100), + seconds = Math.floor((t / 1000) % 60), + minutes = Math.floor((t / (1000 * 60)) % 60), + hours = Math.floor((t / (1000 * 60 * 60)) % 24); + return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); + } + + /*function printDebug() { + print ("Goaltime: " + getTime(settingsChronowid.goal)); + print ("Goal: " + settingsChronowid.goal); + print("Difftime: " + getTime(diff)); + print("Diff: " + diff); + print ("Started: " + settingsChronowid.started); + print ("----"); + }*/ + + //counts down, calculates and displays + function countDown() { + var now = new Date(); + diff = settingsChronowid.goal - now; //calculate difference + // time is up + if (settingsChronowid.started && diff < 1000) { + Bangle.buzz(1500); + //write timer off to file + settingsChronowid.started = false; + require('Storage').writeJSON('chronowid.json', settingsChronowid); + clearInterval(interval); //stop interval + interval = undefined; + } + // calculates width and redraws accordingly + WIDGETS["chronowid"].redraw(); + } + + // add the widget + WIDGETS["chronowid"]={area:"tl",width:0,draw:function() { + if (!this.width) return; + g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); + //g.drawRect(this.x,this.y,this.x+this.width-1, this.y+23); + var scale; + var timeStr; + if (diff < 3600000) { //less than 1 hour left + width = 58; + scale = 2; + timeStr = getTime(diff).substring(3); // remove hour part 00:00:00 -> 00:00 + } else { //one hour or more left + width = 48; + scale = 1; + timeStr = getTime(diff); //display hour 00:00:00 but small + } + // Font5x9Numeric7Seg - just build this in as it's tiny + g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); + g.drawString(timeStr, this.x+this.width/2, this.y+12); + }, redraw:function() { + var last = this.width; + if (!settingsChronowid.started) this.width = 0; + else this.width = (diff < 3600000) ? 58 : 48; + if (last != this.width) Bangle.drawWidgets(); + else this.draw(); + }, reload:function() { + settingsChronowid = require('Storage').readJSON("chronowid.json",1)||{}; + if (interval) clearInterval(interval); + interval = undefined; + // start countdown each second + if (settingsChronowid.started) interval = setInterval(countDown, 1000); + // reset everything + countDown(); + }}; + + //printDebug(); + // set width correctly, start countdown each second + WIDGETS["chronowid"].reload(); +})(); From 4cb1cf2ba4438e93aa2e337133d00e3bba7cc99e Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 20:10:09 +0100 Subject: [PATCH 002/174] Simpler UI --- apps/chronosimplewid/ChangeLog | 7 +- apps/chronosimplewid/README.md | 45 ++--------- apps/chronosimplewid/app.js | 119 +++++++++++++++-------------- apps/chronosimplewid/metadata.json | 10 +-- 4 files changed, 73 insertions(+), 108 deletions(-) diff --git a/apps/chronosimplewid/ChangeLog b/apps/chronosimplewid/ChangeLog index ed230b737..07afedd21 100644 --- a/apps/chronosimplewid/ChangeLog +++ b/apps/chronosimplewid/ChangeLog @@ -1,6 +1 @@ -0.01: New widget and app! -0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme) -0.03: Display only minutes:seconds when less than 1 hour left -0.04: Change to 7 segment font, move to top widget bar - Better auto-update behaviour, less RAM used -0.05: Fix error running app on new firmwares (fix #1140) +0.01: Release \ No newline at end of file diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md index 6e0aba681..6f3b417c0 100644 --- a/apps/chronosimplewid/README.md +++ b/apps/chronosimplewid/README.md @@ -1,41 +1,10 @@ -# Chronometer Widget +# Simple Chronometer Widget -Chronometer (timer) that runs as a widget. -The advantage is, that you can still see your normal watchface and other widgets when the timer is running. -The widget is always active, but only shown when the timer is on. -Hours, minutes, seconds and timer status can be set with an app. +A fork of the awesome Chronometer Widget, but with a simple UI to set +a timer faster using only a tab events. Also very useful if combined +with the Pattern Launcher. -When there is less than one second left on the timer it buzzes. +# Contributors +Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) -The widget has been tested on Bangle 1 and Bangle 2 - -## Screenshots - -![](screenshot.png) - - -## Features - -* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded) -* Target time is saved to a file and timer picks up again when widget is loaded again. - -## Settings - -There are no settings section in the settings app, timer can be set using an app. - -* Reset values: Reset hours, minutes, seconds to 0; set timer on to false; write to settings file -* Hours: Set the hours for the timer -* Minutes: Set the minutes for the timer -* Seconds: Set the seconds for the timer -* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. - - -## Releases - -* Official app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) -* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#) -* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid - -## Requests - -If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ +Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index 8e2c82b68..b115bde00 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -1,10 +1,15 @@ -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); - const storage = require('Storage'); let settingsChronowid; + +const screenWidth = g.getWidth(); +const screenHeight = g.getHeight(); +const screenHalfWidth = parseInt(screenWidth/2); +const screenHalfHeight = parseInt(screenHeight/2); +let interval = 0; + + + function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), @@ -33,61 +38,57 @@ E.on('kill', () => { updateSettings(); }); -function showMenu() { - const timerMenu = { - '': { - 'title': 'Set timer' - }, - '< Back' : ()=>{load();}, - 'Reset Values': function() { - settingsChronowid.hours = 0; - settingsChronowid.minutes = 0; - settingsChronowid.seconds = 0; - settingsChronowid.started = false; - updateSettings(); - showMenu(); - }, - 'Hours': { - value: settingsChronowid.hours, - min: 0, - max: 24, - step: 1, - onchange: v => { - settingsChronowid.hours = v; - updateSettings(); - } - }, - 'Minutes': { - value: settingsChronowid.minutes, - min: 0, - max: 59, - step: 1, - onchange: v => { - settingsChronowid.minutes = v; - updateSettings(); - } - }, - 'Seconds': { - value: settingsChronowid.seconds, - min: 0, - max: 59, - step: 1, - onchange: v => { - settingsChronowid.seconds = v; - updateSettings(); - } - }, - 'Timer on': { - value: settingsChronowid.started, - format: v => v ? "On" : "Off", - onchange: v => { - settingsChronowid.started = v; - updateSettings(); - } - }, - }; +function draw(){ + g.clear(1); + Bangle.drawWidgets(); - return E.showMenu(timerMenu); + g.setColor(g.theme.fg); + g.setFont("Vector", 25).setFontAlign(0,-1); + + g.setFontAlign(0, 0, 0); + g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); + + if(settingsChronowid.started){ + g.setColor("#ff0000"); + g.setFont("Vector", 16).setFontAlign(0,-1); + g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); + } } -showMenu(); +Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.2); + var right = g.getWidth() - left; + var upper = 24 + parseInt(g.getHeight() * 0.2); + var lower = g.getHeight() - upper; + + var isLeft = e.x < left; + var isRight = e.x > right; + var isUpper = e.y < upper; + var isLower = e.y > lower; + + if(isRight){ + print("right"); + settingsChronowid.minutes += 1; + } else if(isLeft){ + print("left"); + settingsChronowid.minutes -= 1; + } else if(isUpper){ + print("upper"); + settingsChronowid.minutes += 5; + } else if(isLower){ + print("lower"); + settingsChronowid.minutes -= 5; + } else { + print("else"); + settingsChronowid.started = !settingsChronowid.started; + } + + settingsChronowid.minutes = Math.max(0, settingsChronowid.minutes); + updateSettings(); + draw(); +}); + +g.reset(); +setWatch(_=>load(), BTN1); +Bangle.loadWidgets(); +draw(); \ No newline at end of file diff --git a/apps/chronosimplewid/metadata.json b/apps/chronosimplewid/metadata.json index ad219ea4f..72cc13e32 100644 --- a/apps/chronosimplewid/metadata.json +++ b/apps/chronosimplewid/metadata.json @@ -1,12 +1,12 @@ { "id": "chronosimplewid", - "name": "Simple Chrono Widget", - "shortName": "Simple Chrono Widget", - "version": "0.05", - "description": "Fork from Chrono Widget with simpler UI.", + "name": "Simple Chrono", + "shortName": "Simple Chrono", + "version": "0.01", + "description": "Chrono Widget Fork. Implements a simpler UI.", "icon": "app.png", "tags": "tool,widget", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS","BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}], "readme": "README.md", "storage": [ From e678892223dbc96dfebc32179d1c4fb770d16fae Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 21:47:22 +0100 Subject: [PATCH 003/174] Bugfixes and improvements --- apps/chronosimplewid/app.js | 25 ++++++++++++------------- apps/chronosimplewid/widget.js | 4 ++-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index b115bde00..ff97d20dd 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -1,13 +1,13 @@ +Bangle.loadWidgets(); + + const storage = require('Storage'); let settingsChronowid; - const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const screenHalfWidth = parseInt(screenWidth/2); const screenHalfHeight = parseInt(screenHeight/2); -let interval = 0; - function updateSettings() { @@ -15,10 +15,11 @@ function updateSettings() { const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); settingsChronowid.goal = goal.getTime(); - storage.writeJSON('chronowid.json', settingsChronowid); + storage.writeJSON('chronosimplewid.json', settingsChronowid); if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); } + function resetSettings() { settingsChronowid = { hours : 0, @@ -31,34 +32,34 @@ function resetSettings() { updateSettings(); } -settingsChronowid = storage.readJSON('chronowid.json',1); + +settingsChronowid = storage.readJSON('chronosimplewid.json',1); if (!settingsChronowid) resetSettings(); -E.on('kill', () => { - updateSettings(); -}); +setWatch(_=>load(), BTN1); function draw(){ g.clear(1); Bangle.drawWidgets(); g.setColor(g.theme.fg); - g.setFont("Vector", 25).setFontAlign(0,-1); + g.setFont("Vector", 26).setFontAlign(0,-1); g.setFontAlign(0, 0, 0); g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); if(settingsChronowid.started){ g.setColor("#ff0000"); - g.setFont("Vector", 16).setFontAlign(0,-1); + g.setFont("Vector", 20).setFontAlign(0,-1); g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); } } + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.2); var right = g.getWidth() - left; - var upper = 24 + parseInt(g.getHeight() * 0.2); + var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; var isLeft = e.x < left; @@ -89,6 +90,4 @@ Bangle.on('touch', function(btn, e){ }); g.reset(); -setWatch(_=>load(), BTN1); -Bangle.loadWidgets(); draw(); \ No newline at end of file diff --git a/apps/chronosimplewid/widget.js b/apps/chronosimplewid/widget.js index 2d1c78941..3fc5888b1 100644 --- a/apps/chronosimplewid/widget.js +++ b/apps/chronosimplewid/widget.js @@ -30,7 +30,7 @@ Bangle.buzz(1500); //write timer off to file settingsChronowid.started = false; - require('Storage').writeJSON('chronowid.json', settingsChronowid); + require('Storage').writeJSON('chronosimplewid.json', settingsChronowid); clearInterval(interval); //stop interval interval = undefined; } @@ -64,7 +64,7 @@ if (last != this.width) Bangle.drawWidgets(); else this.draw(); }, reload:function() { - settingsChronowid = require('Storage').readJSON("chronowid.json",1)||{}; + settingsChronowid = require('Storage').readJSON("chronosimplewid.json",1)||{}; if (interval) clearInterval(interval); interval = undefined; // start countdown each second From 56880b96f64ca8e35c6b47d32896ac339ab710ba Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 21:53:27 +0100 Subject: [PATCH 004/174] Improvements and fixes --- apps/chronosimplewid/app.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index ff97d20dd..c8d3a4db7 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -6,8 +6,8 @@ let settingsChronowid; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); -const screenHalfWidth = parseInt(screenWidth/2); -const screenHalfHeight = parseInt(screenHeight/2); +const cx = parseInt(screenWidth/2); +const cy = parseInt(screenHeight/2); function updateSettings() { @@ -43,15 +43,15 @@ function draw(){ Bangle.drawWidgets(); g.setColor(g.theme.fg); - g.setFont("Vector", 26).setFontAlign(0,-1); + g.setFont("Vector", 32).setFontAlign(0,-1); g.setFontAlign(0, 0, 0); - g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); + g.drawString(settingsChronowid.minutes + " min.", cx, cy); if(settingsChronowid.started){ g.setColor("#ff0000"); g.setFont("Vector", 20).setFontAlign(0,-1); - g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); + g.drawString("[started]", cx, cy+20); } } @@ -68,23 +68,22 @@ Bangle.on('touch', function(btn, e){ var isLower = e.y > lower; if(isRight){ - print("right"); settingsChronowid.minutes += 1; } else if(isLeft){ - print("left"); settingsChronowid.minutes -= 1; } else if(isUpper){ - print("upper"); settingsChronowid.minutes += 5; } else if(isLower){ - print("lower"); settingsChronowid.minutes -= 5; } else { - print("else"); settingsChronowid.started = !settingsChronowid.started; } - settingsChronowid.minutes = Math.max(0, settingsChronowid.minutes); + if(settingsChronowid.minutes <= 0){ + settingsChronowid.minutes = 0; + settingsChronowid.started = false; + } + updateSettings(); draw(); }); From 6a085c11d78a41b2988bba396424331923192c20 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 13:23:56 +0100 Subject: [PATCH 005/174] Improvements of design and user feedback --- apps/chronosimplewid/app.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index c8d3a4db7..d3293bc90 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -13,7 +13,7 @@ const cy = parseInt(screenHeight/2); function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); + now.getHours(), now.getMinutes() + settingsChronowid.minutes, now.getSeconds()); settingsChronowid.goal = goal.getTime(); storage.writeJSON('chronosimplewid.json', settingsChronowid); if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); @@ -42,24 +42,26 @@ function draw(){ g.clear(1); Bangle.drawWidgets(); - g.setColor(g.theme.fg); - g.setFont("Vector", 32).setFontAlign(0,-1); - g.setFontAlign(0, 0, 0); - g.drawString(settingsChronowid.minutes + " min.", cx, cy); + g.setFont("Vector", 32).setFontAlign(0,-1); + var text = settingsChronowid.minutes + " min."; + var rectWidth = parseInt(g.stringWidth(text) / 2); if(settingsChronowid.started){ g.setColor("#ff0000"); - g.setFont("Vector", 20).setFontAlign(0,-1); - g.drawString("[started]", cx, cy+20); + } else { + g.setColor(g.theme.fg); } + g.fillRect(cx-rectWidth-5, cy-5, cx+rectWidth, cy+30); + + g.setColor(g.theme.bg); + g.drawString(text, cx, cy); } - Bangle.on('touch', function(btn, e){ - var left = parseInt(g.getWidth() * 0.2); + var left = parseInt(g.getWidth() * 0.25); var right = g.getWidth() - left; - var upper = parseInt(g.getHeight() * 0.2); + var upper = parseInt(g.getHeight() * 0.25); var lower = g.getHeight() - upper; var isLeft = e.x < left; @@ -69,14 +71,19 @@ Bangle.on('touch', function(btn, e){ if(isRight){ settingsChronowid.minutes += 1; + Bangle.buzz(40, 0.3); } else if(isLeft){ settingsChronowid.minutes -= 1; + Bangle.buzz(40, 0.3); } else if(isUpper){ settingsChronowid.minutes += 5; + Bangle.buzz(40, 0.3); } else if(isLower){ settingsChronowid.minutes -= 5; + Bangle.buzz(40, 0.3); } else { settingsChronowid.started = !settingsChronowid.started; + Bangle.buzz(120, 0.6); } if(settingsChronowid.minutes <= 0){ From a03fdec826819931f9058f7dab986ffc8dfb27e2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 17:14:19 +0100 Subject: [PATCH 006/174] Renaming --- apps/chronosimplewid/README.md | 10 --- apps/chronosimplewid/metadata.json | 17 ---- apps/{chronosimplewid => widtmr}/ChangeLog | 0 apps/widtmr/README.md | 12 +++ apps/{chronosimplewid => widtmr}/app-icon.js | 0 apps/{chronosimplewid => widtmr}/app.js | 47 +++++++---- apps/{chronosimplewid => widtmr}/app.png | Bin apps/widtmr/metadata.json | 17 ++++ .../screenshot.png | Bin apps/{chronosimplewid => widtmr}/widget.js | 78 +++++++++++------- 10 files changed, 108 insertions(+), 73 deletions(-) delete mode 100644 apps/chronosimplewid/README.md delete mode 100644 apps/chronosimplewid/metadata.json rename apps/{chronosimplewid => widtmr}/ChangeLog (100%) create mode 100644 apps/widtmr/README.md rename apps/{chronosimplewid => widtmr}/app-icon.js (100%) rename apps/{chronosimplewid => widtmr}/app.js (58%) rename apps/{chronosimplewid => widtmr}/app.png (100%) create mode 100644 apps/widtmr/metadata.json rename apps/{chronosimplewid => widtmr}/screenshot.png (100%) rename apps/{chronosimplewid => widtmr}/widget.js (60%) diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md deleted file mode 100644 index 6f3b417c0..000000000 --- a/apps/chronosimplewid/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Simple Chronometer Widget - -A fork of the awesome Chronometer Widget, but with a simple UI to set -a timer faster using only a tab events. Also very useful if combined -with the Pattern Launcher. - -# Contributors -Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) - -Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/metadata.json b/apps/chronosimplewid/metadata.json deleted file mode 100644 index 72cc13e32..000000000 --- a/apps/chronosimplewid/metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "chronosimplewid", - "name": "Simple Chrono", - "shortName": "Simple Chrono", - "version": "0.01", - "description": "Chrono Widget Fork. Implements a simpler UI.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "storage": [ - {"name":"chronosimplewid.wid.js","url":"widget.js"}, - {"name":"chronosimplewid.app.js","url":"app.js"}, - {"name":"chronosimplewid.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/chronosimplewid/ChangeLog b/apps/widtmr/ChangeLog similarity index 100% rename from apps/chronosimplewid/ChangeLog rename to apps/widtmr/ChangeLog diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md new file mode 100644 index 000000000..0694a13cc --- /dev/null +++ b/apps/widtmr/README.md @@ -0,0 +1,12 @@ +# Simple Chronometer Widget + +This is a fork of the Chrono Widget, but implements a +simpler UI which to be able to set a timer faster with +less interaction. Additionally, it exposes some functions +that can be used by other apps or clocks to easily +implement a timer. It is used e.g. by lcars or notanalog. + +# Contributors +Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) + +Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/app-icon.js b/apps/widtmr/app-icon.js similarity index 100% rename from apps/chronosimplewid/app-icon.js rename to apps/widtmr/app-icon.js diff --git a/apps/chronosimplewid/app.js b/apps/widtmr/app.js similarity index 58% rename from apps/chronosimplewid/app.js rename to apps/widtmr/app.js index d3293bc90..311e0d3ea 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/widtmr/app.js @@ -1,8 +1,19 @@ +/* + * This is a fork of the Chrono Widget, but implements a + * simpler UI which to be able to set a timer faster with + * less interaction. Additionally, it exposes some functions + * that can be used by other apps or clocks to easily + * implement a timer. It is used e.g. by lcars or notanalog. + * + * Creator: David Peer + * Date: 02/2022 + */ + Bangle.loadWidgets(); const storage = require('Storage'); -let settingsChronowid; +let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); @@ -13,15 +24,15 @@ const cy = parseInt(screenHeight/2); function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settingsChronowid.minutes, now.getSeconds()); - settingsChronowid.goal = goal.getTime(); - storage.writeJSON('chronosimplewid.json', settingsChronowid); - if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); + now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); + settings.goal = goal.getTime(); + storage.writeJSON('widtmr.json', settings); + if (WIDGETS["widtmr"]) WIDGETS["widtmr"].reload(); } function resetSettings() { - settingsChronowid = { + settings = { hours : 0, minutes : 0, seconds : 0, @@ -33,8 +44,8 @@ function resetSettings() { } -settingsChronowid = storage.readJSON('chronosimplewid.json',1); -if (!settingsChronowid) resetSettings(); +settings = storage.readJSON('widtmr.json',1); +if (!settings) resetSettings(); setWatch(_=>load(), BTN1); @@ -44,10 +55,10 @@ function draw(){ g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var text = settingsChronowid.minutes + " min."; + var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); - if(settingsChronowid.started){ + if(settings.started){ g.setColor("#ff0000"); } else { g.setColor(g.theme.fg); @@ -70,25 +81,25 @@ Bangle.on('touch', function(btn, e){ var isLower = e.y > lower; if(isRight){ - settingsChronowid.minutes += 1; + settings.minutes += 1; Bangle.buzz(40, 0.3); } else if(isLeft){ - settingsChronowid.minutes -= 1; + settings.minutes -= 1; Bangle.buzz(40, 0.3); } else if(isUpper){ - settingsChronowid.minutes += 5; + settings.minutes += 5; Bangle.buzz(40, 0.3); } else if(isLower){ - settingsChronowid.minutes -= 5; + settings.minutes -= 5; Bangle.buzz(40, 0.3); } else { - settingsChronowid.started = !settingsChronowid.started; + settings.started = !settings.started; Bangle.buzz(120, 0.6); } - if(settingsChronowid.minutes <= 0){ - settingsChronowid.minutes = 0; - settingsChronowid.started = false; + if(settings.minutes <= 0){ + settings.minutes = 0; + settings.started = false; } updateSettings(); diff --git a/apps/chronosimplewid/app.png b/apps/widtmr/app.png similarity index 100% rename from apps/chronosimplewid/app.png rename to apps/widtmr/app.png diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json new file mode 100644 index 000000000..9645cc00c --- /dev/null +++ b/apps/widtmr/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "widtmr", + "name": "Timer Widget", + "shortName": "Timer Widget", + "version": "0.01", + "description": "Fork from Chrono Widget with a simpler UI and a lib for other apps.", + "icon": "app.png", + "tags": "tool,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"widtmr.wid.js","url":"widget.js"}, + {"name":"widtmr.app.js","url":"app.js"}, + {"name":"widtmr.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/chronosimplewid/screenshot.png b/apps/widtmr/screenshot.png similarity index 100% rename from apps/chronosimplewid/screenshot.png rename to apps/widtmr/screenshot.png diff --git a/apps/chronosimplewid/widget.js b/apps/widtmr/widget.js similarity index 60% rename from apps/chronosimplewid/widget.js rename to apps/widtmr/widget.js index 3fc5888b1..c918a52e1 100644 --- a/apps/chronosimplewid/widget.js +++ b/apps/widtmr/widget.js @@ -1,8 +1,11 @@ (() => { - var settingsChronowid; + let storage = require('Storage'); + + var settings; var interval = 0; //used for the 1 second interval timer var diff; + //Convert ms to time function getTime(t) { var milliseconds = parseInt((t % 1000) / 100), @@ -12,37 +15,35 @@ return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); } - /*function printDebug() { - print ("Goaltime: " + getTime(settingsChronowid.goal)); - print ("Goal: " + settingsChronowid.goal); - print("Difftime: " + getTime(diff)); - print("Diff: " + diff); - print ("Started: " + settingsChronowid.started); - print ("----"); - }*/ //counts down, calculates and displays function countDown() { var now = new Date(); - diff = settingsChronowid.goal - now; //calculate difference + diff = settings.goal - now; //calculate difference // time is up - if (settingsChronowid.started && diff < 1000) { + if (settings.started && diff < 1000) { Bangle.buzz(1500); //write timer off to file - settingsChronowid.started = false; - require('Storage').writeJSON('chronosimplewid.json', settingsChronowid); + settings.started = false; + storage.writeJSON('widtmr.json', settings); clearInterval(interval); //stop interval interval = undefined; } // calculates width and redraws accordingly - WIDGETS["chronowid"].redraw(); + WIDGETS["widtmr"].redraw(); } - // add the widget - WIDGETS["chronowid"]={area:"tl",width:0,draw:function() { - if (!this.width) return; + + /* + * Add the widgets and functions for other apps + */ + WIDGETS["widtmr"]={area:"tl",width:0,draw:function() { + if (!this.width) { + return; + } + g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); - //g.drawRect(this.x,this.y,this.x+this.width-1, this.y+23); + var scale; var timeStr; if (diff < 3600000) { //less than 1 hour left @@ -54,26 +55,47 @@ scale = 1; timeStr = getTime(diff); //display hour 00:00:00 but small } + // Font5x9Numeric7Seg - just build this in as it's tiny g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); g.drawString(timeStr, this.x+this.width/2, this.y+12); + }, redraw:function() { var last = this.width; - if (!settingsChronowid.started) this.width = 0; - else this.width = (diff < 3600000) ? 58 : 48; - if (last != this.width) Bangle.drawWidgets(); - else this.draw(); + if (!settings.started) { + this.width = 0; + } else { + this.width = (diff < 3600000) ? 58 : 48; + } + + if (last != this.width) { + Bangle.drawWidgets(); + } else { + this.draw(); + } + }, reload:function() { - settingsChronowid = require('Storage').readJSON("chronosimplewid.json",1)||{}; - if (interval) clearInterval(interval); + settings = storage.readJSON("widtmr.json",1)||{}; + if (interval) { + clearInterval(interval); + } interval = undefined; + // start countdown each second - if (settingsChronowid.started) interval = setInterval(countDown, 1000); + if (settings.started) { + interval = setInterval(countDown, 1000); + } + // reset everything countDown(); - }}; - //printDebug(); + }, isStarted: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + return settings.started; + } + +}; + // set width correctly, start countdown each second - WIDGETS["chronowid"].reload(); + WIDGETS["widtmr"].reload(); })(); From b8215908a625a754748a92ebc6512c3430e6940d Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 17:55:47 +0100 Subject: [PATCH 007/174] Expose timer functions for other apps. Updated notanalog and lcars to use this lib. --- apps/lcars/ChangeLog | 3 +- apps/lcars/README.md | 9 ++--- apps/lcars/lcars.app.js | 61 +++++---------------------------- apps/lcars/metadata.json | 3 +- apps/notanalog/ChangeLog | 3 +- apps/notanalog/README.md | 6 ++-- apps/notanalog/metadata.json | 3 +- apps/notanalog/notanalog.app.js | 56 ++++-------------------------- apps/widtmr/README.md | 18 +++++++--- apps/widtmr/app.js | 4 ++- apps/widtmr/widget.js | 38 ++++++++++++++++++++ 11 files changed, 85 insertions(+), 119 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 7d8fecb1e..08b3b3d4d 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -15,4 +15,5 @@ 0.15: Using wpedom to count steps. 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. -0.18: Fullscreen mode can now be enabled or disabled in the settings. \ No newline at end of file +0.18: Fullscreen mode can now be enabled or disabled in the settings. +0.19: Use widtmr for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index f979b2304..cf360d647 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -15,7 +15,7 @@ with Gadgetbride and the weather app must be installed. * Tab on left/right to switch between different screens. * Cusomizable data that is shown on screen 1 (steps, weather etc.) * Shows random and real images of planets. - * Tap on top/bottom of screen 1 to activate an alarm. + * Tap on top/bottom of screen 1 to activate an alarm. Depends on widtmr. * The lower orange line indicates the battery level. * Display graphs (day or month) for steps + hrm on the second screen. @@ -36,8 +36,9 @@ Access different screens via tap on the left/ right side of the screen ![](screenshot_1.png) ![](screenshot_2.png) +## Creator +- [David Peer](https://github.com/peerdavid) ## Contributors -- [David Peer](https://github.com/peerdavid). -- [Adam Schmalhofer](https://github.com/adamschmalhofer). -- [Jon Warrington](https://github.com/BartokW). +- [Adam Schmalhofer](https://github.com/adamschmalhofer) +- [Jon Warrington](https://github.com/BartokW) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7d5da2d8e..13c163e26 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -480,9 +480,6 @@ function draw(){ // Queue draw first to ensure that its called in one minute again. queueDraw(); - // First handle alarm to show this correctly afterwards - handleAlarm(); - // Next draw the watch face g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); @@ -561,43 +558,21 @@ function getWeather(){ /* * Handle alarm */ -function getCurrentTimeInMinutes(){ - return Math.floor(Date.now() / (1000*60)); -} - function isAlarmEnabled(){ - return settings.alarm >= 0; + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ - var currentTime = getCurrentTimeInMinutes(); - return settings.alarm - currentTime; + return WIDGETS["widtmr"].getRemainingMinutes(); } -function handleAlarm(){ - if(!isAlarmEnabled()){ - return; - } +function increaseAlarm(){ + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); +} - if(getAlarmMinutes() > 0){ - return; - } - - // Alarm - var t = 300; - Bangle.buzz(t, 1) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) - .then(() => { - // Update alarm state to disabled - settings.alarm = -1; - storage.writeJSON(SETTINGS_FILE, settings); - }); +function decreaseAlarm(){ + WIDGETS["widtmr"].decreaseTimer(5); } @@ -625,26 +600,6 @@ Bangle.on('charging',function(charging) { }); -function increaseAlarm(){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } - - storage.writeJSON(SETTINGS_FILE, settings); -} - - -function decreaseAlarm(){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - - storage.writeJSON(SETTINGS_FILE, settings); -} function feedback(){ Bangle.buzz(40, 0.3); diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index e6ca10f79..5efd29e7c 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,8 +3,9 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.18", + "version":"0.19", "readme": "README.md", + "dependencies": {"widtmr":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index 574d46609..bb5297476 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,3 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. -0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. \ No newline at end of file +0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. +0.04: Use widtmr widget for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index 2928fd959..3a0963090 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -8,8 +8,8 @@ black one the battery level (100% = 360 degrees). The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. -## Other features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.). +## Other Features +- Set a timer - simply touch top (+5min.) or bottom (-5 min.) - depends on widtmr. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. @@ -29,5 +29,5 @@ which helped a lot for this development. Icons from by Freepik - Flaticon -## Contributors +## Creator - [David Peer](https://github.com/peerdavid). \ No newline at end of file diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 5efb6bccf..5a0ddbaf0 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -3,10 +3,11 @@ "name": "Not Analog", "shortName":"Not Analog", "icon": "notanalog.png", - "version":"0.03", + "version":"0.04", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", + "dependencies": {"widtmr":"app"}, "type": "clock", "tags": "clock", "screenshots": [ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index cea8072b8..be9a01fa7 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -291,7 +291,6 @@ function drawSleep(){ function draw(fastUpdate){ // Execute handlers handleState(fastUpdate); - handleAlarm(); if(state.sleep){ drawSleep(); @@ -388,71 +387,28 @@ function queueDraw() { /* * Handle alarm */ -function getCurrentTimeInMinutes(){ - return Math.floor(Date.now() / (1000*60)); -} - function isAlarmEnabled(){ - return settings.alarm >= 0; + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ - var currentTime = getCurrentTimeInMinutes(); - return settings.alarm - currentTime; + return WIDGETS["widtmr"].getRemainingMinutes(); } -function handleAlarm(){ - if(!isAlarmEnabled()){ - return; - } - - if(getAlarmMinutes() > 0){ - return; - } - - // Alarm - var t = 300; - Bangle.buzz(t, 1) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) - .then(() => { - // Update alarm state to disabled - settings.alarm = -1; - storage.writeJSON(SETTINGS_FILE, settings); - }); -} - - function increaseAlarm(){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } - - storage.writeJSON(SETTINGS_FILE, settings); + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); } - function decreaseAlarm(){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - - storage.writeJSON(SETTINGS_FILE, settings); + WIDGETS["widtmr"].decreaseTimer(5); } function feedback(){ Bangle.buzz(40, 0.6); } + /* * Lets start widgets, listen for btn etc. */ diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 0694a13cc..6820b74d0 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -1,4 +1,4 @@ -# Simple Chronometer Widget +# Timer Widget This is a fork of the Chrono Widget, but implements a simpler UI which to be able to set a timer faster with @@ -6,7 +6,17 @@ less interaction. Additionally, it exposes some functions that can be used by other apps or clocks to easily implement a timer. It is used e.g. by lcars or notanalog. -# Contributors -Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) +# Lib +Different functions are exposed to integrate a timer +into your own app. -Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file +Example: +```Javascript +WIDGETS["widtmr"].isStarted(); +WIDGETS["widtmr"].reload(); +WIDGETS["widtmr"].getRemainingMinutes(); +``` +# Creator + +[David Peer](https://github.com/peerdavid) + forked from [Purple-Tentacle](https://github.com/Purple-Tentacle) diff --git a/apps/widtmr/app.js b/apps/widtmr/app.js index 311e0d3ea..5f836d417 100644 --- a/apps/widtmr/app.js +++ b/apps/widtmr/app.js @@ -1,4 +1,6 @@ /* + * TIMER WIDGET + * * This is a fork of the Chrono Widget, but implements a * simpler UI which to be able to set a timer faster with * less interaction. Additionally, it exposes some functions @@ -18,7 +20,7 @@ let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); -const cy = parseInt(screenHeight/2); +const cy = parseInt(screenHeight/2)-12; function updateSettings() { diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index c918a52e1..127217364 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -34,6 +34,18 @@ } + function updateSettings(){ + var now = new Date(); + const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), + now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); + settings.goal = goal.getTime(); + + settings.goal = goal.getTime(); + storage.writeJSON('widtmr.json', settings); + WIDGETS["widtmr"].reload(); + } + + /* * Add the widgets and functions for other apps */ @@ -92,6 +104,32 @@ }, isStarted: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; return settings.started; + + }, setStarted: function(started){ + settings.started=started; + updateSettings(); + + }, increaseTimer: function(m){ + settings.minutes += m; + updateSettings(); + + }, decreaseTimer: function(m){ + settings.minutes -= m; + if(settings.minutes <= 0){ + settings.started=false; + settings.minutes=0; + } + updateSettings(); + + }, getRemainingMinutes: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + if(!settings.started){ + return -1; + } + + var now = new Date(); + var diff = settings.goal - now; + return Math.floor(diff / (1000*60)); } }; From 6cfd7649162313e7cdcf085fcf2681a3a8eae3c6 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:07:09 +0100 Subject: [PATCH 008/174] Improved documentation --- apps/widtmr/README.md | 29 +++++++++++++++++++++++++---- apps/widtmr/description.png | Bin 0 -> 7771 bytes apps/widtmr/metadata.json | 2 +- apps/widtmr/screenshot.png | Bin 2920 -> 1845 bytes apps/widtmr/screenshot_2.png | Bin 0 -> 1950 bytes 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 apps/widtmr/description.png create mode 100644 apps/widtmr/screenshot_2.png diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 6820b74d0..9216a7b05 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -6,16 +6,37 @@ less interaction. Additionally, it exposes some functions that can be used by other apps or clocks to easily implement a timer. It is used e.g. by lcars or notanalog. +# Overview +If you open the app, you can simply control the timer +by clicking on top, bottom, left or right of the screen. +If you tab at the middle of the screen, the timer is +started / stopped. + +![](description.png) + + # Lib Different functions are exposed to integrate a timer into your own app. -Example: +The following functions are available: +- isStarted() -> boolean +- setStarted(boolean) -> void +- increaseTimer(int) -> void +- decreaseTimer(int) -> void +- getRemainingMinutes() -> int + +Example to increase the timer by 5 and ensure that its started: ```Javascript -WIDGETS["widtmr"].isStarted(); -WIDGETS["widtmr"].reload(); -WIDGETS["widtmr"].getRemainingMinutes(); +WIDGETS["widtmr"].increaseTimer(5); +WIDGETS["widtmr"].setStarted(true); ``` + +Example to decrease the timer. This also disables the timer if time <= 0.: +```Javascript +WIDGETS["widtmr"].decreaseTimer(5); +``` + # Creator [David Peer](https://github.com/peerdavid) diff --git a/apps/widtmr/description.png b/apps/widtmr/description.png new file mode 100644 index 0000000000000000000000000000000000000000..1286d1ab94e56658995ba8dabe08bfc7dea51bc6 GIT binary patch literal 7771 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 SWZ<+Iq^bmYRH|V9`ab}V`IlM% literal 0 HcmV?d00001 diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json index 9645cc00c..a30aea4c3 100644 --- a/apps/widtmr/metadata.json +++ b/apps/widtmr/metadata.json @@ -7,7 +7,7 @@ "icon": "app.png", "tags": "tool,widget", "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", "storage": [ {"name":"widtmr.wid.js","url":"widget.js"}, diff --git a/apps/widtmr/screenshot.png b/apps/widtmr/screenshot.png index f94eece94099f8e5e72db95bd1f6dd3e5a58a7b4..eff94475c73638521c0dc59ff9ec55182f609d2b 100644 GIT binary patch literal 1845 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 diff --git a/apps/widtmr/screenshot_2.png b/apps/widtmr/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5dc9a3df7dc091d1dfe6d8dd3aa29c51351127 GIT binary patch literal 1950 zcmeHI`#01H6d&KFOlD<9MQCO6Y+4K%#tepb3p;JQzwKYJXMec&bMC#L`?=@bbMCp{e(8>tm)j=? zfk5P)ogBQRSo_IfJEXp*X*y5}GI3s5dkFi5`a1|j*4NqL#2Iqn;{CzPbTk55ytOsA zAP#GjRq9;T(yeft5t}>F=j#rNCTqH<#2Y*XpaR;Ccx_=dx`~5Ova&=Q1Oa?mAYk;C zcW_4&_%@C_<&gMCBOmG|-;osV?VxO(z2uY)o_uT_Jx~D7hmj_Gmvjg(yW?b2GdcB2 zmC!)bvINghbo!GbtEl`V8CN1T;_oh_N*UdG1z>-&nxc-#RZXE+f-9=e?fmWb(cR>> z#u*_)ZfxI_KVr?pMv!eaY#S(_P~@g%KrumElU zShU_=&^KAa>W?@*yUT>q->L7C3x?ZknkfUAG}EXKW9OYk$AJ(*TFH9aq$L9vA zF24=qpZ1_|ejE>&sz}gHRW*agn|XsKXVx|&+l&YEQG_6r*q6S^?`x5q^(*H6aiH|$;;RBWDoD_jWr z4MC=&vM%^xMthg0!@DLjnuk@%6OnwFxFum4L+p^_Yw#P8WQV;u=bw(vUfW{CK@+=* z9JM5fW7S4{O1cY#;_Wq*ubU3)oi8=YhXB>(4^5mQ6kM16X=52E-r3WK3IPhTuUDJ_ zU`%QmTUQ2pNEPnJfFgYL90|?<67OBUV z=%SYn8XL{KDBAI;j|T4imj~`WBueNB{dLF?@F)%2)E2pp9xH@Xq7lmmrbr6LYC?@E z|8J4F5r{?wT-nZryA@Yfkp+^VAHSbGSeK1!Jr#lSlP^=Dp*@s^%p~Z3rzDSCPBz|5 zVi7TM-e%C!hk)f#ru}0LUoy@aonJ(G7Kdw9uuGB6@Hd-%{;`i=aO$rX9_hDZhGqyS zTE_?~}92lt`QYc&Ap(|&*f;LCfj5gFmk*uk? z=4597+VmxMFHdK?n$_Aq;X}kLAL?-c!=?5_4v!+qjz1Wb6IE38NI3S~)5P);ddjWd zJ>qdrYEOiPq-68`K%WY9fRYL&#U zxdDz{apX27*(TkwffvcoxO6}Ii$pxZ!u@LvN&>Yn zCDVJL%ITRfUlqsl=EnS8K)%lbN1ixLNdmFFG64HimG#9&_u_SC3$bVp4d|Fzi!eYF z`KEwS9?Qlj6fX#?hN|OAyj60P2tEnHp+%FCd)lAVW>Yd1Mq;+OCZ?11- Date: Fri, 25 Feb 2022 18:07:35 +0100 Subject: [PATCH 009/174] Minor changes --- apps/widtmr/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9216a7b05..9f3d96d9b 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -40,4 +40,4 @@ WIDGETS["widtmr"].decreaseTimer(5); # Creator [David Peer](https://github.com/peerdavid) - forked from [Purple-Tentacle](https://github.com/Purple-Tentacle) + forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) From 6bce7594dce96a074af47a345d935b48be2644f4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:13:01 +0100 Subject: [PATCH 010/174] Updated icons. --- apps/widtmr/README.md | 4 ++++ apps/widtmr/app-icon.js | 2 +- apps/widtmr/app.png | Bin 1060 -> 1153 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9f3d96d9b..e81cac3d5 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -41,3 +41,7 @@ WIDGETS["widtmr"].decreaseTimer(5); [David Peer](https://github.com/peerdavid) forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) + + +# Thanks to... +Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/app-icon.js b/apps/widtmr/app-icon.js index db2010218..48f91a33b 100644 --- a/apps/widtmr/app-icon.js +++ b/apps/widtmr/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwMB/AIDj4FL/+H///+ICBx4FuGoXhAQPHAQPDAQmDBwkHAQPw//+h4FB/F//hYB//8n4HBAoIPBCYIACg4fCGwQrCGAQ3CAAPjIYQFCJ4QAB4QREwwdEglhAgX+hkwAoX8jEYIIX4sEMJoXw4EGLIXhwEDMoXDgEBOIXGXwNDAoOEAoMhAoOMAoMxAsrFK/AQBAAMfApY")) \ No newline at end of file diff --git a/apps/widtmr/app.png b/apps/widtmr/app.png index 5ac7a480c5d4533c9851ba6264b74aae48035eb0..04ed03751e6b271309a236bd123fa68ad8acfdba 100644 GIT binary patch delta 1132 zcmV-y1e5!u2!RQZB!2{RLP=Bz2nYy#2xN!=00cNmL_t(&f$iB_h*f122k_sSMjbN} zt>|v1Nl*`YA%hGeiR?xsm{1Qv7l?ca%BTp!mx>~=pvWG2=!Os#K@VLlNDM+`j3iM@ z4TUTdgh_8U*MGnG5L2okdn`=AQXG($dmHXI zxQaFho!R)D{F_=#KF3(xi_IdO>KTEjF!2OqJF>A`vvK{x8Ov~Hi})6zh8wY73a2i- z>e$KGE>`c4?EiKAipPZh9~R8R_mVfeu%dua4G&?TWbjTbGH~-c<*4Cuyf0on`bAPM zZu;L1*nc8bu#LFZ2vP!*MLEp9`?<6V?RZWqmFsX_RS&Mp1N%kj^kly;71DqRk*UI< zK71*1rxH}TggsJ|pq3qX2;%wmy!2Mq@u0yj76hA#!63Zo}+~o?8hn zz#C#O$aCNU%oK8CK5i0Sjy%cN;;P{w+l-l5C4Wfe8`?@CxnCDywHlYkCh zY>cNIHL(Y*lf2$75_uY)#^2fX!+2Me+h?TSPhH56C5rn~Ekhgb6qO`T$hz2tr{YNi zH>`df6cTxg$dz3U_x6g_IVDDP;9=~MbkOg3LP+2h8QFYiZtgIz#w?K+n2$BEF`FL`&n@Z>Cfru_GW zJoXo6V^>Kl(JS5wF0R^u*&=T1qOyFIU0Wb@O-`WfQ5VU)MC8Rvsq@^6cW_>n1}trO zc&7-NMM6=Y%$JwH@RCUW`D!j# zqB5105@$7>?-B`pj%qwK0r%isd@Z$7rkCM2QuO#3p;`}0LT{`R4jL&23>l*a3^z`D z1BNP~4hu=qT@jBi(Q_R%hHAieydZQ-6{U0!e!(?^9e6AQ+C*K>L#(lPbGGQfb!BEp zRhVdCXRkx3)4W}?PeHrA$a^!y+tj><`{N{IdxTzT1=^+hf5gDB+JFb~^NA)|ESB_S yB|_E5e%#kgwx|mIAT)brUq>oH9X~1v+5Z7%-K2onB!mS30000m;x<_9I=$uURJ1ZseBV6R)F#Xg92C;;k!X6tX2rp*iB9q=U=45y zm<6tfq%{NOz;R#zF~J#TM22egDKJPw=zW_$>jHUpdnVmAI3OLSh6 zXa!Os2$%L1*ngAHB%;817Xc~M^LhX^4r0JkU>WL;)mh*5=jecQK%q+#CN z1Wcf2iXx5Q7Rw}xfHq(_3+JFsq&Xup0P= zv**2v2Y76mSHyr(5i^CF1dP!qh^B#RLyj-NXG5ROILE|ULk>3JoW42@Im&FlWrn_o zMC>_Wy$Qi7L6E?F^V4YaZ#49c0I!6G6DH0dg>##s0Dumge}@l$Ie|>zu@iR)#}xWS zDi^wK9Dm(D{ELA}p`}SS(q*($T;D(yT&Aeb^4TkX0yo9~nq?zh0`=nhfsf#oWIp$e zz(yZDL*iO$)8aLmx2?`FXcelm)K#0hjgA`{1jn!!Cs`@R+?zXa4X5}&cEyk@F8q^T zoMwen)G(-9sq9IB4MoD=F&1@WAZ-{#!fl@&bbk--(56e^hqzvD804PIcY}spvhJGp z;v`o<(?MK={xM1d>kPT%AWp~zx;ro;uD2Qn9RX@lgZaB-JYLjIId5ATIc`f4ywWzho9=q2M(JGwtc>;BMkT1k>Zt9bm z*JJb8C&<#MqYvMNE{Fq9HSt=566?-GM=@XE+)#_N=hLWj(!eMLZfnS=QKtt%W~T^n z80Rye25#~9XfZHK(I=5c)lTiGg~uz3QGfHioGR_&OGDB=k3!s!*C&C?z(LfC8At6U zqSogI>$?G*E3ABMLhE@Q+R$$qgIbah2CP@aQ9TvbE2duZGqdGH1?t3X!lPJO+w@o* zz7fh#UQk6=J+KSdj@s0eqh2wAnq?+{x2V^x_ffA|e+3Qv8;y4S&y5Yu=l}o!00>D% JPDHLkV1fs`=HmbW From 217acc89aa61f0525bf1333d35b5f6a84cee8a78 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:23:22 +0100 Subject: [PATCH 011/174] New icon --- apps/widtmr/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/app-icon.js b/apps/widtmr/app-icon.js index 48f91a33b..bc4261459 100644 --- a/apps/widtmr/app-icon.js +++ b/apps/widtmr/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/AIDj4FL/+H///+ICBx4FuGoXhAQPHAQPDAQmDBwkHAQPw//+h4FB/F//hYB//8n4HBAoIPBCYIACg4fCGwQrCGAQ3CAAPjIYQFCJ4QAB4QREwwdEglhAgX+hkwAoX8jEYIIX4sEMJoXw4EGLIXhwEDMoXDgEBOIXGXwNDAoOEAoMhAoOMAoMxAsrFK/AQBAAMfApY")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwMAg//AAXgApcAvAZBhwCBuAFuGoUeAQM4AQM8AQl8Bwn4AQMPgEB+AFBg+AgZYBgED4AHBAoIPBCYIAC/AfCGwQrCGAQ3CAAMcIYQFCJ4QABnoREvIdE/eeAgUB+fPAoUD8/nIIUHz/zJoUPn/5LIUev/8MoU8//+OIU5XwO8AoN7AoPeAoNzAoPOAsrFKg4QBAAPgApYA==")) \ No newline at end of file From 2cc953e2b399f81f796ec3c9afbf869ba13cbfcd Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:58:35 +0100 Subject: [PATCH 012/174] Updated readme --- apps/widtmr/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index e81cac3d5..9e640c618 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -15,7 +15,7 @@ started / stopped. ![](description.png) -# Lib +# Library for other Apps Different functions are exposed to integrate a timer into your own app. @@ -28,20 +28,25 @@ The following functions are available: Example to increase the timer by 5 and ensure that its started: ```Javascript +Bangle.loadWidgets(); +... WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); ``` Example to decrease the timer. This also disables the timer if time <= 0.: ```Javascript +Bangle.loadWidgets(); +... WIDGETS["widtmr"].decreaseTimer(5); ``` # Creator [David Peer](https://github.com/peerdavid) - forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) # Thanks to... -Time icon created by CreativeCons - Flaticon \ No newline at end of file +Forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) + +Time icon created by CreativeCons - Flaticon \ No newline at end of file From 9daf898f1f310599256cc60b132009e47a73ea94 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:14:57 +0100 Subject: [PATCH 013/174] Show ceil of remaining minutes which is much easier to read. --- apps/widtmr/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 127217364..3b7cfb25e 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -129,7 +129,7 @@ var now = new Date(); var diff = settings.goal - now; - return Math.floor(diff / (1000*60)); + return Math.ceil(diff / (1000*60)); } }; From c6c86213d19560619c423f1277d22391a43c3ca5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:17:46 +0100 Subject: [PATCH 014/174] Add function to get the time rather than minutes only --- apps/widtmr/README.md | 1 + apps/widtmr/widget.js | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9e640c618..7edaffb10 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -25,6 +25,7 @@ The following functions are available: - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int +- getRemainingTime() -> DateTime Example to increase the timer by 5 and ensure that its started: ```Javascript diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 3b7cfb25e..b83b4a204 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -130,6 +130,15 @@ var now = new Date(); var diff = settings.goal - now; return Math.ceil(diff / (1000*60)); + + }, getRemainingTime: function(){ + if(!settings.started){ + return; + } + + var now = new Date(); + var diff = settings.goal - now; + return getTime(diff); } }; From ef31fd4f01cd72b14e2630b1d675329d4ced3831 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:24:42 +0100 Subject: [PATCH 015/174] Added more functions to get the time, time str or remaining minutes. --- apps/widtmr/README.md | 1 + apps/widtmr/widget.js | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 7edaffb10..bd795d20f 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -26,6 +26,7 @@ The following functions are available: - decreaseTimer(int) -> void - getRemainingMinutes() -> int - getRemainingTime() -> DateTime +- getRemainingTimeStr() -> str Example to increase the timer by 5 and ensure that its started: ```Javascript diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index b83b4a204..8dcc5ec41 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -131,16 +131,30 @@ var diff = settings.goal - now; return Math.ceil(diff / (1000*60)); - }, getRemainingTime: function(){ + }, getRemainingTimeStr: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; if(!settings.started){ return; } var now = new Date(); var diff = settings.goal - now; - return getTime(diff); - } + var timeStr = getTime(diff); + if(diff < 3600000){ + timeStr = timeStr.substring(3); // remove hour part 00:00:00 -> 00:00 + } + return timeStr; + }, getRemainingTime: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + if(!settings.started){ + return; + } + + var now = new Date(); + var diff = settings.goal - now; + return diff; + } }; // set width correctly, start countdown each second From 777943e0315c1fa2e176bbcb24402d9d85d1629c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:36:29 +0100 Subject: [PATCH 016/174] For watch faces we want to start at 0 rather than the last value that was set... --- apps/lcars/lcars.app.js | 5 +++++ apps/notanalog/notanalog.app.js | 4 ++++ apps/widtmr/README.md | 21 ++++++++++++++++----- apps/widtmr/widget.js | 7 ++++++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 13c163e26..958ab7388 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,6 +567,11 @@ function getAlarmMinutes(){ } function increaseAlarm(){ + // Set to zero if alarm was disabled before + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); } diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index be9a01fa7..6bd725f58 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -396,6 +396,10 @@ function getAlarmMinutes(){ } function increaseAlarm(){ + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); } diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index bd795d20f..4bdf20b93 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -22,25 +22,36 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void +- resetTimer() -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int - getRemainingTime() -> DateTime - getRemainingTimeStr() -> str -Example to increase the timer by 5 and ensure that its started: +For example if we want to increase the timer by +5 minutes each time +the touch event is fired: ```Javascript Bangle.loadWidgets(); ... -WIDGETS["widtmr"].increaseTimer(5); -WIDGETS["widtmr"].setStarted(true); +Bangle.on('touch', function(btn, e){ + // Set to zero if alarm was disabled before + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); +}); ``` -Example to decrease the timer. This also disables the timer if time <= 0.: +Example to decrease the timer by 5 and stop if 0 is reached: ```Javascript Bangle.loadWidgets(); ... -WIDGETS["widtmr"].decreaseTimer(5); +Bangle.on('touch', function(btn, e){ + WIDGETS["widtmr"].decreaseTimer(5); +} ``` # Creator diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 8dcc5ec41..751da4ee8 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,6 +121,11 @@ } updateSettings(); + }, resetTimer: function(){ + settings.started=false; + settings.minutes = 0; + updateSettings(); + }, getRemainingMinutes: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; if(!settings.started){ @@ -129,7 +134,7 @@ var now = new Date(); var diff = settings.goal - now; - return Math.ceil(diff / (1000*60)); + return Math.round(diff / (1000*60)); }, getRemainingTimeStr: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; From 3bbbd8831c4c56e326e59b5a999000a6cbce07fe Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:53:38 +0100 Subject: [PATCH 017/174] Updated lcars and notanalog to also work if the widget is not installed. Then this functionality is not provided but the apps are not crashing. Also faster updates of the watch face in timer mode to show the correct time... --- apps/lcars/lcars.app.js | 35 ++++++++++++++++++++++++++++-- apps/notanalog/notanalog.app.js | 38 ++++++++++++++++++++++++++++++--- apps/widtmr/README.md | 6 ++++-- apps/widtmr/widget.js | 6 +++--- 4 files changed, 75 insertions(+), 10 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 958ab7388..848065994 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -124,11 +124,16 @@ Graphics.prototype.setFontAntonioLarge = function(scale) { */ var drawTimeout; function queueDraw() { + + // Faster updates during alarm to ensure that it is + // shown correctly... + var timeout = isAlarmEnabled() ? 10000 : 60000; + if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; draw(); - }, 60000 - (Date.now() % 60000)); + }, timeout - (Date.now() % timeout)); } /** @@ -558,18 +563,40 @@ function getWeather(){ /* * Handle alarm */ +function isWidtmrAvailable(){ + try { + WIDGETS["widtmr"].isStarted(); + return true; + } catch { + // In case the widtmr widget is not installed, the timer can + // not be used... + return false; + } +} + function isAlarmEnabled(){ + if(!isWidtmrAvailable()){ + return false; + } + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ + if(!isWidtmrAvailable()){ + return "-"; + } return WIDGETS["widtmr"].getRemainingMinutes(); } function increaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -577,6 +604,10 @@ function increaseAlarm(){ } function decreaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 6bd725f58..8939a5a75 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -376,28 +376,56 @@ Bangle.on('touch', function(btn, e){ * Some helpers */ function queueDraw() { + + // Faster updates during alarm to ensure that it is + // shown correctly... + var timeout = isAlarmEnabled() ? 10000 : 60000; + if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; - draw(true); - }, 60000 - (Date.now() % 60000)); + draw(); + }, timeout - (Date.now() % timeout)); } /* * Handle alarm */ +function isWidtmrAvailable(){ + try { + WIDGETS["widtmr"].isStarted(); + return true; + } catch { + // In case the widtmr widget is not installed, the timer can + // not be used... + return false; + } +} + function isAlarmEnabled(){ + if(!isWidtmrAvailable()){ + return false; + } + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ + if(!isWidtmrAvailable()){ + return "-"; + } return WIDGETS["widtmr"].getRemainingMinutes(); } function increaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + + // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -405,6 +433,10 @@ function increaseAlarm(){ } function decreaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 4bdf20b93..c4304bd81 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -22,7 +22,7 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void -- resetTimer() -> void +- setTime(t) -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int @@ -37,7 +37,7 @@ Bangle.loadWidgets(); Bangle.on('touch', function(btn, e){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -54,6 +54,8 @@ Bangle.on('touch', function(btn, e){ } ``` +You can find even more examples in the lcars or notanalog app ... + # Creator [David Peer](https://github.com/peerdavid) diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 751da4ee8..c9ef4ffdb 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,9 +121,9 @@ } updateSettings(); - }, resetTimer: function(){ - settings.started=false; - settings.minutes = 0; + }, setTime: function(t){ + settings.minutes = Math.max(0, t); + settings.started = t > 0; updateSettings(); }, getRemainingMinutes: function(){ From 2124c2b0d4f7087d5bb167d546ccdca58db825c9 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 10:00:53 +0100 Subject: [PATCH 018/174] Bugfix --- apps/lcars/lcars.app.js | 2 +- apps/notanalog/notanalog.app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 848065994..9af585ff7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,7 +567,7 @@ function isWidtmrAvailable(){ try { WIDGETS["widtmr"].isStarted(); return true; - } catch { + } catch(e) { // In case the widtmr widget is not installed, the timer can // not be used... return false; diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 8939a5a75..91381fe71 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -396,7 +396,7 @@ function isWidtmrAvailable(){ try { WIDGETS["widtmr"].isStarted(); return true; - } catch { + } catch(e) { // In case the widtmr widget is not installed, the timer can // not be used... return false; From fd3401bd2372e4c522162546708d2dbf938f4927 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 11:05:39 +0100 Subject: [PATCH 019/174] Updated readme --- apps/widtmr/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index c4304bd81..2ffbfc8cf 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -1,10 +1,9 @@ # Timer Widget This is a fork of the Chrono Widget, but implements a -simpler UI which to be able to set a timer faster with -less interaction. Additionally, it exposes some functions -that can be used by other apps or clocks to easily -implement a timer. It is used e.g. by lcars or notanalog. +simpler UI. Additionally, it exposes functions for other +apps or clocks such that they can easily implement a timer. +Currently, it is used by lcars and notanalog. # Overview If you open the app, you can simply control the timer @@ -15,7 +14,7 @@ started / stopped. ![](description.png) -# Library for other Apps +# Lib Different functions are exposed to integrate a timer into your own app. @@ -35,7 +34,8 @@ the touch event is fired: Bangle.loadWidgets(); ... Bangle.on('touch', function(btn, e){ - // Set to zero if alarm was disabled before + // Set to zero if alarm was disabled before. Otherwise + // it starts from the last setting made by the user. if(!isAlarmEnabled()){ WIDGETS["widtmr"].setTime(0); } @@ -54,10 +54,10 @@ Bangle.on('touch', function(btn, e){ } ``` -You can find even more examples in the lcars or notanalog app ... +You can find implementations and usages in the lcars or notanalog app. + # Creator - [David Peer](https://github.com/peerdavid) From 56a4cd0dff87d2e0e34071a813708a560d23e62a Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 11:55:35 +0100 Subject: [PATCH 020/174] Renaming of setTime to setTimer. --- apps/lcars/lcars.app.js | 2 +- apps/notanalog/notanalog.app.js | 2 +- apps/widtmr/README.md | 4 ++-- apps/widtmr/widget.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9af585ff7..6ffc78ca7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -596,7 +596,7 @@ function increaseAlarm(){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 91381fe71..5e56d6f6a 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -425,7 +425,7 @@ function increaseAlarm(){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 2ffbfc8cf..ae8b0945e 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -21,7 +21,7 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void -- setTime(t) -> void +- setTimer(t) -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int @@ -37,7 +37,7 @@ Bangle.on('touch', function(btn, e){ // Set to zero if alarm was disabled before. Otherwise // it starts from the last setting made by the user. if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index c9ef4ffdb..30eb950cf 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,7 +121,7 @@ } updateSettings(); - }, setTime: function(t){ + }, setTimer: function(t){ settings.minutes = Math.max(0, t); settings.started = t > 0; updateSettings(); From bffbe40290eaa0bb1258c9a58c70e647a44b06f3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 12:02:18 +0100 Subject: [PATCH 021/174] Minor changes --- apps/widtmr/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index ae8b0945e..88893ce74 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -15,8 +15,8 @@ started / stopped. # Lib -Different functions are exposed to integrate a timer -into your own app. +Different functions are exposed by widtmr which enables other +apps to directly use and integrate this functionality: The following functions are available: - isStarted() -> boolean From 61c29c1c7ae2c4537434f9507be2cb5c1a8c1924 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 4 Mar 2022 17:35:34 +0100 Subject: [PATCH 022/174] First alarm lib test --- apps/alarm/ChangeLog | 1 + apps/alarm/lib.js | 3 +++ apps/alarm/metadata.json | 5 +++-- apps/widtmr/app.js | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 apps/alarm/lib.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 4576237a5..9442c234e 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,3 +14,4 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system +0.16: Expose functions for other apps \ No newline at end of file diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js new file mode 100644 index 000000000..9dfcca897 --- /dev/null +++ b/apps/alarm/lib.js @@ -0,0 +1,3 @@ +exports.createTimer = function() { + return 0; +} \ No newline at end of file diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index d29298309..bbb6012d9 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.15", + "version": "0.16", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", @@ -12,7 +12,8 @@ {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} + {"name":"alarm.wid.js","url":"widget.js"}, + {"name":"alarm","url":"lib.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/widtmr/app.js b/apps/widtmr/app.js index 5f836d417..2a10b3b5c 100644 --- a/apps/widtmr/app.js +++ b/apps/widtmr/app.js @@ -57,6 +57,9 @@ function draw(){ g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); + + print(require("alarm").createTimer()); + var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); From 29faff8eb8af71808b0ad4c51b8432793e82891f Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 7 Mar 2022 17:07:28 +0100 Subject: [PATCH 023/174] Tests with qalarm --- apps/qalarm/ChangeLog | 1 + apps/qalarm/lib.js | 81 +++++++++++++++++++++++++++++++++++++++ apps/qalarm/metadata.json | 3 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 apps/qalarm/lib.js diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index b9be6039d..850735ddb 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,3 +4,4 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. +0.05: Include library for other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js new file mode 100644 index 000000000..1cb602456 --- /dev/null +++ b/apps/qalarm/lib.js @@ -0,0 +1,81 @@ +Bangle.loadWidgets(); + +let alarms = require("Storage").readJSON("qalarm.json", 1) || []; + +/** + * LIBRARY + */ +function alarmExists(alarmIndex){ + return alarmIndex > 0 && alarmIndex < alarms.length; +} + +function isAlarmStarted(alarmIndex){ + if(!alarmExists(alarmIndex)){ + return false; + } + + let time = new Date(); + let t = getCurrentTime(); + a = alarms[alarmIndex]; + return a.on && + a.t <= t && + a.last != time.getDate() && + (a.timer || a.daysOfWeek[time.getDay()]); +} + +function getAlarmMin(alarmIndex){ + if(!isAlarmStarted(alarmIndex)){ + return 0; + } + + let t = getCurrentTime(); + let a = alarms[alarmIndex] ; + return a.t - t * 60; + } + +function _reload(){ + require("Storage").write("qalarm.json", JSON.stringify(alarms)); + eval(require("Storage").read("qalarmcheck.js")); + if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); +} + +function editTimer(alarmIndex, hrs, mins, secs){ + var a = { + timer: 300, + on: true, + rp: false, + as: false, + hard: false, + }; + a.timer = hrs * 3600 + mins * 60 + secs; + a.t = (getCurrentTime() + alarm.timer * 1000) % 86400000; + + if(alarmExists(a)){ + alarms[alarmIndex] = a; + } else { + alarmIndex = alarms.length; + alarms.push(a) + } + + _reload(); + return alarmIndex; +} + + +function deleteAlarm(alarmIndex){ + if(!alarmExists(alarmIndex)){ + return; + } + + alarms.splice(alarmIndex, 1); + + _reload(); +} + + +// Export functions +exports.alarmExists = alarmExists; +exports.isAlarmStarted = isAlarmStarted; +exports.getAlarmMin = getAlarmMin; +exports.editTimer = editTimer; +exports.deleteAlarm = deleteAlarm; \ No newline at end of file diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 326ba33a7..1ab4f4192 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -3,11 +3,12 @@ "name": "Q Alarm and Timer", "shortName": "Q Alarm", "icon": "app.png", - "version": "0.04", + "version": "0.05", "description": "Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ + { "name": "qalarm", "url": "lib.js" }, { "name": "qalarm.app.js", "url": "app.js" }, { "name": "qalarm.boot.js", "url": "boot.js" }, { "name": "qalarm.js", "url": "qalarm.js" }, From 630ea1a21c020114a531033eb39abcb29b1aa9be Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:03:23 +0100 Subject: [PATCH 024/174] Added library to qalarm and created a simple timer app which is an alternative UI. --- apps/alarm/ChangeLog | 1 - apps/alarm/lib.js | 3 - apps/alarm/metadata.json | 5 +- apps/alarm/widget.js | 8 +- apps/qalarm/ChangeLog | 2 +- apps/qalarm/lib.js | 41 ++++-- apps/{widtmr => smpltmr}/ChangeLog | 0 apps/smpltmr/README.md | 21 +++ apps/{widtmr => smpltmr}/app-icon.js | 0 apps/{widtmr => smpltmr}/app.js | 74 ++++++---- apps/{widtmr => smpltmr}/app.png | Bin apps/{widtmr => smpltmr}/description.png | Bin apps/smpltmr/metadata.json | 17 +++ apps/{widtmr => smpltmr}/screenshot.png | Bin apps/{widtmr => smpltmr}/screenshot_2.png | Bin apps/widtmr/README.md | 67 --------- apps/widtmr/metadata.json | 17 --- apps/widtmr/widget.js | 167 ---------------------- 18 files changed, 116 insertions(+), 307 deletions(-) delete mode 100644 apps/alarm/lib.js rename apps/{widtmr => smpltmr}/ChangeLog (100%) create mode 100644 apps/smpltmr/README.md rename apps/{widtmr => smpltmr}/app-icon.js (100%) rename apps/{widtmr => smpltmr}/app.js (55%) rename apps/{widtmr => smpltmr}/app.png (100%) rename apps/{widtmr => smpltmr}/description.png (100%) create mode 100644 apps/smpltmr/metadata.json rename apps/{widtmr => smpltmr}/screenshot.png (100%) rename apps/{widtmr => smpltmr}/screenshot_2.png (100%) delete mode 100644 apps/widtmr/README.md delete mode 100644 apps/widtmr/metadata.json delete mode 100644 apps/widtmr/widget.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 9442c234e..4576237a5 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,4 +14,3 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system -0.16: Expose functions for other apps \ No newline at end of file diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js deleted file mode 100644 index 9dfcca897..000000000 --- a/apps/alarm/lib.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.createTimer = function() { - return 0; -} \ No newline at end of file diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index bbb6012d9..d29298309 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.16", + "version": "0.15", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", @@ -12,8 +12,7 @@ {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"}, - {"name":"alarm","url":"lib.js"} + {"name":"alarm.wid.js","url":"widget.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/alarm/widget.js b/apps/alarm/widget.js index e8bb79fc7..e1dec5ea2 100644 --- a/apps/alarm/widget.js +++ b/apps/alarm/widget.js @@ -1,7 +1,7 @@ WIDGETS["alarm"]={area:"tl",width:0,draw:function() { - if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); - },reload:function() { - WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; - } + if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); +},reload:function() { + WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; +} }; WIDGETS["alarm"].reload(); diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index 850735ddb..424571439 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,4 +4,4 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. -0.05: Include library for other apps. \ No newline at end of file +0.05: Include library that can be used by other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 1cb602456..670ee99ae 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -5,8 +5,19 @@ let alarms = require("Storage").readJSON("qalarm.json", 1) || []; /** * LIBRARY */ + +function getCurrentTime() { + let time = new Date(); + return ( + time.getHours() * 3600000 + + time.getMinutes() * 60000 + + time.getSeconds() * 1000 + ); +} + function alarmExists(alarmIndex){ - return alarmIndex > 0 && alarmIndex < alarms.length; + var exists = alarmIndex >= 0 && alarmIndex < alarms.length; + return exists; } function isAlarmStarted(alarmIndex){ @@ -18,20 +29,23 @@ function isAlarmStarted(alarmIndex){ let t = getCurrentTime(); a = alarms[alarmIndex]; return a.on && - a.t <= t && + t <= a.t && a.last != time.getDate() && (a.timer || a.daysOfWeek[time.getDay()]); } -function getAlarmMin(alarmIndex){ +function getTimerMin(alarmIndex){ if(!isAlarmStarted(alarmIndex)){ return 0; } - let t = getCurrentTime(); let a = alarms[alarmIndex] ; - return a.t - t * 60; - } + let diff = a.t - getCurrentTime(); + // let hrs = Math.floor(t / 3600000); + let mins = Math.round((diff / 60000) % 60); + // return hrs + ":" + ("0" + mins).substr(-2); + return mins; +} function _reload(){ require("Storage").write("qalarm.json", JSON.stringify(alarms)); @@ -41,34 +55,31 @@ function _reload(){ function editTimer(alarmIndex, hrs, mins, secs){ var a = { - timer: 300, on: true, rp: false, as: false, hard: false, }; a.timer = hrs * 3600 + mins * 60 + secs; - a.t = (getCurrentTime() + alarm.timer * 1000) % 86400000; + a.t = (getCurrentTime() + a.timer * 1000) % 86400000; if(alarmExists(a)){ alarms[alarmIndex] = a; } else { - alarmIndex = alarms.length; alarms.push(a) + alarmIndex = alarms.length-1; } _reload(); return alarmIndex; } - function deleteAlarm(alarmIndex){ if(!alarmExists(alarmIndex)){ return; } alarms.splice(alarmIndex, 1); - _reload(); } @@ -76,6 +87,10 @@ function deleteAlarm(alarmIndex){ // Export functions exports.alarmExists = alarmExists; exports.isAlarmStarted = isAlarmStarted; -exports.getAlarmMin = getAlarmMin; +exports.deleteAlarm = deleteAlarm; + +exports.timerExists = alarmExists; +exports.isTimerStarted = isAlarmStarted; +exports.getTimerMin = getTimerMin; exports.editTimer = editTimer; -exports.deleteAlarm = deleteAlarm; \ No newline at end of file +exports.deleteTimer = deleteAlarm; diff --git a/apps/widtmr/ChangeLog b/apps/smpltmr/ChangeLog similarity index 100% rename from apps/widtmr/ChangeLog rename to apps/smpltmr/ChangeLog diff --git a/apps/smpltmr/README.md b/apps/smpltmr/README.md new file mode 100644 index 000000000..1296166e2 --- /dev/null +++ b/apps/smpltmr/README.md @@ -0,0 +1,21 @@ +# Simple Timer + +A simple app to set a timer quickly. Simply tab on top/bottom/left/right +to select the minutes and tab in the middle of the screen to start/stop +the timer. Note that this timer depends on qalarm. + +# Overview +If you open the app, you can simply control the timer +by clicking on top, bottom, left or right of the screen. +If you tab at the middle of the screen, the timer is +started / stopped. + +![](description.png) + + +# Creator +[David Peer](https://github.com/peerdavid) + + +# Thanks to... +Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/app-icon.js b/apps/smpltmr/app-icon.js similarity index 100% rename from apps/widtmr/app-icon.js rename to apps/smpltmr/app-icon.js diff --git a/apps/widtmr/app.js b/apps/smpltmr/app.js similarity index 55% rename from apps/widtmr/app.js rename to apps/smpltmr/app.js index 2a10b3b5c..1de9057e8 100644 --- a/apps/widtmr/app.js +++ b/apps/smpltmr/app.js @@ -15,32 +15,26 @@ Bangle.loadWidgets(); const storage = require('Storage'); +const alarm = require('qalarm'); + let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); const cy = parseInt(screenHeight/2)-12; +var minutes = 5; +var interval; //used for the 1 second interval timer function updateSettings() { - var now = new Date(); - const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); - settings.goal = goal.getTime(); storage.writeJSON('widtmr.json', settings); - if (WIDGETS["widtmr"]) WIDGETS["widtmr"].reload(); } function resetSettings() { settings = { - hours : 0, - minutes : 0, - seconds : 0, - started : false, - counter : 0, - goal : 0, + alarmIndex: -1 }; updateSettings(); } @@ -55,15 +49,25 @@ function draw(){ g.clear(1); Bangle.drawWidgets(); + if (interval) { + clearInterval(interval); + } + interval = undefined; + + // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); + var started = alarm.isTimerStarted(settings.alarmIndex); + var text = minutes + " min."; + if(started){ + var min = alarm.getTimerMin(settings.alarmIndex); + text = min + " min."; + } - print(require("alarm").createTimer()); - - var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); - if(settings.started){ + if(started){ + interval = setInterval(draw, 1000); g.setColor("#ff0000"); } else { g.setColor(g.theme.fg); @@ -74,6 +78,7 @@ function draw(){ g.drawString(text, cx, cy); } + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.25); var right = g.getWidth() - left; @@ -84,27 +89,34 @@ Bangle.on('touch', function(btn, e){ var isRight = e.x > right; var isUpper = e.y < upper; var isLower = e.y > lower; + var isMiddle = !isLeft && !isRight && !isUpper && !isLower; + print(settings.alarmIndex); + var started = alarm.isTimerStarted(settings.alarmIndex); - if(isRight){ - settings.minutes += 1; + if(isRight && !started){ + minutes += 1; Bangle.buzz(40, 0.3); - } else if(isLeft){ - settings.minutes -= 1; + } else if(isLeft && !started){ + minutes -= 1; Bangle.buzz(40, 0.3); - } else if(isUpper){ - settings.minutes += 5; + } else if(isUpper && !started){ + minutes += 5; Bangle.buzz(40, 0.3); - } else if(isLower){ - settings.minutes -= 5; + } else if(isLower && !started){ + minutes -= 5; Bangle.buzz(40, 0.3); - } else { - settings.started = !settings.started; - Bangle.buzz(120, 0.6); - } - - if(settings.minutes <= 0){ - settings.minutes = 0; - settings.started = false; + } else if(isMiddle) { + if(!started){ + settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); + print("-----") + print(settings.alarmIndex); + print(alarm.timerExists(settings.alarmIndex)) + print(alarm.isTimerStarted(settings.alarmIndex)) + print("-----") + } else { + alarm.deleteTimer(settings.alarmIndex); + } + Bangle.buzz(80, 0.6); } updateSettings(); diff --git a/apps/widtmr/app.png b/apps/smpltmr/app.png similarity index 100% rename from apps/widtmr/app.png rename to apps/smpltmr/app.png diff --git a/apps/widtmr/description.png b/apps/smpltmr/description.png similarity index 100% rename from apps/widtmr/description.png rename to apps/smpltmr/description.png diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json new file mode 100644 index 000000000..4f0d473b4 --- /dev/null +++ b/apps/smpltmr/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "smpltmr", + "name": "Simple Timer", + "shortName": "Simple Timer", + "version": "0.01", + "description": "A simple app to set a timer.", + "icon": "app.png", + "tags": "tool", + "dependencies": {"qalarm":"app"}, + "supports": ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], + "readme": "README.md", + "storage": [ + {"name":"smpltmr.app.js","url":"app.js"}, + {"name":"smpltmr.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/widtmr/screenshot.png b/apps/smpltmr/screenshot.png similarity index 100% rename from apps/widtmr/screenshot.png rename to apps/smpltmr/screenshot.png diff --git a/apps/widtmr/screenshot_2.png b/apps/smpltmr/screenshot_2.png similarity index 100% rename from apps/widtmr/screenshot_2.png rename to apps/smpltmr/screenshot_2.png diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md deleted file mode 100644 index 88893ce74..000000000 --- a/apps/widtmr/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Timer Widget - -This is a fork of the Chrono Widget, but implements a -simpler UI. Additionally, it exposes functions for other -apps or clocks such that they can easily implement a timer. -Currently, it is used by lcars and notanalog. - -# Overview -If you open the app, you can simply control the timer -by clicking on top, bottom, left or right of the screen. -If you tab at the middle of the screen, the timer is -started / stopped. - -![](description.png) - - -# Lib -Different functions are exposed by widtmr which enables other -apps to directly use and integrate this functionality: - -The following functions are available: -- isStarted() -> boolean -- setStarted(boolean) -> void -- setTimer(t) -> void -- increaseTimer(int) -> void -- decreaseTimer(int) -> void -- getRemainingMinutes() -> int -- getRemainingTime() -> DateTime -- getRemainingTimeStr() -> str - -For example if we want to increase the timer by +5 minutes each time -the touch event is fired: -```Javascript -Bangle.loadWidgets(); -... -Bangle.on('touch', function(btn, e){ - // Set to zero if alarm was disabled before. Otherwise - // it starts from the last setting made by the user. - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); -}); -``` - -Example to decrease the timer by 5 and stop if 0 is reached: -```Javascript -Bangle.loadWidgets(); -... -Bangle.on('touch', function(btn, e){ - WIDGETS["widtmr"].decreaseTimer(5); -} -``` - -You can find implementations and usages in the lcars or notanalog app. - - -# Creator -[David Peer](https://github.com/peerdavid) - - -# Thanks to... -Forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) - -Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json deleted file mode 100644 index a30aea4c3..000000000 --- a/apps/widtmr/metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "widtmr", - "name": "Timer Widget", - "shortName": "Timer Widget", - "version": "0.01", - "description": "Fork from Chrono Widget with a simpler UI and a lib for other apps.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], - "readme": "README.md", - "storage": [ - {"name":"widtmr.wid.js","url":"widget.js"}, - {"name":"widtmr.app.js","url":"app.js"}, - {"name":"widtmr.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js deleted file mode 100644 index 30eb950cf..000000000 --- a/apps/widtmr/widget.js +++ /dev/null @@ -1,167 +0,0 @@ -(() => { - let storage = require('Storage'); - - var settings; - var interval = 0; //used for the 1 second interval timer - var diff; - - - //Convert ms to time - function getTime(t) { - var milliseconds = parseInt((t % 1000) / 100), - seconds = Math.floor((t / 1000) % 60), - minutes = Math.floor((t / (1000 * 60)) % 60), - hours = Math.floor((t / (1000 * 60 * 60)) % 24); - return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); - } - - - //counts down, calculates and displays - function countDown() { - var now = new Date(); - diff = settings.goal - now; //calculate difference - // time is up - if (settings.started && diff < 1000) { - Bangle.buzz(1500); - //write timer off to file - settings.started = false; - storage.writeJSON('widtmr.json', settings); - clearInterval(interval); //stop interval - interval = undefined; - } - // calculates width and redraws accordingly - WIDGETS["widtmr"].redraw(); - } - - - function updateSettings(){ - var now = new Date(); - const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); - settings.goal = goal.getTime(); - - settings.goal = goal.getTime(); - storage.writeJSON('widtmr.json', settings); - WIDGETS["widtmr"].reload(); - } - - - /* - * Add the widgets and functions for other apps - */ - WIDGETS["widtmr"]={area:"tl",width:0,draw:function() { - if (!this.width) { - return; - } - - g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); - - var scale; - var timeStr; - if (diff < 3600000) { //less than 1 hour left - width = 58; - scale = 2; - timeStr = getTime(diff).substring(3); // remove hour part 00:00:00 -> 00:00 - } else { //one hour or more left - width = 48; - scale = 1; - timeStr = getTime(diff); //display hour 00:00:00 but small - } - - // Font5x9Numeric7Seg - just build this in as it's tiny - g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); - g.drawString(timeStr, this.x+this.width/2, this.y+12); - - }, redraw:function() { - var last = this.width; - if (!settings.started) { - this.width = 0; - } else { - this.width = (diff < 3600000) ? 58 : 48; - } - - if (last != this.width) { - Bangle.drawWidgets(); - } else { - this.draw(); - } - - }, reload:function() { - settings = storage.readJSON("widtmr.json",1)||{}; - if (interval) { - clearInterval(interval); - } - interval = undefined; - - // start countdown each second - if (settings.started) { - interval = setInterval(countDown, 1000); - } - - // reset everything - countDown(); - - }, isStarted: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - return settings.started; - - }, setStarted: function(started){ - settings.started=started; - updateSettings(); - - }, increaseTimer: function(m){ - settings.minutes += m; - updateSettings(); - - }, decreaseTimer: function(m){ - settings.minutes -= m; - if(settings.minutes <= 0){ - settings.started=false; - settings.minutes=0; - } - updateSettings(); - - }, setTimer: function(t){ - settings.minutes = Math.max(0, t); - settings.started = t > 0; - updateSettings(); - - }, getRemainingMinutes: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return -1; - } - - var now = new Date(); - var diff = settings.goal - now; - return Math.round(diff / (1000*60)); - - }, getRemainingTimeStr: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return; - } - - var now = new Date(); - var diff = settings.goal - now; - var timeStr = getTime(diff); - if(diff < 3600000){ - timeStr = timeStr.substring(3); // remove hour part 00:00:00 -> 00:00 - } - return timeStr; - - }, getRemainingTime: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return; - } - - var now = new Date(); - var diff = settings.goal - now; - return diff; - } -}; - - // set width correctly, start countdown each second - WIDGETS["widtmr"].reload(); -})(); From 8d2e3b81800fc89db35996b043c5dc3ca90b3cfc Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:12:35 +0100 Subject: [PATCH 025/174] Removed print statements --- apps/qalarm/lib.js | 6 +++--- apps/smpltmr/app.js | 14 +------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 670ee99ae..189041a02 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -47,7 +47,7 @@ function getTimerMin(alarmIndex){ return mins; } -function _reload(){ +function reloadQalarm(){ require("Storage").write("qalarm.json", JSON.stringify(alarms)); eval(require("Storage").read("qalarmcheck.js")); if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); @@ -70,7 +70,7 @@ function editTimer(alarmIndex, hrs, mins, secs){ alarmIndex = alarms.length-1; } - _reload(); + reloadQalarm(); return alarmIndex; } @@ -80,7 +80,7 @@ function deleteAlarm(alarmIndex){ } alarms.splice(alarmIndex, 1); - _reload(); + reloadQalarm(); } diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index 1de9057e8..caa3e5cae 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -1,11 +1,5 @@ /* - * TIMER WIDGET - * - * This is a fork of the Chrono Widget, but implements a - * simpler UI which to be able to set a timer faster with - * less interaction. Additionally, it exposes some functions - * that can be used by other apps or clocks to easily - * implement a timer. It is used e.g. by lcars or notanalog. + * SIMPLE TIMER * * Creator: David Peer * Date: 02/2022 @@ -90,7 +84,6 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - print(settings.alarmIndex); var started = alarm.isTimerStarted(settings.alarmIndex); if(isRight && !started){ @@ -108,11 +101,6 @@ Bangle.on('touch', function(btn, e){ } else if(isMiddle) { if(!started){ settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); - print("-----") - print(settings.alarmIndex); - print(alarm.timerExists(settings.alarmIndex)) - print(alarm.isTimerStarted(settings.alarmIndex)) - print("-----") } else { alarm.deleteTimer(settings.alarmIndex); } From 49053e61214af5956ae85c13f11345c605ab1436 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:28:49 +0100 Subject: [PATCH 026/174] Include id such that the timer can precisely be selected by each app. --- apps/qalarm/lib.js | 48 ++++++++++++++++++++++++-------------- apps/qalarm/qalarmcheck.js | 1 - apps/smpltmr/app.js | 32 +++++-------------------- 3 files changed, 37 insertions(+), 44 deletions(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 189041a02..8c4be311f 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -15,18 +15,29 @@ function getCurrentTime() { ); } -function alarmExists(alarmIndex){ +function getAlarmIndex(idx){ + for(var i=0; i= 0 && alarmIndex < alarms.length; return exists; } -function isAlarmStarted(alarmIndex){ - if(!alarmExists(alarmIndex)){ +function isAlarmStarted(idx){ + if(!alarmExists(idx)){ return false; } - let time = new Date(); - let t = getCurrentTime(); + var alarmIndex = getAlarmIndex(idx); + var time = new Date(); + var t = getCurrentTime(); a = alarms[alarmIndex]; return a.on && t <= a.t && @@ -34,15 +45,16 @@ function isAlarmStarted(alarmIndex){ (a.timer || a.daysOfWeek[time.getDay()]); } -function getTimerMin(alarmIndex){ - if(!isAlarmStarted(alarmIndex)){ +function getTimerMin(idx){ + if(!isAlarmStarted(idx)){ return 0; } - let a = alarms[alarmIndex] ; - let diff = a.t - getCurrentTime(); + var alarmIndex = getAlarmIndex(idx); + var a = alarms[alarmIndex] ; + var diff = a.t - getCurrentTime(); // let hrs = Math.floor(t / 3600000); - let mins = Math.round((diff / 60000) % 60); + var mins = Math.round((diff / 60000) % 60); // return hrs + ":" + ("0" + mins).substr(-2); return mins; } @@ -53,12 +65,14 @@ function reloadQalarm(){ if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); } -function editTimer(alarmIndex, hrs, mins, secs){ +function editTimer(idx, hrs, mins, secs){ + var alarmIndex = getAlarmIndex(idx); var a = { - on: true, - rp: false, - as: false, - hard: false, + idx: idx, + on: true, + rp: false, + as: false, + hard: false, }; a.timer = hrs * 3600 + mins * 60 + secs; a.t = (getCurrentTime() + a.timer * 1000) % 86400000; @@ -71,10 +85,10 @@ function editTimer(alarmIndex, hrs, mins, secs){ } reloadQalarm(); - return alarmIndex; } -function deleteAlarm(alarmIndex){ +function deleteAlarm(idx){ + var alarmIndex = getAlarmIndex(idx); if(!alarmExists(alarmIndex)){ return; } diff --git a/apps/qalarm/qalarmcheck.js b/apps/qalarm/qalarmcheck.js index 8dac43800..4976afb6f 100644 --- a/apps/qalarm/qalarmcheck.js +++ b/apps/qalarm/qalarmcheck.js @@ -2,7 +2,6 @@ * This file checks for upcoming alarms and schedules qalarm.js to deal with them and itself to continue doing these checks. */ -print("Checking for alarms..."); if (Bangle.QALARM) { clearInterval(Bangle.QALARM); diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index caa3e5cae..e1bb49c78 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,11 +8,9 @@ Bangle.loadWidgets(); -const storage = require('Storage'); const alarm = require('qalarm'); -let settings; - +const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); @@ -21,23 +19,6 @@ var minutes = 5; var interval; //used for the 1 second interval timer -function updateSettings() { - storage.writeJSON('widtmr.json', settings); -} - - -function resetSettings() { - settings = { - alarmIndex: -1 - }; - updateSettings(); -} - - -settings = storage.readJSON('widtmr.json',1); -if (!settings) resetSettings(); - - setWatch(_=>load(), BTN1); function draw(){ g.clear(1); @@ -51,10 +32,10 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = alarm.isTimerStarted(settings.alarmIndex); + var started = alarm.isTimerStarted(TIMER_IDX); var text = minutes + " min."; if(started){ - var min = alarm.getTimerMin(settings.alarmIndex); + var min = alarm.getTimerMin(TIMER_IDX); text = min + " min."; } @@ -84,7 +65,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = alarm.isTimerStarted(settings.alarmIndex); + var started = alarm.isTimerStarted(TIMER_IDX); if(isRight && !started){ minutes += 1; @@ -100,14 +81,13 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); + alarm.editTimer(TIMER_IDX, 0, minutes, 0); } else { - alarm.deleteTimer(settings.alarmIndex); + alarm.deleteTimer(TIMER_IDX); } Bangle.buzz(80, 0.6); } - updateSettings(); draw(); }); From 06293ad9c0847768234462eeeaef8a4323332995 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:32:09 +0100 Subject: [PATCH 027/174] Fixed delete. --- apps/qalarm/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 8c4be311f..37be55927 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -89,7 +89,7 @@ function editTimer(idx, hrs, mins, secs){ function deleteAlarm(idx){ var alarmIndex = getAlarmIndex(idx); - if(!alarmExists(alarmIndex)){ + if(!alarmExists(idx)){ return; } From ad84ec029b4eef0583f9ed9de0eb09bc41cf5e42 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:41:44 +0100 Subject: [PATCH 028/174] Minor renaming --- apps/smpltmr/app.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index e1bb49c78..ab08e3d3d 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const alarm = require('qalarm'); +const qalarm = require('qalarm'); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); @@ -32,10 +32,10 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = alarm.isTimerStarted(TIMER_IDX); + var started = qalarm.isTimerStarted(TIMER_IDX); var text = minutes + " min."; if(started){ - var min = alarm.getTimerMin(TIMER_IDX); + var min = qalarm.getTimerMin(TIMER_IDX); text = min + " min."; } @@ -65,7 +65,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = alarm.isTimerStarted(TIMER_IDX); + var started = qalarm.isTimerStarted(TIMER_IDX); if(isRight && !started){ minutes += 1; @@ -81,9 +81,9 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - alarm.editTimer(TIMER_IDX, 0, minutes, 0); + qalarm.editTimer(TIMER_IDX, 0, minutes, 0); } else { - alarm.deleteTimer(TIMER_IDX); + qalarm.deleteTimer(TIMER_IDX); } Bangle.buzz(80, 0.6); } From 75e88bd587031885badb9b1f6994361731a59076 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:43:56 +0100 Subject: [PATCH 029/174] Ensure time > 0. --- apps/smpltmr/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index ab08e3d3d..754fbae5b 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -87,6 +87,7 @@ Bangle.on('touch', function(btn, e){ } Bangle.buzz(80, 0.6); } + minutes = Math.max(0, minutes); draw(); }); From e8adb6aa15bc5f812fe76dc66a4b1305bb64e06c Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:56:53 +0100 Subject: [PATCH 030/174] Wrong index fix. --- apps/qalarm/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 37be55927..d75ce4204 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -77,7 +77,7 @@ function editTimer(idx, hrs, mins, secs){ a.timer = hrs * 3600 + mins * 60 + secs; a.t = (getCurrentTime() + a.timer * 1000) % 86400000; - if(alarmExists(a)){ + if(alarmExists(idx)){ alarms[alarmIndex] = a; } else { alarms.push(a) From 0fb271dfefa11dc0ad12e3e40c8fd9a9d4c34e80 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 10 Mar 2022 22:06:24 +0100 Subject: [PATCH 031/174] Updated lcars and notanalog to use qalarm --- apps/lcars/ChangeLog | 2 +- apps/lcars/lcars.app.js | 47 ++++++++------------------------- apps/lcars/metadata.json | 2 +- apps/notanalog/ChangeLog | 2 +- apps/notanalog/metadata.json | 2 +- apps/notanalog/notanalog.app.js | 45 +++++++------------------------ apps/qalarm/lib.js | 2 -- 7 files changed, 25 insertions(+), 77 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 08b3b3d4d..fcd817015 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -16,4 +16,4 @@ 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. 0.18: Fullscreen mode can now be enabled or disabled in the settings. -0.19: Use widtmr for alarm functionality instead of own implementation. \ No newline at end of file +0.19: Use qalarm for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 6ffc78ca7..94159a74e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,6 +1,7 @@ const SETTINGS_FILE = "lcars.setting.json"; const locale = require('locale'); -const storage = require('Storage') +const storage = require('Storage'); +const qalarm = require('qalarm'); let settings = { alarm: -1, dataRow1: "Steps", @@ -563,52 +564,26 @@ function getWeather(){ /* * Handle alarm */ -function isWidtmrAvailable(){ - try { - WIDGETS["widtmr"].isStarted(); - return true; - } catch(e) { - // In case the widtmr widget is not installed, the timer can - // not be used... - return false; - } -} - function isAlarmEnabled(){ - if(!isWidtmrAvailable()){ - return false; - } - - return WIDGETS["widtmr"].isStarted(); + return qalarm.isTimerStarted("lcars"); } function getAlarmMinutes(){ - if(!isWidtmrAvailable()){ - return "-"; - } - return WIDGETS["widtmr"].getRemainingMinutes(); + return qalarm.getTimerMin("lcars"); } function increaseAlarm(){ - if(!isWidtmrAvailable()){ - return; - } - - // Set to zero if alarm was disabled before - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); + var mins = qalarm.getTimerMin("lcars")+5; + qalarm.deleteTimer("lcars"); + qalarm.editTimer("lcars", 0, mins, 0); } function decreaseAlarm(){ - if(!isWidtmrAvailable()){ - return; + var mins = qalarm.getTimerMin("lcars")-5; + qalarm.deleteTimer("lcars"); + if(mins > 0){ + qalarm.editTimer("lcars", 0, mins, 0); } - - WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 5efd29e7c..b5d8e0a52 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -5,7 +5,7 @@ "icon": "lcars.png", "version":"0.19", "readme": "README.md", - "dependencies": {"widtmr":"app"}, + "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index bb5297476..3d6f1fce8 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,4 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. 0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. -0.04: Use widtmr widget for timer instead of own alarm implementation. \ No newline at end of file +0.04: Use qalarm for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 5a0ddbaf0..25cfa706d 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -7,7 +7,7 @@ "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", - "dependencies": {"widtmr":"app"}, + "dependencies": {"qalarm":"app"}, "type": "clock", "tags": "clock", "screenshots": [ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 5e56d6f6a..f51fc23fd 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -5,6 +5,7 @@ const locale = require('locale'); const storage = require('Storage') const SETTINGS_FILE = "notanalog.setting.json"; +const qalarm = require('qalarm'); let settings = { alarm: -1, }; @@ -392,52 +393,26 @@ function queueDraw() { /* * Handle alarm */ -function isWidtmrAvailable(){ - try { - WIDGETS["widtmr"].isStarted(); - return true; - } catch(e) { - // In case the widtmr widget is not installed, the timer can - // not be used... - return false; - } -} - function isAlarmEnabled(){ - if(!isWidtmrAvailable()){ - return false; - } - - return WIDGETS["widtmr"].isStarted(); + return qalarm.isTimerStarted("lcars"); } function getAlarmMinutes(){ - if(!isWidtmrAvailable()){ - return "-"; - } - return WIDGETS["widtmr"].getRemainingMinutes(); + return qalarm.getTimerMin("lcars"); } function increaseAlarm(){ - if(!isWidtmrAvailable()){ - return; - } - - // Set to zero if alarm was disabled before - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); + var mins = qalarm.getTimerMin("lcars")+5; + qalarm.deleteTimer("lcars"); + qalarm.editTimer("lcars", 0, mins, 0); } function decreaseAlarm(){ - if(!isWidtmrAvailable()){ - return; + var mins = qalarm.getTimerMin("lcars")-5; + qalarm.deleteTimer("lcars"); + if(mins > 0){ + qalarm.editTimer("lcars", 0, mins, 0); } - - WIDGETS["widtmr"].decreaseTimer(5); } function feedback(){ diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index d75ce4204..6d186d190 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -1,5 +1,3 @@ -Bangle.loadWidgets(); - let alarms = require("Storage").readJSON("qalarm.json", 1) || []; /** From 02faa5cc267dd2cb31b686c72d03649517be3c76 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 10 Mar 2022 22:11:46 +0100 Subject: [PATCH 032/174] Unique alarm ID for notanalog --- apps/notanalog/notanalog.app.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index f51fc23fd..fcd49af25 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -394,24 +394,24 @@ function queueDraw() { * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("lcars"); + return qalarm.isTimerStarted("notanalog"); } function getAlarmMinutes(){ - return qalarm.getTimerMin("lcars"); + return qalarm.getTimerMin("notanalog"); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")+5; - qalarm.deleteTimer("lcars"); - qalarm.editTimer("lcars", 0, mins, 0); + var mins = qalarm.getTimerMin("notanalog")+5; + qalarm.deleteTimer("notanalog"); + qalarm.editTimer("notanalog", 0, mins, 0); } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")-5; - qalarm.deleteTimer("lcars"); + var mins = qalarm.getTimerMin("notanalog")-5; + qalarm.deleteTimer("notanalog"); if(mins > 0){ - qalarm.editTimer("lcars", 0, mins, 0); + qalarm.editTimer("notanalog", 0, mins, 0); } } From 8a6152b7ceb4df6bcdebb95e28d30f741179bc45 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 20 Mar 2022 20:42:19 +0100 Subject: [PATCH 033/174] Minor fix --- apps/lcars/lcars.app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 94159a74e..b00fe40b3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -244,6 +244,7 @@ function drawInfo(){ return; } + g.setFontAlign(-1, -1, 0); g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); From 8658582dd79cb60fba6080cae02b4d6835f08edb Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 10:44:53 +0100 Subject: [PATCH 034/174] Create My Denti --- apps/My Denti | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/My Denti diff --git a/apps/My Denti b/apps/My Denti new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/My Denti @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From e4077325f542cb0953ed1781cd2f61d9bd23f9fd Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:01:33 +0100 Subject: [PATCH 035/174] Create app-icon.js --- apps/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/app-icon.js diff --git a/apps/app-icon.js b/apps/app-icon.js new file mode 100644 index 000000000..0b121d700 --- /dev/null +++ b/apps/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("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")) From 1b9dbd58afb2c7978cd86b10b2644092f17ab27f Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:11:46 +0100 Subject: [PATCH 036/174] Create metadata.js --- apps/metadata.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/metadata.js diff --git a/apps/metadata.js b/apps/metadata.js new file mode 100644 index 000000000..198e44df2 --- /dev/null +++ b/apps/metadata.js @@ -0,0 +1,13 @@ +{ "id": "dentigrossi", + "name": "My app monitors the teeth brush", + "shortName":"Short Name", + "version":"0.01", + "description": "A detailed description of my great app", + "icon": "brush-teeth.png", + "tags": "", + "supports" : ["BANGLEJS1"], + "storage": [ + {"name":"denti.app.js","url":"app.js"}, + {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} + ] +} From 4723f2cb96d9c287297fe2fbcddae4800b68c84f Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:21:25 +0100 Subject: [PATCH 037/174] Create metadata.json --- apps/metadata.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/metadata.json diff --git a/apps/metadata.json b/apps/metadata.json new file mode 100644 index 000000000..198e44df2 --- /dev/null +++ b/apps/metadata.json @@ -0,0 +1,13 @@ +{ "id": "dentigrossi", + "name": "My app monitors the teeth brush", + "shortName":"Short Name", + "version":"0.01", + "description": "A detailed description of my great app", + "icon": "brush-teeth.png", + "tags": "", + "supports" : ["BANGLEJS1"], + "storage": [ + {"name":"denti.app.js","url":"app.js"}, + {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} + ] +} From fd01680ef995b1b9b5ed8d266ae9411a1d6e975d Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Mar 2022 18:12:38 +0100 Subject: [PATCH 038/174] Addd 90s clk --- apps/90sclk/ChangeLog | 2 ++ apps/90sclk/README.md | 4 +++ apps/90sclk/app-icon.js | 1 + apps/90sclk/app.js | 72 +++++++++++++++++++++++++++++++++++++ apps/90sclk/app.png | Bin 0 -> 2446 bytes apps/90sclk/metadata.json | 16 +++++++++ apps/90sclk/screenshot.png | Bin 0 -> 2884 bytes 7 files changed, 95 insertions(+) create mode 100644 apps/90sclk/ChangeLog create mode 100644 apps/90sclk/README.md create mode 100644 apps/90sclk/app-icon.js create mode 100644 apps/90sclk/app.js create mode 100644 apps/90sclk/app.png create mode 100644 apps/90sclk/metadata.json create mode 100644 apps/90sclk/screenshot.png diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog new file mode 100644 index 000000000..8c2a33143 --- /dev/null +++ b/apps/90sclk/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App! +0.02: Load widgets after setUI so widclk knows when to hide diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md new file mode 100644 index 000000000..470a27c6c --- /dev/null +++ b/apps/90sclk/README.md @@ -0,0 +1,4 @@ +# Wave Clock + +![](screenshot.png) + diff --git a/apps/90sclk/app-icon.js b/apps/90sclk/app-icon.js new file mode 100644 index 000000000..00892e9c3 --- /dev/null +++ b/apps/90sclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwge27dtAX4C+/dt+wFB/wCECIu3/dvBYNv34RC7/tCIu//99EYN9C4IpB74jG3379ovDFIIRBEYxHD/47D2wjHCIX+AQJHBCIIXBNZt/+5QBEZIgBAQX///9EZRWBBARHDEwhlC/9/EAJoBDQIOBNwyPCEYYCDJQ4CJSQ4CB0O2lojL2lwBIXFiwsK0f/KgUbuwRJo6cBPAO34cUmJHH7U/97tBgEGBIODEY/RXoOw7cAgHbtlxoojGx7hCjAjD20ANA1378MEIIAB4d0u5HGNAPYCAYAB2n2SQSPDjv3CIsF2lxEYto//+CoOGCIUt0O3EYtHvqMBvlw4UAgJQBqIjERgQDBsO+7FAhaMH64DB+4qB+3AgARG9uhIgQJD4dghd+7dLBQZoBaISwC4cArf27dpCIf/23f9uHCIQABhoNClsl20ttuwgYKBEAIAChOmCIOH/vx9ttwB2BDgMBAoIRBmnbpkbtk2ltsgAMCJQOwAgMBk+eq3AhiSBsE2GAX//4WCAAOBAoVbtt8mCJBgHHfYMHdgoRBott+zmDsEAn/tEwkC7UAVoYACgPbv4REAASTBEYY0BPIPwCJAjEu3Dvq8BCAnbsEwGgm2jbAC8EAjFvEAQREjuwDQXbvvx7cd2K/EgEb9oRCAoLOBjEAgk/A=")) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js new file mode 100644 index 000000000..f1c67ce2f --- /dev/null +++ b/apps/90sclk/app.js @@ -0,0 +1,72 @@ +function getImg() { + return require("heatshrink").decompress(atob("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")); +} +var IMAGEWIDTH = 176; +var IMAGEHEIGHT = 109; + +Graphics.prototype.setFontZCOOL = function() { +// Actual height 40 (46 - 7) +var widths = atob("CxAhEh8hJCIjGSMdCw=="); +var font = atob("AAAAAAAAAAAAAAAEAAAAAAAPAAAAAAAP4AAAAAAD+AAAAAAA/gAAAAAAP8AAAAAAB/AAAAAAAfAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAfgAAAAAAf4AAAAAA/+AAAAAA//AAAAAB/+AAAAAB/+AAAAAD/8AAAAAD/8AAAAAD/4AAAAAH/4AAAAAH/wAAAAAD/wAAAAAAfwAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAP8AAAAAB//gAAAAP//4AAAB////AAAP////wAAf///h8AAH//8AfAAD//gAHwAA/8AAB8AAPgAAAfAAD4AAAHwAAfAAAB+AAHwAAAPgAB8AAAD4AAfAAAA+AAHwAAAPgAB8AAAD4AAPgAAA+AAD4AAAPgAA+AAAD8AAPgAAAfAAD4AAAHwAA/////8AAH/////AAB/////wAAf////4AAD////8AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAA/AAAAAAAfgAAAAAAH4AAAAAAD8AAAAAAB+AAAAAAA/AAAAAAAPwAAH/gAH4D///4AD/////+AB//////gAf/////4AD////gAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAB8AAAGAAAfAAAD4AAPwAAB/AAH4AAA/wAB8AAAf8AA/AAAP/AAfgAAP/gAHwAAH/4AD8AAD++AB+AAB/PgAfAAA/j4AHwAAfw+AB+AAP4PgAfwAH8D4AD8AH+A+AAfgD/AfAAD8B/AHwAAfg/gB8AAD8fwAfAAA/v4AHwAAH/8AB8AAA/+AAfAAAH/AAHwAAA/AAB8AAAHgAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAAAAAAAAABAAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAHwAAMAAAB8AAfAAAAfAAHwAAAHwAB8AAAA+AAfAAAAPgAHwAfAD4AA+AP4A+AAPgD+APgAD4B/gB8AA+A/8AfAAPgf/AHwAD4H/wB8AA+D98AfgAHh+fgD4AB4/D4A+AAffg+A/gAH34Pg/4AB/8D8f8AAf+Aff+AAH/AH/+AAA/wB/+AAAP4Af+AAAD8AD/AAAA+AA/AAAAHgADAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAD+AAAAAAH/gAAAAAH/4AAAAAP/+AAAAAP//gAAAAf/z4AAAAf/w+AAAA//gPgAAA//gD4AAAf/AA+AAAH/AAPgAAB/AAD4AAAeAAA+AAACAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAP/+AAAAP///gAB/////4AAf////+AAH/////AAB///+AAAAf/APgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAAAAAAAAAAACAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAH4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAfwA+AAAH/+AHwAAf//gB8AAP//4AfAAH//+AHwAB/+PwB+AAfwB8APgAHwAfAD4AB8AHwA+AAfAB8APgAHwAfAB8AB8AHwAfAAfAB8AHwAHwAfAB8AB8AH4AfAAfAA+AH4AHwAPgH+AB8AD4H/gAfAA+H/wAHwAPv/4AB8AD//4AAfAA//wAAHwAP/wAAB8AD/gAAAAAAfgAAAAAABAAAAAAAAAAAAAAAAAHwAAAAAAH8AAAAAAD/gAAAAAD/4AAAAAD/+AAAAAD/3wAAAAD/x8AAAAD/4PgAAAD/4D4AAAD/4A+AAAB/4AHwAAB/4AB8AAB/4AAfAAB/4CAD4AB/8DgA+AAf8B8APgAD8AfAB8AA8AH4AfAAEAA+AH4AAAAPgA+AAAAD8AfgAAAAfAP4AAAAH4P8AAAAA+H+AAAAAPj+AAAAAB9/AAAAAAf/gAAAAAH/wAAAAAA/4AAAAAAP8AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAD4AAAAAAA+AAAAAAAPwAAAAAAB8AAAAAAAfAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAHwAAADAAB8AAAD4AAfAAAD+AAHwAAH/wAB8AAH/4AAfgAH/4AAH4AH/4AAA+AH/wAAAPgH/wAAAD4H/wAAAA+H/wAAAAPv/wAAAAD//wAAAAA//gAAAAAP/gAAAAAD/gAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAH4AAAAAAB+AAAHwAA/wAAB8AAf8AAA/gAP/AAAP8AH/wAAH/gD8+AAB/4B+PgAAf/A/j4AAPn4Pw+AAD4/H4HwAB+Pz8B8AAfB/+AfAAPwP/AHwAD4B/gB+AA+AfwAPgAfAP+AD4AHwD/wA+AB+B/+AfgAfw/PgPwAB/fj8D8AAP/wfh+AAB/4D8fAAAP+AfPwAAB/AH/4AAAPgA/8AAAAAAH/AAAAAAA/gAAAAAAPwAAAAAAB8AAAAAAAAAAAAAAAAAAAAAGAAAAAAAD4AAAAAAB/AAAAAAB/wAAAAAA/+AAAAAAf/gAAAAAf78AAAAAP8fAAAAAP+H4AAAAD+A+AAAAB/APgAAAAfAB8AAAAH4AfAAYAA+AD4AfAAPgA+AfwAD4APgf+AA+ABgf/AAHwAA//AAB8AA//AAAfAA//AAAHwA//AAAB+A/+AAAAPh/+AAAAD5/+AAAAA//+AAAAAP/+AAAAAB/8AAAAAAf8AAAAAAH8AAAAAAAAAAAAAAAAADgAOAAAAH4AfgAAAD+AP4AAAA/wD/AAAAH8AfwAAAB/AH8AAAAfwB/AAAADgAOAAAAAAAAAAAAAAAAA="); +var scale = 1; // size multiplier for this font +g.setFontCustom(font, 46, widths, 50+(scale<<8)+(1<<16)); +}; + +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + +function draw() { + var x = g.getWidth()/2; + var y = 24+20; + + g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); + if (g.getWidth() == IMAGEWIDTH) + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); + else { + let scale = g.getWidth()/IMAGEWIDTH; + y *= scale; + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT*scale,{scale:scale}); + } + // work out locale-friendly date/time + var date = new Date(); + var timeStr = require("locale").time(date,1); + var dateStr = require("locale").date(date).toUpperCase(); + // draw time + g.setFontAlign(0,0).setFont("ZCOOL"); + g.drawString(timeStr,x,y); + // draw date + y += 35; + g.setFontAlign(0,0,1).setFont("6x8"); + g.drawString(dateStr,g.getWidth()-8,g.getHeight()/2); + // queue draw in one minute + queueDraw(); +} + +// Clear the screen once, at startup +g.setTheme({bg:"#f0f",fg:"#fff",dark:true}).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/90sclk/app.png b/apps/90sclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ff43bb10655c67224603dec35559aac7b98fc560 GIT binary patch literal 2446 zcmV;9332v`P)R}BKQ(n^v* zNlPWs(#8iqu)2gPKG5649J%=-(`#LGBn8U{f{+LJozMN_aO@m;duQ(SM{D*UzqR+; zYkz-huf6tK+l0^`iQM!Dqdx)t3Fr?3$n<{$)J*z8n&@EfldMumHL=!`A>EMNs|`Ib zAz2!X2vKXZfB`@n2wGD`)173@unvH|j?w0>N`OU9-&3h;MNzwj9+j+8x^!GJq)4ey zdQU2F6?;*dDh-rINhaw#>AKXxG1^D6NpCyJ8+UD?`(ZE$PQY5|4ZT2605e=Ayqvwu> zCI8EoNsncZs8uwm%4$VJ&b}R=<6idVt&#Tuc!p`;zlWNG@uM^XuI&u9TnwS033t_ z5Cl5ip-N5F`t`mkDUo3LEZeGEh#ckAr8ypYHxkgd${m!P{#|L&CAb2UAQLj-D~NNI z?FZ>FVBbEk)vML9(^@U-F=vg>_z_Lxrp{7S&H7)3<&6Opj%;To zgu_7a10^MEWt2dxSG#!Vp)c&Sn?Ogqny(K&HGGl(w1r!`eD<;5kxEtGxzJx>Tmt~v zWD6b?=>S7HGy@ri-hW@8eyTltBx&bPO?ACyH^u3Ao__t+2V}FU@Pe?#fR-e+U%26+ z;GO}GbiX^Nwmly7BybXdIWW{Pl#-%xa%^1ycKhGa-zN-_*xz9yOE;h{x~WHQxRhL~g+*GsPqFAtUUbN73%YNh|!lWqgrs;!N_k;cM9PJl{PI-<$w z*rKaH!cu7ODml@SZ+SvAY=@5_`0{0eJKVP@w$?1vRDs2c#fp=)YHp7FP9-WH>N6@d zJLhva1xuhm_&7XC^6BFCR))|GiScct$VOquv)0_ zBp|gxm+P8SXTE}CkOD8mAXo;kI~6v*Fb(4EJs*CkPMzfEXZI9I8ZbbTA|jkhk5~lD zt0mrscsII!KyN`F9E9HB3%#J}%9Y0;$!?qC;`k-+=;%>Et5#|A=9-SUN#5SKx!3d> zNzc~0;NxkC13LdmpI0AF-aRaJP5<2OPj5V#sKhEj_dpkDV;7%0R~CyT-=jwr7pJ1D zx_D6;@5pMj{bZ|ley)!`szOkAHGH-?pNVX7Q~W9l#dT3Aie>!MYi6G{W6zzu2x+hs zPJu#0yZ0Jjr0WO?WVH%3V}?9DoU(2=si)@7QD&yf%PqJ6acCd4>Ff?|CrnV!2W74y zv}TPF&xp0nSS=PbW3xXQGG=*XeBh~s#X9+&PM@yQ79KwIryq5*D8~EsDhtVGQ~r5n z@05p!9tl;je+|EU;er<&hA{8~59kCs@{J@}JZm)4wsxwV@g&1uC1gIKFI5IT5zt|X zKx3b(k_eRc?3Xl8ar?D*w|Sof(6M7mOV!`PRaPcYU|_WZ#Z5s$Q{fQgz7eNm z^;~6c<`wSuCd$-&V2Hl{T9J`*lN9VMGg2e(bn4j!1!1R7D|3{f+v(H#xlq9^?$qt) zXDTXE$BvId?Af!HfBcgUGns7>@%8|yt0&a8_Is|AFa_+)((Anum@y- zf8yH$?MYX3s-*E6|NCqoA4&4@)`A5tS|cJV;R*oDa&to?BkRS{R&DK?TdCE2%}4Cg zuDJ zLWUtwMTNfqUel&I3f$TYH-G=hkPX2lC4(J45Cj=u8Z)LUGPP<|Q;lji%Ph%H)u0Ck zN`_%F40ljvr3^z|yE+R5yZWHhD`)Eo@VOmFe!d+|D43xqoPspSg)LwnF`|A;TP#gS zkAC6Wwfie8rTBQ$EZG4p6rS=sQiG82S@xnDnddg^x&{rb5C##*R-R@OWS2Ib@^ zeT!031Rj~0!tpkim#5|}bzu8Yn@!LI&cHXYw6O5WbLU20yS5rSLCcJdffTd@B_{_< z{R1YcPp=j+G1AjdyEumYYX;)&?Y3@RG|YjPpapYvB2SM#sv}4255}#JA9r&0cIxJ% zn>YPHVPUdbTR<24-JF&tP(nf{`35OK1B3M53e9{>4|M(@=c`}fzb(4C5nw3;yZ`_I M07*qoM6N<$g2mI7k^lez literal 0 HcmV?d00001 diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json new file mode 100644 index 000000000..3d96bf844 --- /dev/null +++ b/apps/90sclk/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "90sclk", + "name": "90s Clock", + "version": "0.02", + "description": "A clock in 90s style", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"90sclk.app.js","url":"app.js"}, + {"name":"90sclk.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/90sclk/screenshot.png b/apps/90sclk/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7f05ce68880935db0de4aaf840077e9b30413db7 GIT binary patch literal 2884 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 iR539+GBi3hI4dwQIxsMs^94u%0000 Date: Wed, 23 Mar 2022 19:16:23 +0100 Subject: [PATCH 039/174] Finished 90s clock --- apps/90sclk/ChangeLog | 3 +- apps/90sclk/README.md | 2 +- apps/90sclk/app-icon.js | 2 +- apps/90sclk/app.js | 100 ++++++++++++++++++++++++------------- apps/90sclk/app.png | Bin 2446 -> 4238 bytes apps/90sclk/bg.png | Bin 0 -> 37016 bytes apps/90sclk/metadata.json | 4 +- apps/90sclk/screenshot.png | Bin 2884 -> 6093 bytes 8 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 apps/90sclk/bg.png diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog index 8c2a33143..2286a7f70 100644 --- a/apps/90sclk/ChangeLog +++ b/apps/90sclk/ChangeLog @@ -1,2 +1 @@ -0.01: New App! -0.02: Load widgets after setUI so widclk knows when to hide +0.01: New App! \ No newline at end of file diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 470a27c6c..55fe21ce6 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -1,4 +1,4 @@ -# Wave Clock +# 90s Clock ![](screenshot.png) diff --git a/apps/90sclk/app-icon.js b/apps/90sclk/app-icon.js index 00892e9c3..28f75c4e6 100644 --- a/apps/90sclk/app-icon.js +++ b/apps/90sclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwge27dtAX4C+/dt+wFB/wCECIu3/dvBYNv34RC7/tCIu//99EYN9C4IpB74jG3379ovDFIIRBEYxHD/47D2wjHCIX+AQJHBCIIXBNZt/+5QBEZIgBAQX///9EZRWBBARHDEwhlC/9/EAJoBDQIOBNwyPCEYYCDJQ4CJSQ4CB0O2lojL2lwBIXFiwsK0f/KgUbuwRJo6cBPAO34cUmJHH7U/97tBgEGBIODEY/RXoOw7cAgHbtlxoojGx7hCjAjD20ANA1378MEIIAB4d0u5HGNAPYCAYAB2n2SQSPDjv3CIsF2lxEYto//+CoOGCIUt0O3EYtHvqMBvlw4UAgJQBqIjERgQDBsO+7FAhaMH64DB+4qB+3AgARG9uhIgQJD4dghd+7dLBQZoBaISwC4cArf27dpCIf/23f9uHCIQABhoNClsl20ttuwgYKBEAIAChOmCIOH/vx9ttwB2BDgMBAoIRBmnbpkbtk2ltsgAMCJQOwAgMBk+eq3AhiSBsE2GAX//4WCAAOBAoVbtt8mCJBgHHfYMHdgoRBott+zmDsEAn/tEwkC7UAVoYACgPbv4REAASTBEYY0BPIPwCJAjEu3Dvq8BCAnbsEwGgm2jbAC8EAjFvEAQREjuwDQXbvvx7cd2K/EgEb9oRCAoLOBjEAgk/A=")) +require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index f1c67ce2f..02a35e69f 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -1,17 +1,24 @@ -function getImg() { - return require("heatshrink").decompress(atob("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")); -} -var IMAGEWIDTH = 176; -var IMAGEHEIGHT = 109; +const locale = require('locale'); -Graphics.prototype.setFontZCOOL = function() { -// Actual height 40 (46 - 7) -var widths = atob("CxAhEh8hJCIjGSMdCw=="); -var font = atob("AAAAAAAAAAAAAAAEAAAAAAAPAAAAAAAP4AAAAAAD+AAAAAAA/gAAAAAAP8AAAAAAB/AAAAAAAfAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAfgAAAAAAf4AAAAAA/+AAAAAA//AAAAAB/+AAAAAB/+AAAAAD/8AAAAAD/8AAAAAD/4AAAAAH/4AAAAAH/wAAAAAD/wAAAAAAfwAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAP8AAAAAB//gAAAAP//4AAAB////AAAP////wAAf///h8AAH//8AfAAD//gAHwAA/8AAB8AAPgAAAfAAD4AAAHwAAfAAAB+AAHwAAAPgAB8AAAD4AAfAAAA+AAHwAAAPgAB8AAAD4AAPgAAA+AAD4AAAPgAA+AAAD8AAPgAAAfAAD4AAAHwAA/////8AAH/////AAB/////wAAf////4AAD////8AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAA/AAAAAAAfgAAAAAAH4AAAAAAD8AAAAAAB+AAAAAAA/AAAAAAAPwAAH/gAH4D///4AD/////+AB//////gAf/////4AD////gAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAB8AAAGAAAfAAAD4AAPwAAB/AAH4AAA/wAB8AAAf8AA/AAAP/AAfgAAP/gAHwAAH/4AD8AAD++AB+AAB/PgAfAAA/j4AHwAAfw+AB+AAP4PgAfwAH8D4AD8AH+A+AAfgD/AfAAD8B/AHwAAfg/gB8AAD8fwAfAAA/v4AHwAAH/8AB8AAA/+AAfAAAH/AAHwAAA/AAB8AAAHgAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAAAAAAAAABAAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAHwAAMAAAB8AAfAAAAfAAHwAAAHwAB8AAAA+AAfAAAAPgAHwAfAD4AA+AP4A+AAPgD+APgAD4B/gB8AA+A/8AfAAPgf/AHwAD4H/wB8AA+D98AfgAHh+fgD4AB4/D4A+AAffg+A/gAH34Pg/4AB/8D8f8AAf+Aff+AAH/AH/+AAA/wB/+AAAP4Af+AAAD8AD/AAAA+AA/AAAAHgADAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAD+AAAAAAH/gAAAAAH/4AAAAAP/+AAAAAP//gAAAAf/z4AAAAf/w+AAAA//gPgAAA//gD4AAAf/AA+AAAH/AAPgAAB/AAD4AAAeAAA+AAACAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAP/+AAAAP///gAB/////4AAf////+AAH/////AAB///+AAAAf/APgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAAAAAAAAAAACAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAH4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAfwA+AAAH/+AHwAAf//gB8AAP//4AfAAH//+AHwAB/+PwB+AAfwB8APgAHwAfAD4AB8AHwA+AAfAB8APgAHwAfAB8AB8AHwAfAAfAB8AHwAHwAfAB8AB8AH4AfAAfAA+AH4AHwAPgH+AB8AD4H/gAfAA+H/wAHwAPv/4AB8AD//4AAfAA//wAAHwAP/wAAB8AD/gAAAAAAfgAAAAAABAAAAAAAAAAAAAAAAAHwAAAAAAH8AAAAAAD/gAAAAAD/4AAAAAD/+AAAAAD/3wAAAAD/x8AAAAD/4PgAAAD/4D4AAAD/4A+AAAB/4AHwAAB/4AB8AAB/4AAfAAB/4CAD4AB/8DgA+AAf8B8APgAD8AfAB8AA8AH4AfAAEAA+AH4AAAAPgA+AAAAD8AfgAAAAfAP4AAAAH4P8AAAAA+H+AAAAAPj+AAAAAB9/AAAAAAf/gAAAAAH/wAAAAAA/4AAAAAAP8AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAD4AAAAAAA+AAAAAAAPwAAAAAAB8AAAAAAAfAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAHwAAADAAB8AAAD4AAfAAAD+AAHwAAH/wAB8AAH/4AAfgAH/4AAH4AH/4AAA+AH/wAAAPgH/wAAAD4H/wAAAA+H/wAAAAPv/wAAAAD//wAAAAA//gAAAAAP/gAAAAAD/gAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAH4AAAAAAB+AAAHwAA/wAAB8AAf8AAA/gAP/AAAP8AH/wAAH/gD8+AAB/4B+PgAAf/A/j4AAPn4Pw+AAD4/H4HwAB+Pz8B8AAfB/+AfAAPwP/AHwAD4B/gB+AA+AfwAPgAfAP+AD4AHwD/wA+AB+B/+AfgAfw/PgPwAB/fj8D8AAP/wfh+AAB/4D8fAAAP+AfPwAAB/AH/4AAAPgA/8AAAAAAH/AAAAAAA/gAAAAAAPwAAAAAAB8AAAAAAAAAAAAAAAAAAAAAGAAAAAAAD4AAAAAAB/AAAAAAB/wAAAAAA/+AAAAAAf/gAAAAAf78AAAAAP8fAAAAAP+H4AAAAD+A+AAAAB/APgAAAAfAB8AAAAH4AfAAYAA+AD4AfAAPgA+AfwAD4APgf+AA+ABgf/AAHwAA//AAB8AA//AAAfAA//AAAHwA//AAAB+A/+AAAAPh/+AAAAD5/+AAAAA//+AAAAAP/+AAAAAB/8AAAAAAf8AAAAAAH8AAAAAAAAAAAAAAAAADgAOAAAAH4AfgAAAD+AP4AAAA/wD/AAAAH8AfwAAAB/AH8AAAAfwB/AAAADgAOAAAAAAAAAAAAAAAAA="); -var scale = 1; // size multiplier for this font -g.setFontCustom(font, 46, widths, 50+(scale<<8)+(1<<16)); + +function getImg() { + return require("heatshrink").decompress(atob("2Gwgc8+fPAQnACY+ShAmQj9/8+evICF//evv3799FguCpMgAwdly1ZAQNbtu2II8EyRoR///23bEIICE//7AoewC4tJkmAAoSDPCggANg//QAwCBvv/QAKDIFgRuDQYZeDCY0BkiCRn53EAQlv/4IEMpGSpKDI+ASGhraEABkB/8eQY+fQZ0AgVJkGAQYTZKCIKCRv/4gaDJ/wFDtgcJhMkyCDGmAQFwVIICEcuJxBQY+ev6ACAQNxDxUgycly1bKpWSoBBQj7gCQZF/QZ4ABiUMuaDDggNFkmCICEH/gECQY+fQYtwEBcCgEGKoXYBgsBkmAIKE/8AEChqDH/6DEEZ/HjlwdIIAEhMgIKEB/4FEQYp9BQYncMyAuJCSMP/AGEmyDHAoaxGAE1/TwsHQYZ9B7/9QYcYIFcD/wHFgiDF76DEQVkAuBBGjyDBz6DG4xBtRhCDE//9AoWAIOsAQASDFSowAxhqDE9oFBIG4ABg6DC/4CBjAWOuPHIVMDtu///sCh//AAKFqgOH/iAPIARBrgE/IJ0fH4WOIFcAg5BMgPHH4PHH9iDC8ANLh5AB/xNI4D4WwAONeRkcv//SQkFAYUDJgJcMABFJKBwmMGgP4A4kEboUfBgLgMAA0EjVpQbILB//xXIkBQYU/ZwM4/4rNAAkkyVICBr4BBZLCBGQ8sBYSACj/wICFB02atLFPBRC2CjgUG4sDZwhBRgVJQaL4FAAS2BGogADhcsj7OEIJ8Bg0atKDBsB6NVoIIGuJABF5FxorOFIJ8JQAKDJn/gQZq2BfAYAGpcsZwpBOiCACQZPHQZsHIAKMHAAMUqNFBApBOQAYCCoCYNQYsPH4P+CZMC5csIKUBwyADAQVwIJsBPQccRIP8C5UcQaiAFQaX/8EAn7CCAoIAJ2SDSgkaQAoCBz1gQZ4AE4ASKgsUQaSAHAQRANAAKAD/+ACJckQaVhQAwCB0+cIJ8Hj//46VNoqDILJECQBFNmnSIJ4AQgMsQZ8BgyAFz1584CCQaBBRQaEJQA9JmnTQYPQIMELQZEH/gGEjCAEAQOnQc6ABQY8HQYqAGPoKACQccCpaDNgJ9BvKACPoaDmQASDIIIUCQAtJQAwCC4BBfiSABQZUEjVpQYaAIAQRAfQZc/8EAQB4CCwBBfQASDGgP/+FhOgNpPpKDlgqDJIIPzQAR9KAQpBfkiDK8+atOnQByDMkDQTgKADQY0JmmSQYKAOQZcBkhBUQAaDFiF5QCSDLhKDVsqDIgRuByaAQAQMwFZFJH6QABhaDJgFxQCQCB4gqHwVIIKiAEQYsAv6ARQZUEyVAICcCpaDKv/HQafAFQ0kwSCUPoWUQZPkQaYpGhMkICgYCQZfEjyDYgUJkA6PjgGFgNFiyDHgf/4EDQaHz54nFiVIIB8///wBI2SQY5BCgCDXkGShAtFiFBggIFv//AAKeFCYKDI/wDBhqDN588+fOEgkkyBvHpMkwAHDj4/B8YvCAA0kQYoUBKYMBQaFxEIcJkA2EDwMMmZUB+FABAMH//xFgN/QYwABgqDJgE8QBHzQAQCC9ghDpMgFIsJkiDCyRBCn//KQRBJgECpaDZuAZCwVIE4sBE4JUD4Y7B/8cBwRBKgFBQY0DboPzQBX79++/fgDAMEOoZpEQAQCDkf//AODvxAJAAxZBQwP/jyDRkmCEA1y5bYE58f+J9EQZZBHAAP4gVPQYKAE+aACAQTZCkggHQAgCBrNnwANDWYQAPuJAB+AbBuKDOgUJkAfGgmyLQoCBBwkf+BBQgE4egRyBEoqAEAQWAiVJDw8EQYuWrNkQYkfQaIAFgMHQZecsGShAZHjiAFAQUQQa5qGEQM+QAwCC0mQDBKDEkqDBsqDEeQJBXgEeQZUdkgtEQZ2wBoUHQbMAgaAIAQNJkAXJQAQCBQAKDILZIAQQZPCrBBKQZJ9Dg/8IDMAh6DH92SpAWKQYaACQY0/ILcBQY2cumXjgWKQZMwQb8AnyDF9Mk33gCpUEQYMlQYltQYgaLACEHQYnHpN1QwKDUU4f/IDYAB7aDD2VLt/+NBiDBQAQCBraDDh5BejyDCuPSrgFBChcEuaDKuJBegF/QYOkySGB/7xDABCADQYdgBYUP/BBeuPnjsl4+eQZsAQY8EMQfAGJzvMAAUB31JlqGB//+CZcD+yDDtu27ILD/5BPACGGpKABQZ0f+PHQYnDBYUcQaAAQyVL9/+///dhn/wEJQYNbQYKPETpgACiBAPkGCjyDPg/8G4McQYVwR4nwOJ4POgMkwDpBAASDLn/gbgdZsCPFIJ0EIJ0ChMgwEAQYbsKgP/EJaDLjl/DRgAEiVJAgUPQYQnKh6PLQYJhBTZAnCcALUPhB0DQZt/BZUAg4yJuI/B+PHIJ7UGLgQ1KvwhLIJMDEgPgSRgADhEkHAsHQZccuBBUg5AB44dDQRtJkjsH/wUJj/wERc/O4QADgJABC4iDNgVIkB3HQZRBMHAKDGv4IFahIAEiVAfaZlNQYyBB/APFIJkgyQLJfZJlNQYIFE4//+KkFDpkBkmQSJgAUIIKDDh6CBTA0HSQoAEgUJkCuMIK4ECjl//8cUI4bKgVJH8JBFg6BB/APHn6DKwUIIMscuJAB+PABw/HDRMEyRAjOgQ/BAALuJn4JIhEkwRAkOgI/BO5TUDAA1JkiClAAP//xQL/AJHgVIkBBnSRvABI8SoBA0gEPII8gyRA1QZEBkmQIO0OA40JkGAIOwAGgVJH/oAByVIIH0EyVAIHsIkmCQX0JkhA+QYMgC6scuPHIM1IC63/AAPgBhF/4CZwuI/B+PH/hB6gaAE/+AIPEHQAIyDj/wSRBBugKBBPokfQZAAvv//jgHEQZIAuj//WYyJFAGMH/56HRIoAxn/8BI6DRsBAjv//RhBKIABEcmAwRgQPOgf//BBasOGIMEHj/wBZJBQgccuPBIKGCBxs/fZU/8CDSjATQiQNMgP/jgLKFiCDBuHHEBIAGyQNMh/4JpbzRQYVlUhIAEgmQBpccv/AILkHhlxQYNwEZQACkhRM//wR6yDKAQMIe5kkMRn8BpaPLQZYCBCRcIkoOKWwPgDRUD/yCRQYtYsARK9MvdhV/LhkfaJaDNjkwOhHHpKSKOhxBTQYsYsuWB48P/dJGR8HMQUUQbUxQYlx4APFji2BpAdK/+AAgMKlmy5cs0QICAAIODQbEYBwv//0SoAbIgP/jgEBijmFMQcH/hASQYMwEAvHhgyD4/8uGSDhMP/AEC23btoCBQwUoBQM/8BBSQY1hy1ZsqhCh//EYJBKv53DL4oCCiiSBICaDJjlwoEcv/HCIPCDZED/wEClKDEtiDBQwOBIKkQQZOWgH/GQUEyAbIj/wAYNRL44CCvZBUgaDB4cMEY98uAQBkjMCAA38AYUKtKDJ//4IKaAEAQaDCrNsB4MBkjgJjiRCQBACCv/AG5MBeoSDSjkwgEJkAjIWYcCzSDJ2//oBBJh//eQaDMjKDCtuSIIJlJOIaAJAQMf/PFDhCPBIIP/SQuDQYcxExHChCDDg4ZDhwED0yDB0yDDQwf//coIA8/H4XjIIyDIjCDCAQPapCoJJQaDL//x44WGuI/B+I+Bv5BFQAKDNpg4EZJHmQYWbQYp3B5cs0AVEgZAB8AGCv/4QZ1hQYeSpGAIJaDL9/8AoMUCgkf/6MEQalw6YCBIJc586DCQAYCC//2QYyMB/wcEIIyDKwyDB22SQwIjDYg6AIAQX/AoYUCBAP8MoZBHgKDEmAmHmmHAoPDCgP/QZOeQYOaQYnf/+yQYOwCQMD///8AbEBAKDT0mZQYNZsCDUv/vQYkHj//44dGQZnDEw0kAoiDJvKDBvKDBtKDC2///qDC2WAn///wbGgYIGQZlpkiDDsuHII6DKPQQIDoP//lwDg0f+AjFQZkNmIvF76DR3//QAKDB2f///gDY8fQaUapMmQAKDCy1YQaXxAoceIIJAHQZ8MPoVw4dIQY3HQZfmQYOmQYP/7aDCAoP/4BBI/+AQaOapKADQav8Aofv/53FAAcHBY6DHmAgC4VMF4xoIQYfnQYXav6DBtuy76CBO4yDXyVJwyDEzxBHQZP/QYZGBjhAJg/8BAyDIAQWTF41/QaHb//27dsQIP92SDJII8EQZWkyQFBjKDCt/+Eo6DKAoX//YIBQbkcmgvGj/wExE5QYeeQYOf/+276CB7ct2BBJn/gQY0QQZMkzCDDw0A/5BIQZF/QYICB3gICQbkNkgsEuEHQaF503//qBB//27dt0CDctMkAodgCYP/wBoJQZAABBAcUQaMgQZUxEYcMTxLGDQYvm75BCtu2QaEDNYSDBoMGQYsapMmBAZcCQaVz/+8BAhAJNAQRCA4SAHAQVMuARBmHATxIAEQYvnzd982bQYVoIJaVB/AHDQZOSpIFCPoc/IJaDGAQ3FIJYOBNwSDL6QCBSokB/5BLgaDFzVp0yDC7QYKABCDNCQk/8B6CuAgHQZh0EAByDJycMmPDCIaDBAgX//wgHjyDHzSDZgiDE0mQAoIREIIKDCA==")); +} + +Graphics.prototype.setFontTime = function(scale) { + // Actual height 54 (56 - 3) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAPwAAAAAAAA/gAAAAAAAF/AAAAAAAA/8AAAAAAAD/wAAAAAAAP/AAAAAAAA/wAAAAAAAB/AAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAB+AAAAAAAAf4AAAAAAAH/wAAAAAAB//AAAAAAAf/+AAAAAAH//8AAAAAB///wAAAAAf///gAAAAH///+AAAAB////4AAAAf///+AAAAH////gAAAB////8AAAA/////AAAAP////wAAAD////8AAAA/////AAAAP////gAAAD////4AAAA////+AAAAD////gAAAAP///4AAAAAf//+AAAAAB///gAAAAAD//4AAAAAAP/+AAAAAAAf/gAAAAAAB/wAAAAAAAH8AAAAAAAAPAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAf/wAAAAAAH//gAAAAAD///gAAAAAf///AAAAAB///+AAAAgP///8AAAHg////wAAAfn////gAAD/t////AAAP/j///8AAA//D///4AAH//D///gAAf//H//+AAB///H//4AAH//+P//gAAP//+P/+AAA///8f/4AAD///8f/gAAP///8f+AAAf///8/wAAB////w/AAAD////A4AAAH///4BgAAAP///gAAAAAf//8AAAAAA///AAAAAAA//wAAAAAAA/+AAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAD+AAAAAAAAP4AAAAAAAB/gAAAAAAAP+AAAAAAAA/5//////4D/v//////gP+//////+A/7//////4D/v//////gP+//////+A/7//////4D/v//////gP+//////+Af7//////4A/v//////gA+//////+AA7///hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAD/4AAfwAAAf/gAD/AAAH/+AA/8AAA//4AH/wAAP//gA//AAD//+AH/8AA///4Af/wAP///gD//AD///+AP/8Af///4A//wH////gD//B////+AP/8f//7/4A//3///P/gD/////w/+AP////8D/4A/////AP/gD////4A/+AP///+AD/4Af///gAH/gB///4AAf/AD///AAB/8AH//wAAH/wAP/8AAAf/AAf/gAAB/4AA/4AAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAf/wD/+AAAB//AP/4AAAH/8A//gAAAf/wD/+AAAB//AP/4AAAH/8A//gAAAf/wB/+AAAAAAAAAB/4A//8A////////wH////////Af///////8A////////wD///+////AP///7///8A////P///wB///8f//+AH///h///4AP//+D///AAf//wH//4AA//+AP//AAB//wAf/4AAD/+AAf/AAAD/gAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAH//AAAAAAA//+AAAAAAP//8AAAAAB///4AAAAAP///wAAAAA////gAAAAH////AAAAA////8AAAAD////4AAAAf////j//gB////+//+AP///////4A////////gD///////+Af///////4B////////gH///////+Af///////gB//////AAAH8AAAHAAAAAAA//wAAAAAAD//4AAAAAAP//gAAAAAA//+AAAAAAD//4AAAAAAP//gAAAAAA//+AAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////AB/AAf///+AP/+B////4A//4H////AD//gf///8AP/+B////4A//4H////gD//gf/////+AAAAAAAP///wP//gA////A//+AD///8D//4AP///wP//gAf//+A//+AB///4D//4AD///gAB/gAH//8AAAAAAP//gAAAAAAf/8AAAAAAA//gAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAP/8AAAAAAB//8AAAAAAf//8AAAAAD///4AAAAAf///wAAAAD////wAAAAf////AAAAD////+AAAAP////8AAAB/////wAAAP/////gAAA/////+AAAH/////8AAAf/////wAAB//////gAAP/////+AAA//////4AAD//////gAAP/////+AAA//////4AAD//////gAAP//////AAA//////8AAAAf////wAAAAAAP//gAAAAB///+AAAAAH///4AAAAAf///gAAAAB///+AAAAAH///wAAAAAf///AAAAAA///8AAAAAD///gAAAAAH//+AAAAAAP//wAAAAAAf/+AAAAAAA//wAAAAAAB/+AAAAAAAB/gAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAH///AAAAAAf//8AAAAAB///wAAAAAH///AAAAAAf//8AAAAAB///wAAAAAH///AAAAAAf//8AAAAAA//AAAAAAAAAAAAAAAAwAAP//////A////////8D////////wP////////A////////8D////////wP////////A////////8D////////wP////////A////////8D////////wP////////A////0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAD/gAH//AAA//gA//+AAP//AH//8AB//+A///4AP//8H///wA///4f///AH///j///+Af///P///4D///9////wP////////A////////8D////////wP///3///+AAAAAAAAAAB/wAAAAAAAP///x4AAAA////P///4D///8////gH///z///+Af///H///4B///8f///gD///g///8AH//8D///wAf//wH//+AA//+AP//wAA//gA//+AAA/4AA//gAAAEAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAH/8AAAAAAB//8AAAAAAP//4AAAAAB///wAAAAAP///gAAAAB////AAAAAP///8AAAAA////4AAAAH////gAAAAf////AAAAD////8AAAAP////wAAAA/////AAAAD////8AAAAH////wAAAAAAAAAAAAAD///+AAAAAP///////AA///////8AD///////wAP///////AA///////8AB///////wAH//////+AAf//////4AA///////gAD//////8AAH//////wAAf/////+AAA//////4AAB//////AAAH/////4AAAP/////AAAAf////4AAAA////+AAAAB////wAAAAB///8AAAAAB///AAAAAAB//wAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AB8AAAAAH8AP4AAAAA/4B/wAAAAH/gO/AAAAAf+A/8AAAAB/4D/wAAAAH/AP/AAAAAP4AfwAAAAAfAA+AAAAAAQAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), 46, atob("FionHyIiJiIyJScyFA=="), 58+(scale<<8)+(1<<16)); + return this; }; + +Graphics.prototype.setFontDate = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///wf///B///8H///wf//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAfwAAB+AAAAAAAAfwAAB/AAAH8AAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAADg8AAfH+AB//4A///gD//+AP//AA/w/gBPf+AB//4A///wB//8AH//AAfw8AAPDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAD4AAAfwAAD/h4B/+HwH/4/Af//+AP5/4A/n/gB8f8ADg/gAAD8AAADgAAAAAAAAAAAAAAAAAAAAAAAAB8AAAP4CAB/gcAH+D4Af4/wB/n+AH9/wAHv+AAB/wAAf8AAD/gAA/54AH/PwAf5/gB+H+ADw/4AEB/gAAH8AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAP4AB9/wAP//gB///AP//8A///4D///gH//+Af3/wAfP/AAAf8AAB/gAAP/AAB/8AAP/wAAfOAAAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAP4AAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBgAH///g////n////f///9/////8AB/fgAH8AAAPAAAAAAAAAAAAAAAAAAAAAAD9/AAf38AB/f///9////z///+H///wP//8AAAAAAAAAAAAAAAAAAAAAAAAFAAAA+AAAH8AAAfwAAB/AAAD8AAAEAAAAAAAAAAAAAAAAAAAAAAAAfAAAB8AAAHwAAAfAAA//wAD//AAP/8AA//wAD//AAAfAAAB8AAAHwAAAfAAAAAAAAAAAAAAAAAAAAAAABkAAAPwAAA/AAAB4AAACAAAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAAAAAAAAAAAAAAAAAAAAACAAAAeAAAD4AAAPgAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAPAAAD+AAA/4AAP/wAD//AB//wAf/8AH//AB//wAf/8AA//AAD/wAAH8AAAeAAAAgAAAAAAAAAAAAAAAAAAAAAAAA8AAAP8AAD/4AEP/wAd//gD9//AP9/8A/9/wD/7/AP/78Af/7wA//CAB/8AAD/AAADwAAAAAAAAAAAAAAAAAAAABwAAAPAAAB8AAAH3//+ff//59///n3//+Pf//4d///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAD8B4AfwfgH/B+A/8P4P/w/j//D+//8P//vw//4/D/+B8H/gHwf8AfAfAA8AAAAAAAAAAAAAAfgAPx/AB/H8AH8fwAPwH/f/H///8f///x/+//H/7/8P/H/gf8P8A/APgAAAAAAAAAAAAAAAAAAAAAAAAD8AAA/8AAH/4AA//gAD//AAf/9/h///+H///4f///h//8AAD/gAAP+AAA/4AAD/gAAAAAAAAAAAAAAAAAAAAAAAAf/4PB//g/n/+D+f/4P5/gf/n/B/+f8H/5/wP/AAAf4AAA/AAAAAAAAAAAAAAAAAAAAAAAAAA8AAAP8AAD/8AAf/4AD//wAP//gB//+AH//8A///wD///AP//8A///wAAP/AAD/+AAH/4AAf/AAB/8AAD/gAAH+AAAPgAAAAAAAAAAAAAAAAAAAAeAAD/4AAP/gAA/+AAB/4AAAAAM+f///5////n///+f///5////n///+f5AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AP4H+B/w/8P/n/4////n///+f///4AAAAH/9/+P///4/+f/j/5/+H/D/wH4H+AAAHgAAAAAAAAAAAAAAAAAAAA/AAAP/AAB/+AAP/4AA//wAH//AAf/8AB//wAH///wf///B///8H///wP//+A///4B///gD//8AP//gAP/4AAf+AAAPAAAAAAAAAAAAAAAAAAAAAAGAwAA8HgAH4+AAfD4AA4HAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAB4+AAPn4AA+PgABwcAAAAAAAAAAAAAAAAAAAAABgAAAOAAAB8AAAf4AAD/wAAf/AAD/+AAfz8AA8HwADgfgAEA+AAABgAAAAAAAAAAAAAAAAAAAAHj4AAfPgAB8+AAHz4AAfPgAB8+AAHz4AAfPgAB8+AAHz4AAfPgAB8+AAHj4AAAAAAAAAAAAAAAAAAAAAAAAAAAYAAQDwADgfgAfD8AB/fgAD/8AAH/wAAP+AAAfwAAA+AAABwAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAf8AAD/wAAf/gAB/+AAH/4AgA//3B///cH//9wf//3A//8YD/+AAH/4AAP+AAAPgAAAAAAAAAAAAAAAAAD8AAA/8AAH/4AA//wAH8fgAfu+AAf98AOf7wA///ADn/8AO//wA///AD//YAP/8AA/gMAB//wAD//AAH/4AAP/AAAPwAAAAAAAAAAAAAAAAAAAAP///h///+P///5////n///+f//AB+D8AH///+f///4////h///+B///4AAAAAAAAAAAAAAAAAAAAAAAf///j////P///8////z////P///8////z///AP///+f///5////D/5/8H/H/gPwH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAA//gAH//AA//+AH//8A///4D///gf///B///8H///wf///B/gH8H+Afwf4B/BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//8A////D///8P///w////B///8H///gP//+A///wB//+AD//wAD/8AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////n///+f///5////n///+f///5////n/fP+f9+/5/37/n/AP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAf///5////n///+f///5////n///+f///5/z8AH/PwAf8AAAAAAAAAAAAAAAAAAAAAAA/gAAP/wAD//wAf//gD///Af//+B///4P///w////H///8f///x////H///8f4H/x/gf/D+B/8AAHAAAAcAAABwAAAHAAAAAAAAAAAAAAAAAAAAAAABgH///gf//+B///4H///gf//+B///4AB+AAf/9+B///4H///gf//+B///4H///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8P///w////D///8P///w////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAfAAAB+AAAH4AAAfgAAB+f///5////n///+f///x///8AAAAAAAAAAAAAAAAAAAAAAAAAAANH///8f///x////H///8f///x////H//+AAH/8AA//4AH//wA///gD//+Af//8B///wH///Af//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX5////n///+f///5////v///+////5//7/gAAP+AAA/4AAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAvh///+P///5////n///+f///5/wAAD+AAAP8AAAfwAAD/AAAP4AAB////n///+f///5////j///+H///4AAAAAAAAAAAAAAAAAAAAAAAH///gf//+B///4H///gf//+B///4B//4AB//4B///4H///gf//+B///4H///gf//+B///4AAAAAAAAAAAAAAAD/AAA//gAH//AA//+AH//8Af//wD///gf//+B///8H///wf///B/z/8H//wAf///B///8H///wf///A///8D///gH//8AP//wAf/+AA//gAA/4AAAAAAAAAAAAAAAAAA/x////H///8f///x////H///8f///x//gAH/+AAf/4AA//gAB/8AAD/gAAH8AAAAAAAAAAAAAAAAAAAAAAAcAAAP8AAD/8AA//8AH//4Af//wD///AP//+B///4H///wf///B///8H//+Af///B///8H///wf///A///8D///gH//+Af//4A///gB//+AB//4AB/PgAAAYAAAAAAAAAAAAAAAAAAAP///5////n///+f///5////n///+P///4////D///+P///4////h/9/+D/gAAD4AAAAAAAAAAAAAAAAAAAAAAAAAADwAAA/wAAH/gAA//AfH/8D8f/4f5////n+P/+f4P/5/g//j8D/8DgH/wAAP8AAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAfAAAB8//8H///wf///B///8H///wf//AB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAB///8H///8f///5////n///+AAAH5////n///+f///x////H///wf/gAAAAAAAAAAAAAAAAQAAAD8AAAP/AAA//wAH//8Af//+B////gf//+AP//4AP//gP//+P///5////n///gP//gA//AAD/gAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+D///8P///4////j///+PAAfwAAB/AAAH4AAAfw////j//++P//74///vj///8AAB7AAAAAAAAAAAAAAAAAAAAAAAAAAABgeAA+B/AP8P/n/w////j///+H///gH//4D///8P///4////h/4/8H8AfwPAAOAgAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAHwAAAfgAAB/AAAH8H/wf///B///8H///wf///B///8H/8cAfwAAB+AAAHwAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAABwAAAHAAD8cAD/xwD//HH//+f///5////n///+P//w4f/wDh/gAOHgAA4AAADgAAAOAAAAAAAAAAAAAA///+////////////////////////+AAA/wAAD/gAAP+AAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAA/AAAD/AAAf/AAB//gAD//gAD//gAD//gAD//gAD//gAD//AAD/4AAB/AAAB8AAABgAAAAAAAAAAAAAAAAAAOAAAe4AAB7gAAHuAAAe////7////v///+////7////v///YwAAAAAAAA="), 32, atob("HA4NFhEaFwoNDQsRCRALFBMPEBESEBgSExgKCRARERIXEhQVExEPGBMOERYRFhQaExwUExARFRYTFhMPFA4="), 28+(scale<<8)+(1<<16)); + return this; +} + + // timeout used to update every minute var drawTimeout; @@ -25,35 +32,49 @@ function queueDraw() { } -function draw() { - var x = g.getWidth()/2; - var y = 24+20; - - g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); - if (g.getWidth() == IMAGEWIDTH) - g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); - else { - let scale = g.getWidth()/IMAGEWIDTH; - y *= scale; - g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT*scale,{scale:scale}); +function drawBorderString(str, x, y, bw, fc){ + g.setColor("#000"); + for(var i=-bw; i{};wd.area="";} + var x = g.getWidth()/2; + var y = g.getHeight()/2-20; + + g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); + g.drawImage(getImg(),0,0); + var date = new Date(); - var timeStr = require("locale").time(date,1); - var dateStr = require("locale").date(date).toUpperCase(); - // draw time - g.setFontAlign(0,0).setFont("ZCOOL"); - g.drawString(timeStr,x,y); - // draw date - y += 35; - g.setFontAlign(0,0,1).setFont("6x8"); - g.drawString(dateStr,g.getWidth()-8,g.getHeight()/2); + var timeStr = locale.time(date,1); + g.setFontAlign(0,0); + g.setFontTime(); + drawBorderString(timeStr, x, y, 5, "#fff"); + + y += 50; + x = x - g.stringWidth(timeStr) / 2 + 5; + g.setFontDate(); + g.setFontAlign(-1,0); + var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); + var fc = Bangle.isLocked() ? "#0ff" :"#fff"; + fc = E.getBattery() < 50 ? "#f00" : fc; + drawBorderString(dateStr, x, y, 3, fc); + // queue draw in one minute queueDraw(); } +Bangle.loadWidgets(); + // Clear the screen once, at startup -g.setTheme({bg:"#f0f",fg:"#fff",dark:true}).clear(); +g.setTheme({bg:"#fff",fg:"#fff",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on @@ -65,8 +86,15 @@ Bangle.on('lcdPower',on=>{ drawTimeout = undefined; } }); + + +Bangle.on('lock', function(isLocked) { + print("LOCK"); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + + // Show launcher when middle button pressed Bangle.setUI("clock"); -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); diff --git a/apps/90sclk/app.png b/apps/90sclk/app.png index ff43bb10655c67224603dec35559aac7b98fc560..29875b1dceaa209aa7aaad86d60402290ee0f9cc 100644 GIT binary patch literal 4238 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 M07*qoM6N<$g2mI7k^lez diff --git a/apps/90sclk/bg.png b/apps/90sclk/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebf755ad53d9a2f452b8fb2be6f19589986f318 GIT binary patch literal 37016 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 literal 2884 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 iR539+GBi3hI4dwQIxsMs^94u%0000 Date: Wed, 23 Mar 2022 19:18:42 +0100 Subject: [PATCH 040/174] Fixed lcars --- apps/lcars/lcars.app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 77321f19c..357070fdc 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -618,6 +618,8 @@ function increaseAlarm(){ } else { settings.alarm = getCurrentTimeInMinutes() + 5; } +} + function feedback(){ Bangle.buzz(40, 0.3); From d93646abd7f9dcdded6e6351d6b50f9a7f9c41d1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Mar 2022 21:36:15 +0100 Subject: [PATCH 041/174] Show steps. Performance improvement --- apps/90sclk/app.js | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 02a35e69f..76676b49a 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -32,32 +32,49 @@ function queueDraw() { } -function drawBorderString(str, x, y, bw, fc){ +function drawBorderString(str, x, y, b, fc){ g.setColor("#000"); - for(var i=-bw; i{};wd.area="";} - var x = g.getWidth()/2; + var x = g.getWidth()/2-5; var y = g.getHeight()/2-20; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); g.drawImage(getImg(),0,0); + // Draw time var date = new Date(); var timeStr = locale.time(date,1); g.setFontAlign(0,0); g.setFontTime(); drawBorderString(timeStr, x, y, 5, "#fff"); + // Draw date y += 50; x = x - g.stringWidth(timeStr) / 2 + 5; g.setFontDate(); @@ -67,6 +84,11 @@ function draw() { fc = E.getBattery() < 50 ? "#f00" : fc; drawBorderString(dateStr, x, y, 3, fc); + // Draw steps + g.setFontAlign(1,1); + var steps = parseInt(getSteps() / 1000); + drawBorderString(steps, g.getWidth()-10, g.getHeight()-10, 3, "#f0f"); + // queue draw in one minute queueDraw(); } From 034026019ad845fd59ad274d8f7465358c3ec507 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:07:29 +0100 Subject: [PATCH 042/174] Minor changes --- apps/90sclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 76676b49a..750a129b6 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -61,7 +61,7 @@ function getSteps() { function draw() { for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} - var x = g.getWidth()/2-5; + var x = g.getWidth()/2; var y = g.getHeight()/2-20; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); From 12678604206308f03c97f2022619c75e9c1fe606 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:14:30 +0100 Subject: [PATCH 043/174] Added settings for fullscreen mode --- apps/90sclk/ChangeLog | 3 ++- apps/90sclk/README.md | 9 +++++++++ apps/90sclk/app.js | 28 +++++++++++++++++++++++++--- apps/90sclk/metadata.json | 8 +++++--- apps/90sclk/settings.js | 31 +++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 apps/90sclk/settings.js diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog index 2286a7f70..feb008f5f 100644 --- a/apps/90sclk/ChangeLog +++ b/apps/90sclk/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Fullscreen settings. \ No newline at end of file diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 55fe21ce6..6f820886a 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -1,4 +1,13 @@ # 90s Clock +A watch face in 90s style: + ![](screenshot.png) + +# Settings +In the settings you can enable / disable the fullscreen mode. + + +## Creator +- [David Peer](https://github.com/peerdavid) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 750a129b6..367d77502 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -1,4 +1,19 @@ +const SETTINGS_FILE = "90sclk.setting.json"; const locale = require('locale'); +const storage = require('Storage'); + + +/* + * Load settings + */ +let settings = { + fullscreen: false, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} function getImg() { @@ -60,9 +75,9 @@ function getSteps() { function draw() { - for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} var x = g.getWidth()/2; - var y = g.getHeight()/2-20; + var y_offset = settings.fullscreen ? 0 : 10; + var y = g.getHeight()/2-20 + y_offset; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); g.drawImage(getImg(),0,0); @@ -89,6 +104,13 @@ function draw() { var steps = parseInt(getSteps() / 1000); drawBorderString(steps, g.getWidth()-10, g.getHeight()-10, 3, "#f0f"); + // Draw widgets if not fullscreen + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } + // queue draw in one minute queueDraw(); } @@ -96,7 +118,7 @@ function draw() { Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#fff",fg:"#fff",dark:false}).clear(); +g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json index f3cf33eae..95ef96ccf 100644 --- a/apps/90sclk/metadata.json +++ b/apps/90sclk/metadata.json @@ -1,8 +1,9 @@ { "id": "90sclk", "name": "90s Clock", - "version": "0.01", - "description": "A clock in 90s style", + "version": "0.02", + "description": "A 90s style watch-face", + "readme": "README.md", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "type": "clock", @@ -11,6 +12,7 @@ "allow_emulator": true, "storage": [ {"name":"90sclk.app.js","url":"app.js"}, - {"name":"90sclk.img","url":"app-icon.js","evaluate":true} + {"name":"90sclk.img","url":"app-icon.js","evaluate":true}, + {"name":"90sclk.settings.js","url":"settings.js"} ] } diff --git a/apps/90sclk/settings.js b/apps/90sclk/settings.js new file mode 100644 index 000000000..8f97cd317 --- /dev/null +++ b/apps/90sclk/settings.js @@ -0,0 +1,31 @@ +(function(back) { + const SETTINGS_FILE = "90sclk.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + fullscreen: false, + }; + let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; + for (const key in saved_settings) { + settings[key] = saved_settings[key] + } + + function save() { + storage.write(SETTINGS_FILE, settings) + } + + + E.showMenu({ + '': { 'title': '90s Clock' }, + '< Back': back, + 'Full Screen': { + value: settings.fullscreen, + format: () => (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + } + }); + }) From c32040c3118b47079689c26f497621e2b488e0f5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:19:18 +0100 Subject: [PATCH 044/174] Minor changes --- apps/90sclk/README.md | 8 ++++---- apps/90sclk/metadata.json | 2 +- apps/90sclk/screenshot_2.png | Bin 0 -> 5412 bytes 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 apps/90sclk/screenshot_2.png diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 6f820886a..c09c6fe23 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -2,12 +2,12 @@ A watch face in 90s style: +![](screenshot_2.png) + +Fullscreen mode can be enabled in the settings: + ![](screenshot.png) -# Settings -In the settings you can enable / disable the fullscreen mode. - - ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json index 95ef96ccf..fb2824a6f 100644 --- a/apps/90sclk/metadata.json +++ b/apps/90sclk/metadata.json @@ -5,7 +5,7 @@ "description": "A 90s style watch-face", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_2.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], diff --git a/apps/90sclk/screenshot_2.png b/apps/90sclk/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9646b11683a95eee86a16dba9344cae669ed8996 GIT binary patch literal 5412 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 Date: Fri, 25 Mar 2022 17:22:39 +0100 Subject: [PATCH 045/174] Add black and white clock --- apps/bwclk/ChangeLog | 1 + apps/bwclk/README.md | 7 +++ apps/bwclk/app-icon.js | 1 + apps/bwclk/app.js | 97 ++++++++++++++++++++++++++++++++++++++ apps/bwclk/app.png | Bin 0 -> 4238 bytes apps/bwclk/metadata.json | 17 +++++++ apps/bwclk/screenshot.png | Bin 0 -> 6093 bytes 7 files changed, 123 insertions(+) create mode 100644 apps/bwclk/ChangeLog create mode 100644 apps/bwclk/README.md create mode 100644 apps/bwclk/app-icon.js create mode 100644 apps/bwclk/app.js create mode 100644 apps/bwclk/app.png create mode 100644 apps/bwclk/metadata.json create mode 100644 apps/bwclk/screenshot.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog new file mode 100644 index 000000000..2286a7f70 --- /dev/null +++ b/apps/bwclk/ChangeLog @@ -0,0 +1 @@ +0.01: New App! \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md new file mode 100644 index 000000000..49ee7f593 --- /dev/null +++ b/apps/bwclk/README.md @@ -0,0 +1,7 @@ +# Black & White clock + +![](screenshot.png) + + +## Creator +- [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js new file mode 100644 index 000000000..28f75c4e6 --- /dev/null +++ b/apps/bwclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js new file mode 100644 index 000000000..709597a0b --- /dev/null +++ b/apps/bwclk/app.js @@ -0,0 +1,97 @@ +const locale = require('locale'); + + +// timeout used to update every minute +var W = g.getWidth(); +var H = g.getHeight(); +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + + +function getSteps() { + try{ + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } else if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom.getSteps(); + } + } catch(ex) { + // In case we failed, we can only show 0 steps. + } + + return 0; +} + + +function draw() { + // Hide widgets + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + + // Clear old watch face + var x = W/2; + var y = H/2-20; + g.reset().clearRect(0,0,W,W); + + // Draw background + g.setColor("#000"); + g.fillRect(0,0,W/2,H/2); + g.setColor("#fff"); + g.fillRect(W/2,H/2,W/2,H/2); + + // // Draw time + // var date = new Date(); + // var timeStr = locale.time(date,1); + // g.setFontAlign(0,0); + // g.setFontTime(); + // g.drawString(timeStr, x, y); + + // // Draw date + // y += 50; + // x = x - g.stringWidth(timeStr) / 2 + 5; + // g.setFontDate(); + // g.setFontAlign(-1,0); + // var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); + // var fc = Bangle.isLocked() ? "#0ff" :"#fff"; + // fc = E.getBattery() < 50 ? "#f00" : fc; + // g.drawString(dateStr, x, y); + + // queue draw in one minute + queueDraw(); +} + +Bangle.loadWidgets(); + +// Clear the screen once, at startup +g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + + +Bangle.on('lock', function(isLocked) { + print("LOCK"); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + + +// Show launcher when middle button pressed +Bangle.setUI("clock"); diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..29875b1dceaa209aa7aaad86d60402290ee0f9cc GIT binary patch literal 4238 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 literal 0 HcmV?d00001 From d3dcc50071a5ef549846aed8ce15c92d55f4681a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 17:23:54 +0100 Subject: [PATCH 046/174] Fixed invalid json --- apps/bwclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 0d48401c6..d570fb2d2 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -12,6 +12,6 @@ "allow_emulator": true, "storage": [ {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, + {"name":"bwclk.img","url":"app-icon.js","evaluate":true} ] } From c2bce25a424440a28ce01b92a89f0414e8086c10 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 17:57:19 +0100 Subject: [PATCH 047/174] Finished V1 --- apps/bwclk/app.js | 63 ++++++++++++++++++++++++-------------- apps/bwclk/app.png | Bin 4238 -> 2103 bytes apps/bwclk/screenshot.png | Bin 6093 -> 2882 bytes 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 709597a0b..ec00b46fd 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,5 +1,18 @@ const locale = require('locale'); +// Manrope font +Graphics.prototype.setLargeFont = function(scale) { + // Actual height 41 (42 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); + return this; +}; + +Graphics.prototype.setSmallFont = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); + return this; +}; + // timeout used to update every minute var W = g.getWidth(); @@ -36,33 +49,37 @@ function draw() { // Hide widgets for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} - // Clear old watch face - var x = W/2; - var y = H/2-20; - g.reset().clearRect(0,0,W,W); - // Draw background - g.setColor("#000"); - g.fillRect(0,0,W/2,H/2); + g.reset().clearRect(0,0,W,W); g.setColor("#fff"); - g.fillRect(W/2,H/2,W/2,H/2); + g.fillRect(0,0,W,H/5*2); - // // Draw time - // var date = new Date(); - // var timeStr = locale.time(date,1); - // g.setFontAlign(0,0); - // g.setFontTime(); - // g.drawString(timeStr, x, y); + // Draw time + g.setColor("#fff"); + g.setLargeFont(); + g.setFontAlign(0,0); + var date = new Date(); + var timeStr = locale.time(date,1); + g.drawString(timeStr, W/2, H/5*2 + 40); - // // Draw date - // y += 50; - // x = x - g.stringWidth(timeStr) / 2 + 5; - // g.setFontDate(); - // g.setFontAlign(-1,0); - // var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); - // var fc = Bangle.isLocked() ? "#0ff" :"#fff"; - // fc = E.getBattery() < 50 ? "#f00" : fc; - // g.drawString(dateStr, x, y); + // Draw Steps + g.setSmallFont(); + g.setFontAlign(0,0); + g.drawString(getSteps(), W/2, H/5*4 + 10); + + // Draw date + g.setColor("#000"); + g.setSmallFont(); + g.setFontAlign(0,1); + var y = H/5+30; + g.drawString(locale.dow(date, true), W/2-55, y); + var monthStr = date.getMonth()+1; + + monthStr = monthStr < 10 ? "0" + monthStr : monthStr; + g.drawString(monthStr, W/2+55, y); + + g.setLargeFont(); + g.drawString(date.getDate(), W/2, y+7); // queue draw in one minute queueDraw(); diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index 29875b1dceaa209aa7aaad86d60402290ee0f9cc..cbe7fa8978429136351c0f09dd6becfea57b8b01 100644 GIT binary patch delta 2075 zcmV+$2;}#UA-52aGk*u}Nkl86k90Gqrp9m)6{$(fJ|LB%tc5Jm zrKHgp!^$%H$D*);6pZM@polCmKcI*p5-O7{YnV|=m`-!nVtrT?YHGSPoh+aCkMf6m z_t9GmLg>I@zkBX;?>T4Z+ktCCnlI$>lirkJsdwV+oKqL|gvhm*l@bu|Z zOq(_hRaI3m8jT1F3c{K-YvAYS=dOCk5jcGKFe4%&s8lMsefxGnZZsNs;=~D;|44g# zJHx`l7#JAHo}M0(-=l;dc`uPj2!PSi(d_K(v>AK)^nYnaMn*C&E{^r}^)#7GR4SEJ zDwR|y6n1!$bm+joefwBhSt+zjN=kU_*fACr74gQ68%~X{uCC_HnKLPoNT}241o@#u zhnSw8&g$xFc6N61{Q2_~i9}qxcCCQv?d|25*RSK{%a_n-G`M!{8Wt{G2$@US_Q$OiT<-2Axia;NW0fx^xNm?%jh{s}<()^72AQM+ZKA`h@!WdISarqOGkB@87>iLP7%i z`+xf}I5=o;fTO%RdGaJ5Ja{0qckI}~&dyFge*Bn6j~=zbj$fev%VXPUK|uk%y}c$=J6f~JkHglDflu)TuQl(O{si}!(vzc10mP)0PM~)nExDAU)_wEB%uU^I1 zuU{SZB_}5%Ffb4R@aWMaoIigaqobpkJ%4*Pva_=xlgZps4FGW4fxk@?z8V$%D6}Rl ziST{FO<0=nDKz07a9NFphK3?DGZTJ(emHXE2+U?PHf-2{ef##=VFv~VkeHYVv)OFd z=j-c>yu3U+`QYH7U73-Qk%9R5c*x~))YjJG*s)_685wcugu_E9At8b9-o3Lsuzxmh z-b{nRz}D7Q8Vm*+3?9H1u0!Azrv#6+uqobqj>+9p& zw{J<3_4V~m56U0xxTCVNl8udxLRISQ#0?D%<;chg@7=rSRLPhFg@uKb%jE*gWHJG> zYSk)|WJN^I4<0{$+@%9~d3hvBl}hDQNo;H^ zNm8v=JH?FMj{^b%erB)@J6*&L4Gpkbt)o*uQ^2JUr}|;JkVB1kAZ}=MWMS;?f4Uu9O;$26N`jL4Qt84n{{u z1^L5=4;?B6CN~P@X?&jUQ zcYl2i{ET+(+6A##jH03vd1%Fj471PtxX)>8? z(r?kCMI_1BuU|7UF_9{jij9qpv{)=$xpL*7O`)+pd(WOd4#$kYc>$oOrzg*zJ!^BL z>hA7lYHF&@xV?M#(rh*hnBn1J78De?wC|_Y=;Xe1idZ--GR6j-rh1pwg5lP7ro{JG0H|CQ5!o7{3>#*7)z z>-Es<^=NNzM{sa3R<2x$y1F{Fw6q{2BLe`iapOj`wzi_Nu@Oq864}|=(ChVRX=%Zg zD_7ih;9zwY9aJKYu<$LPGfB#S4nXVt*QqMg|85Q>|9>^5x6I zSglqoyk!3_yZt)7b?a6{MMa^hsR;n!=jVrK&z`|*wPI*!2qKXPw{G1+O-&7gf`X8l znJJ7-OG`smR+hUaxEBF$Z*O{ed9kXhieX`4Y-(x}w$QQf=H_OGhlevYHI=2MrNT+< zss#Uk*{wAY8GjjxWy_XfWMl;X{{E0iBDbWF!1VNV0$@^75}TWw zSyxxbS+iyl0B_v5!O4>+yB&dl=fK~le-8X@n(z+%7ZgCSjsX$Ymp=di002ovPDHLk FV1nvT3L5|b delta 4226 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

2$QTw4l{$NlQ!P#*G_%|NZxz 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 From ec40e5d8fdd11299d161b8d23033281dac7f4983 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 18:00:22 +0100 Subject: [PATCH 048/174] Show lock status. --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index ec00b46fd..eb95bc777 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -65,7 +65,7 @@ function draw() { // Draw Steps g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps(), W/2, H/5*4 + 10); + g.drawString(getSteps() + Bangle.isLocked() ? "L" : "", W/2, H/5*4 + 10); // Draw date g.setColor("#000"); From 288123d72934809857ccf401da3e73d76a656e6a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 18:05:17 +0100 Subject: [PATCH 049/174] Minor fix --- apps/bwclk/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index eb95bc777..6c7db898e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -65,7 +65,9 @@ function draw() { // Draw Steps g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps() + Bangle.isLocked() ? "L" : "", W/2, H/5*4 + 10); + var lock = Bangle.isLocked() ? "L" : ""; + var steps = getSteps(); + g.drawString(steps + lock, W/2, H/5*4 + 10); // Draw date g.setColor("#000"); From 0bd35cec29274bb3c5de179f5d3fcbfefee98e27 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Mar 2022 08:28:25 +0100 Subject: [PATCH 050/174] Improvements accordingly to the community --- apps/bwclk/ChangeLog | 3 ++- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 22 ++++++++++++++-------- apps/bwclk/metadata.json | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index 2286a7f70..1e1f155bb 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Use build in function for steps and other improvements. \ No newline at end of file diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index 28f75c4e6..a84b133d7 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) +require("heatshrink").decompress(atob("mEwgP/AD3vAonB4IFDnOLAod974FD/OfAYP9u/5wP1r/71/zzHt3/9q/H/n9r/63/P/nt7/9+8VzoLB/e/gOB8c/EoNV65RNRrGH8Eqh0AgPFsE/jsAgfAsEgjARBoFAuEQAoPA40umwFBoPEu4XBgHBwEjnGABYImBiHAgHDgUh2AFBocGusVAoPCgE+h4XBAAMUgpUO80zCwdFqILD9MxAocBBYkppQFDotQRrAAGA")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 6c7db898e..e022a1d2a 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -36,6 +36,8 @@ function getSteps() { return WIDGETS.wpedom.getSteps(); } else if (WIDGETS.activepedom !== undefined) { return WIDGETS.activepedom.getSteps(); + } else { + return Bangle.getHealthStatus("day").steps; } } catch(ex) { // In case we failed, we can only show 0 steps. @@ -71,17 +73,21 @@ function draw() { // Draw date g.setColor("#000"); - g.setSmallFont(); - g.setFontAlign(0,1); var y = H/5+30; - g.drawString(locale.dow(date, true), W/2-55, y); - var monthStr = date.getMonth()+1; - - monthStr = monthStr < 10 ? "0" + monthStr : monthStr; - g.drawString(monthStr, W/2+55, y); + g.setFontAlign(0,1); g.setLargeFont(); - g.drawString(date.getDate(), W/2, y+7); + var dateStr = date.getDate(); + g.drawString(dateStr, W/2, y+7); + var strW = g.stringWidth(dateStr); + + g.setSmallFont(); + g.setFontAlign(1,1); + g.drawString(locale.dow(date, true), W/2-strW/2, y); + + g.setFontAlign(-1,1); + var monthStr = locale.month(date, 1); + g.drawString(monthStr, W/2+strW/2, y); // queue draw in one minute queueDraw(); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index d570fb2d2..aefb1e531 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.01", + "version": "0.02", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", From 9f3935cb9e9edebc01474d0cacb8200c075da5e2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Mar 2022 08:31:06 +0100 Subject: [PATCH 051/174] Minor changes --- apps/bwclk/app.js | 1 - apps/bwclk/screenshot.png | Bin 2882 -> 2963 bytes 2 files changed, 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index e022a1d2a..eb61221d9 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -111,7 +111,6 @@ Bangle.on('lcdPower',on=>{ Bangle.on('lock', function(isLocked) { - print("LOCK"); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; draw(); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index f6d1d96e34df9dd506d9b7689ef7bfdae01666b2..84fb273b760489ecfbee271b5c7bc2b45a3feca0 100644 GIT binary patch literal 2963 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 Date: Sun, 27 Mar 2022 11:26:22 +0200 Subject: [PATCH 052/174] Finished V0.02 with fullscreen mode and optional lock icon --- apps/90sclk/app.js | 6 +-- apps/bwclk/README.md | 9 ++++ apps/bwclk/app.js | 86 +++++++++++++++++++++++++----------- apps/bwclk/lock.png | Bin 0 -> 9212 bytes apps/bwclk/metadata.json | 5 ++- apps/bwclk/screenshot.png | Bin 2963 -> 2693 bytes apps/bwclk/screenshot_2.png | Bin 0 -> 3113 bytes apps/bwclk/settings.js | 40 +++++++++++++++++ 8 files changed, 116 insertions(+), 30 deletions(-) create mode 100644 apps/bwclk/lock.png create mode 100644 apps/bwclk/screenshot_2.png create mode 100644 apps/bwclk/settings.js diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 367d77502..6babbfec2 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -75,6 +75,9 @@ function getSteps() { function draw() { + // queue draw in one minute + queueDraw(); + var x = g.getWidth()/2; var y_offset = settings.fullscreen ? 0 : 10; var y = g.getHeight()/2-20 + y_offset; @@ -110,9 +113,6 @@ function draw() { } else { Bangle.drawWidgets(); } - - // queue draw in one minute - queueDraw(); } Bangle.loadWidgets(); diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 49ee7f593..18c87d7e8 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -3,5 +3,14 @@ ![](screenshot.png) +In the settings, fullscreen mode can be enabled and disabled: + +![](screenshot_2.png) + +Additionally, in fullscreen mode a lock icon can be shown... + +## Thanks to +Lock icons created by Those Icons - Flaticon + ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index eb61221d9..b1f433c12 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,4 +1,25 @@ +const SETTINGS_FILE = "bwclk.setting.json"; const locale = require('locale'); +const storage = require('Storage'); + + +/* + * Load settings + */ +let settings = { + fullscreen: true, + showLock: true, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} + + +/* + * Assets + */ // Manrope font Graphics.prototype.setLargeFont = function(scale) { @@ -13,6 +34,12 @@ Graphics.prototype.setSmallFont = function(scale) { return this; }; +var imgLock = { + width : 16, height : 16, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) +}; + // timeout used to update every minute var W = g.getWidth(); @@ -48,37 +75,23 @@ function getSteps() { function draw() { - // Hide widgets - for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + // queue draw in one minute + queueDraw(); // Draw background + var yOffset = settings.fullscreen ? 0 : 10; + var y = H/5*2 + yOffset; g.reset().clearRect(0,0,W,W); - g.setColor("#fff"); - g.fillRect(0,0,W,H/5*2); - - // Draw time - g.setColor("#fff"); - g.setLargeFont(); - g.setFontAlign(0,0); - var date = new Date(); - var timeStr = locale.time(date,1); - g.drawString(timeStr, W/2, H/5*2 + 40); - - // Draw Steps - g.setSmallFont(); - g.setFontAlign(0,0); - var lock = Bangle.isLocked() ? "L" : ""; - var steps = getSteps(); - g.drawString(steps + lock, W/2, H/5*4 + 10); + g.setColor("#000"); + g.fillRect(0,y,W,H); // Draw date + var date = new Date(); g.setColor("#000"); - var y = H/5+30; - g.setFontAlign(0,1); g.setLargeFont(); var dateStr = date.getDate(); - g.drawString(dateStr, W/2, y+7); + g.drawString(dateStr, W/2, y+5); var strW = g.stringWidth(dateStr); g.setSmallFont(); @@ -89,14 +102,37 @@ function draw() { var monthStr = locale.month(date, 1); g.drawString(monthStr, W/2+strW/2, y); - // queue draw in one minute - queueDraw(); + // Draw time + g.setColor("#fff"); + g.setLargeFont(); + g.setFontAlign(0,-1); + var timeStr = locale.time(date,1); + g.drawString(timeStr, W/2, y+10); + + // Draw Steps + y += H/5*2+10; + g.setSmallFont(); + g.setFontAlign(0,0); + g.drawString(getSteps(), W/2, y); + + // Draw lock + if(settings.showLock && Bangle.isLocked()){ + g.setColor("#000"); + g.drawImage(imgLock, 2, 2); + } + + // Draw widgets if not fullscreen + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } } Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); +g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on diff --git a/apps/bwclk/lock.png b/apps/bwclk/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2c8407e79bd5f67969487c1028db745fca11fa GIT binary patch literal 9212 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 HbLsy8P0)rp literal 0 HcmV?d00001 diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index aefb1e531..3fe04c4d5 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -5,13 +5,14 @@ "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], "allow_emulator": true, "storage": [ {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true} + {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, + {"name":"bwclk.settings.js","url":"settings.js"} ] } diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 84fb273b760489ecfbee271b5c7bc2b45a3feca0..5a3c17c868b9710cf95b1518d9122efc3485a798 100644 GIT binary patch literal 2693 zcmcgu`#aS67k__dOzyWrg^?u{vuup(WGsb|E@F{e(_km-QpRQ&GcF(LBDs{PP{^Gz zGp52+OkE7Nn7~ri!xmkto78)a*wo8i3>|3V?uk*dbSzwB!Fo z*`n2z6|(l*&(~z!gU*k3z{QDl;ge2#;9%FQcw6?a*vgw^|G36{!CnR4N1RfoCjpSEy*Y@vP;h_HmEuUddfU=C`U8V-bD0r9T{)}G** zs#p@UXo$^FsQ6f=o8VwleCvH{$Bv&?dV=wYdIZg?x17>XEAl+k-tzzHD ztzT{PT{WS8-;4NU*P+>Mf6}7S$r!!%1d5=VLOklbJZGQya2_<(@g1W94r}> z)dUhJsDSS)m1q9URFy8JAuN(uQhDDL-(B7SmPP%#9w60V{j(XEG|q^%!I0f?&A@Nt z!kHX{0xo0OxZAVTw7c`4xD}OQQSMJ>0 z`S!xA&yNeMw>~871-^N$nM;L}=6kSlgxYRnaZvsWJ^&AiXVAQtmVF_J%$UoVR{DIIB~b` z4X%ULndg}U9NNL2b>C(GyM6ex6-UmrXIqjgTs;U2t+L35(XT&TU!8LH!CHh8oD##} z_>1u$(V`3b!$A|o>T@cX_?6Go+J<9L!^aSEP{mH6kwvKLExaYZj(uvh5?PX*eA>uZ zL7Un-#H$Gcwt}pE*ay4fEIxnf*m0xt^73g_m5hWatMJ*PEj<&xlS$xf#p+3C@gF$s z&AOc@)Acg6y02bnMwKyhVm7&8sxWGDwxCOdFJm^Ayv#z}kGh^7;9&0h+2{PIRbkygNlb5%6NEu* zA)~7`x<}RRFn@!FvcB-6y9HX_H`M$h?a2GD5GKU|O7JmEvT8c;OEuO8T(Ih4)VkR@Vt5R5MfQAvsWKcb)9^qZ zUTY2pL6E3FDMw8qajKH7PoG3Coi>7O>nLv5jw; zW5rv-nR>t)WaHS7ZCD_*=py_yA4o4Mt*^~|TMZ-*p5Kk>iUx8Ab*8QsXU z-8ghzO~lXw9ta-w3$y4Dy4fa|{|Q=K?h$nC`m1L3geGq~#zE$*p0WU)@^XC$I{bC*GatXFQqS>`!YFe`zxg4x*0k`$fRgzB~ zex9pmt^~X246<>3#`!5-K>YqPL@^NH8yfZJukO9oJhvZ+hj3dr6Nt9OcGnT8IO(5@ hr)IbO?~K~!cBT@d+B+t%L+UHRVVC31?1Q8W{{p+I;AQ{- literal 2963 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 (settings.showLock ? 'Yes' : 'No'), + onchange: () => { + settings.showLock = !settings.showLock; + save(); + }, + }, + 'Full Screen': { + value: settings.fullscreen, + format: () => (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + } + }); + }) From 2583bdd4afc0f2c9c89ee678586136083e5235fb Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:26:34 +0200 Subject: [PATCH 053/174] Minor chnages --- apps/bwclk/lock.png | Bin 9212 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/bwclk/lock.png diff --git a/apps/bwclk/lock.png b/apps/bwclk/lock.png deleted file mode 100644 index 8c2c8407e79bd5f67969487c1028db745fca11fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9212 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 HbLsy8P0)rp From d51fd882466376dce27d1e3c5cb3f315fb14d4f1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:29:37 +0200 Subject: [PATCH 054/174] Set defaults correctly --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index b1f433c12..3a89bc68f 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -7,7 +7,7 @@ const storage = require('Storage'); * Load settings */ let settings = { - fullscreen: true, + fullscreen: false, showLock: true, }; From bceb2949bf46928498251a1c8e9bfc5abd75c3b7 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:53:27 +0200 Subject: [PATCH 055/174] Optional timer if qalarm is installed --- apps/bwclk/README.md | 2 ++ apps/bwclk/app.js | 71 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 18c87d7e8..85f01c8fe 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -8,6 +8,8 @@ In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) Additionally, in fullscreen mode a lock icon can be shown... +If you installed the "qalarm" app, you can directly set a timer. Simply tab at +top / bottom of the screen. ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 3a89bc68f..39c6b1e17 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -56,7 +56,9 @@ function queueDraw() { } - +/* + * Handle alarm + */ function getSteps() { try{ if (WIDGETS.wpedom !== undefined) { @@ -74,6 +76,44 @@ function getSteps() { } +function isAlarmEnabled(){ + try{ + var qalarm = require('qalarm'); + return qalarm.isTimerStarted("bwclk"); + } catch(ex){ } + return false; +} + + +function getAlarmMinutes(){ + try{ + var qalarm = require('qalarm'); + return qalarm.getTimerMin("bwclk"); + } catch(ex){ } + return -1; +} + +function increaseAlarm(){ + try{ + var qalarm = require('qalarm'); + var mins = qalarm.getTimerMin("bwclk")+5; + qalarm.deleteTimer("bwclk"); + qalarm.editTimer("bwclk", 0, mins, 0); + } catch(ex){ } +} + +function decreaseAlarm(){ + try{ + var qalarm = require('qalarm'); + var mins = qalarm.getTimerMin("bwclk")-5; + qalarm.deleteTimer("bwclk"); + if(mins > 0){ + qalarm.editTimer("bwclk", 0, mins, 0); + } + } catch(ex){ } +} + + function draw() { // queue draw in one minute queueDraw(); @@ -109,11 +149,13 @@ function draw() { var timeStr = locale.time(date,1); g.drawString(timeStr, W/2, y+10); - // Draw Steps + // Draw steps or timer y += H/5*2+10; g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps(), W/2, y); + var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; + g.drawString(str, W/2, y); + // Draw lock if(settings.showLock && Bangle.isLocked()){ @@ -135,6 +177,8 @@ Bangle.loadWidgets(); g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); // draw immediately at first, queue update draw(); + + // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (on) { @@ -153,5 +197,26 @@ Bangle.on('lock', function(isLocked) { }); +Bangle.on('touch', function(btn, e){ + var upper = parseInt(g.getHeight() * 0.2); + var lower = g.getHeight() - upper; + + var is_upper = e.y < upper; + var is_lower = e.y > lower; + + if(is_upper){ + Bangle.buzz(40, 0.6); + increaseAlarm(); + draw(true); + } + + if(is_lower){ + Bangle.buzz(40, 0.6); + decreaseAlarm(); + draw(true); + } +}); + + // Show launcher when middle button pressed Bangle.setUI("clock"); From bf51d5ed7ae9407874b0cf0bda40a80381202270 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 28 Mar 2022 06:29:42 +0200 Subject: [PATCH 056/174] Minor improvement --- apps/bwclk/app.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 39c6b1e17..5da262d03 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -128,19 +128,16 @@ function draw() { // Draw date var date = new Date(); g.setColor("#000"); - g.setFontAlign(0,1); + g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); g.drawString(dateStr, W/2, y+5); - var strW = g.stringWidth(dateStr); g.setSmallFont(); - g.setFontAlign(1,1); - g.drawString(locale.dow(date, true), W/2-strW/2, y); - g.setFontAlign(-1,1); var monthStr = locale.month(date, 1); - g.drawString(monthStr, W/2+strW/2, y); + g.drawString(monthStr, W/2 + 5, y+2); + g.drawString(locale.dow(date, true), W/2 + 5, y-22); // Draw time g.setColor("#fff"); From c0c9f690b18675a990526fca199f5e4d31be1632 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 09:59:02 +0200 Subject: [PATCH 057/174] Create dentigrossi --- apps/dentigrossi | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/dentigrossi diff --git a/apps/dentigrossi b/apps/dentigrossi new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/dentigrossi @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From eafdef1782d6a5cd5932ef595a0a4a122ed4e325 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:06:10 +0200 Subject: [PATCH 058/174] Create dentispessi --- apps/dentispessi | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/dentispessi diff --git a/apps/dentispessi b/apps/dentispessi new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/dentispessi @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From dc2d576a352973c35dad1885a637e50361c4bb32 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:07:05 +0200 Subject: [PATCH 059/174] Create dentoni --- App_Denti/dentoni | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 App_Denti/dentoni diff --git a/App_Denti/dentoni b/App_Denti/dentoni new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/App_Denti/dentoni @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From f4c4f701906a5cc9229d5ceb25dbb63763373608 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:08:56 +0200 Subject: [PATCH 060/174] Create Dentix --- apps/AppDentus/Dentix | 94 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/AppDentus/Dentix diff --git a/apps/AppDentus/Dentix b/apps/AppDentus/Dentix new file mode 100644 index 000000000..5a026893c --- /dev/null +++ b/apps/AppDentus/Dentix @@ -0,0 +1,94 @@ +var counter = 30; +var counterInterval; +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # # # # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); + + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + g.setColor('#012345'); + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + outOfTime(); + return; + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + + if(counter<=5){ + immagine(); + } +} + + +function startTimer(){ + counter = 30; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +startTimer(); From 7cd02f6794daf16adde6bc881c34f8d3076513a7 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:15:51 +0200 Subject: [PATCH 061/174] Create appDenti.js --- apps/SuperDenti/appDenti.js | 99 +++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 apps/SuperDenti/appDenti.js diff --git a/apps/SuperDenti/appDenti.js b/apps/SuperDenti/appDenti.js new file mode 100644 index 000000000..556a35ac1 --- /dev/null +++ b/apps/SuperDenti/appDenti.js @@ -0,0 +1,99 @@ +var i = 0; +var counter = 10; +var counterInterval; + +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # ###### # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +g.setColor('#012345'); + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + // again, 10 secs later + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + g.clear(img); + outOfTime(); + return; + + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + if (counter<=5){ + immagine(); + } +} + + + +function startTimer() { + counter = 10; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); + + +} + + +startTimer(); From 1f4225a20230f982db457ce87421253631c64246 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:29:06 +0200 Subject: [PATCH 062/174] Create app.js --- apps/MegaDenti/app.js | 99 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 apps/MegaDenti/app.js diff --git a/apps/MegaDenti/app.js b/apps/MegaDenti/app.js new file mode 100644 index 000000000..556a35ac1 --- /dev/null +++ b/apps/MegaDenti/app.js @@ -0,0 +1,99 @@ +var i = 0; +var counter = 10; +var counterInterval; + +var img = Graphics.createImage(` + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +var img1 = Graphics.createImage(` + + + ### # ##### ## #### +# # # # # # # +# # ### # # #### +# # # ###### # # + ### #### ##### # # # # + + ##### ##### + # ##### # + # # + # # + ## ## + ## ## + ## ## + # #### # + # # # # + # # # # + ## ## + ## ## +`); +g.setColor('#012345'); + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.beep(200, 4000) + .then(() => new Promise(resolve => setTimeout(resolve,200))) + .then(() => Bangle.beep(200, 3000)); + // again, 10 secs later + setTimeout(outOfTime, 10000); + g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); +} + +function immagine(){ + g.drawImage(img1, 90, 20, {scale:2}); +} + +function countDown() { + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); + g.clear(img); + outOfTime(); + return; + + } + g.clear(); + g.setFontAlign(0,0); // center font + g.setFont("Vector",80); // vector font, 80px + // draw the current counter value + g.drawImage(img, 90, 20, {scale:2}); + g.drawString(counter,120,120); + g.drawLine(50,50,180,50); + g.drawLine(50,51,180,51); + g.drawLine(50,52,180,52); + // optional - this keeps the watch LCD lit up + Bangle.setLCDPower(1); + if (counter<=5){ + immagine(); + } +} + + + +function startTimer() { + counter = 10; + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); + + +} + + +startTimer(); From 3703a8d81f9e492b2328f51083a46c1c6b861360 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:32:36 +0200 Subject: [PATCH 063/174] Add files via upload --- apps/MegaDenti/brush-teeth.png | Bin 0 -> 42215 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/MegaDenti/brush-teeth.png diff --git a/apps/MegaDenti/brush-teeth.png b/apps/MegaDenti/brush-teeth.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c8e2baf15f33b5483693e0e97203505861fe84 GIT binary patch literal 42215 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 Mz+Aunj%&jI0i39MCjbBd literal 0 HcmV?d00001 From 1263a35facac55760aa26c5770fefb0223e0b0ec Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:50:47 +0200 Subject: [PATCH 064/174] Create app-icon.js --- apps/MegaDenti/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/MegaDenti/app-icon.js diff --git a/apps/MegaDenti/app-icon.js b/apps/MegaDenti/app-icon.js new file mode 100644 index 000000000..0b121d700 --- /dev/null +++ b/apps/MegaDenti/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("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")) From f07dcb49c36b093e87c8ff6a7bc0505b47dcaf6b Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:08:56 +0200 Subject: [PATCH 065/174] Create metadata.json --- apps/MegaDenti/metadata.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/MegaDenti/metadata.json diff --git a/apps/MegaDenti/metadata.json b/apps/MegaDenti/metadata.json new file mode 100644 index 000000000..eb184d789 --- /dev/null +++ b/apps/MegaDenti/metadata.json @@ -0,0 +1,12 @@ +{ "id": "MegaDenti", + "name": "Denti", + "shortName":"My Denti", + "icon": "brush-teeth.png", + "version":"0.01", + "description": "This is a description of my awesome teeths app", + "tags": "", + "storage": [ + {"name":"MegaDenti.app.js","url":"app.js"}, + {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} + ] +} From 72c670db137e82a7ca3eb9aca0a71c63f1b4d2da Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:13:25 +0200 Subject: [PATCH 066/174] Update metadata.json --- apps/MegaDenti/metadata.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/MegaDenti/metadata.json b/apps/MegaDenti/metadata.json index eb184d789..5e820a097 100644 --- a/apps/MegaDenti/metadata.json +++ b/apps/MegaDenti/metadata.json @@ -4,7 +4,9 @@ "icon": "brush-teeth.png", "version":"0.01", "description": "This is a description of my awesome teeths app", - "tags": "", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", "storage": [ {"name":"MegaDenti.app.js","url":"app.js"}, {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} From 3ad2ea625013fd30d9240d0eb75eab0c2d702eea Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:24:00 +0200 Subject: [PATCH 067/174] Create README.md --- apps/MegaDenti/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/MegaDenti/README.md diff --git a/apps/MegaDenti/README.md b/apps/MegaDenti/README.md new file mode 100644 index 000000000..eaee2a98c --- /dev/null +++ b/apps/MegaDenti/README.md @@ -0,0 +1,2 @@ +Denti : +This teeth washing assistan helps you to wash your teeth From e405ac350ea182e0859a7f8f68fa3076b2230b6d Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:28:33 +0200 Subject: [PATCH 068/174] Create ChangeLog --- apps/MegaDenti/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/MegaDenti/ChangeLog diff --git a/apps/MegaDenti/ChangeLog b/apps/MegaDenti/ChangeLog new file mode 100644 index 000000000..7f28ed46d --- /dev/null +++ b/apps/MegaDenti/ChangeLog @@ -0,0 +1 @@ +0.01: Create New App ! From 20cfb3329cafadf2725db20b1a42e8bb9c339de5 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:31:43 +0200 Subject: [PATCH 069/174] Delete App_Denti directory --- App_Denti/dentoni | 94 ----------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 App_Denti/dentoni diff --git a/App_Denti/dentoni b/App_Denti/dentoni deleted file mode 100644 index 5a026893c..000000000 --- a/App_Denti/dentoni +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From c7bbfa6059debc050de30e3a29953b5d84864735 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:31:56 +0200 Subject: [PATCH 070/174] Delete apps/SuperDenti directory --- apps/SuperDenti/appDenti.js | 99 ------------------------------------- 1 file changed, 99 deletions(-) delete mode 100644 apps/SuperDenti/appDenti.js diff --git a/apps/SuperDenti/appDenti.js b/apps/SuperDenti/appDenti.js deleted file mode 100644 index 556a35ac1..000000000 --- a/apps/SuperDenti/appDenti.js +++ /dev/null @@ -1,99 +0,0 @@ -var i = 0; -var counter = 10; -var counterInterval; - -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # ###### # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -g.setColor('#012345'); - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - // again, 10 secs later - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - g.clear(img); - outOfTime(); - return; - - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - if (counter<=5){ - immagine(); - } -} - - - -function startTimer() { - counter = 10; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); - - -} - - -startTimer(); From 36debde6c94009770e4edd35c0b4fd87455d9dad Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:32:08 +0200 Subject: [PATCH 071/174] Delete apps/AppDentus directory --- apps/AppDentus/Dentix | 94 ------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 apps/AppDentus/Dentix diff --git a/apps/AppDentus/Dentix b/apps/AppDentus/Dentix deleted file mode 100644 index 5a026893c..000000000 --- a/apps/AppDentus/Dentix +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From f0aed4896a59026666d68e509a31579d41d9e319 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:32:39 +0200 Subject: [PATCH 072/174] Delete My Denti --- apps/My Denti | 94 --------------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 apps/My Denti diff --git a/apps/My Denti b/apps/My Denti deleted file mode 100644 index 5a026893c..000000000 --- a/apps/My Denti +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From 979fde2ac576daadc936fe53fddff50727c17234 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:32:55 +0200 Subject: [PATCH 073/174] Delete dentigrossi --- apps/dentigrossi | 94 ------------------------------------------------ 1 file changed, 94 deletions(-) delete mode 100644 apps/dentigrossi diff --git a/apps/dentigrossi b/apps/dentigrossi deleted file mode 100644 index 5a026893c..000000000 --- a/apps/dentigrossi +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From 8d7344b9d40e6be51660bc0e2d14b56eb3261f74 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:08 +0200 Subject: [PATCH 074/174] Delete app-icon.js --- apps/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/app-icon.js diff --git a/apps/app-icon.js b/apps/app-icon.js deleted file mode 100644 index 0b121d700..000000000 --- a/apps/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("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")) From bf4fde3baa3f3b301dbe126e4a64bab349d27b26 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:28 +0200 Subject: [PATCH 075/174] Delete dentispessi --- apps/dentispessi | 94 ------------------------------------------------ 1 file changed, 94 deletions(-) delete mode 100644 apps/dentispessi diff --git a/apps/dentispessi b/apps/dentispessi deleted file mode 100644 index 5a026893c..000000000 --- a/apps/dentispessi +++ /dev/null @@ -1,94 +0,0 @@ -var counter = 30; -var counterInterval; -var img = Graphics.createImage(` - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); -var img1 = Graphics.createImage(` - - - ### # ##### ## #### -# # # # # # # -# # ### # # #### -# # # # # # # - ### #### ##### # # # # - - ##### ##### - # ##### # - # # - # # - ## ## - ## ## - ## ## - # #### # - # # # # - # # # # - ## ## - ## ## -`); - - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - Bangle.beep(200, 4000) - .then(() => new Promise(resolve => setTimeout(resolve,200))) - .then(() => Bangle.beep(200, 3000)); - setTimeout(outOfTime, 10000); - g.setColor('#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')); -} - -function immagine(){ - g.drawImage(img1, 90, 20, {scale:2}); -} - -function countDown() { - g.setColor('#012345'); - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(startTimer, (process.env.HWVERSION==2) ? BTN1 : BTN2); - outOfTime(); - return; - } - g.clear(); - g.setFontAlign(0,0); // center font - g.setFont("Vector",80); // vector font, 80px - // draw the current counter value - g.drawImage(img, 90, 20, {scale:2}); - - g.drawString(counter,120,120); - g.drawLine(50,50,180,50); - g.drawLine(50,51,180,51); - g.drawLine(50,52,180,52); - // optional - this keeps the watch LCD lit up - Bangle.setLCDPower(1); - - if(counter<=5){ - immagine(); - } -} - - -function startTimer(){ - counter = 30; - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -startTimer(); From 25ccff51948c6b3115ac53146373ea48fdd09a5e Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:38 +0200 Subject: [PATCH 076/174] Delete metadata.js --- apps/metadata.js | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 apps/metadata.js diff --git a/apps/metadata.js b/apps/metadata.js deleted file mode 100644 index 198e44df2..000000000 --- a/apps/metadata.js +++ /dev/null @@ -1,13 +0,0 @@ -{ "id": "dentigrossi", - "name": "My app monitors the teeth brush", - "shortName":"Short Name", - "version":"0.01", - "description": "A detailed description of my great app", - "icon": "brush-teeth.png", - "tags": "", - "supports" : ["BANGLEJS1"], - "storage": [ - {"name":"denti.app.js","url":"app.js"}, - {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} - ] -} From d56e247b9cce4f2b6d3fbd83afb1695c6308d675 Mon Sep 17 00:00:00 2001 From: ELIARENZONI <102217389+ELIARENZONI@users.noreply.github.com> Date: Wed, 30 Mar 2022 11:33:47 +0200 Subject: [PATCH 077/174] Delete metadata.json --- apps/metadata.json | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 apps/metadata.json diff --git a/apps/metadata.json b/apps/metadata.json deleted file mode 100644 index 198e44df2..000000000 --- a/apps/metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ "id": "dentigrossi", - "name": "My app monitors the teeth brush", - "shortName":"Short Name", - "version":"0.01", - "description": "A detailed description of my great app", - "icon": "brush-teeth.png", - "tags": "", - "supports" : ["BANGLEJS1"], - "storage": [ - {"name":"denti.app.js","url":"app.js"}, - {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} - ] -} From 1e91a2095e6e9e1380b7fa5ffa1106bbcefc2c6a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:17:05 +0100 Subject: [PATCH 078/174] Create fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 78 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 apps/fuzzyw/fuzzyw.app.js diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js new file mode 100644 index 000000000..4057563d3 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.app.js @@ -0,0 +1,78 @@ + +// adapted from https://github.com/hallettj/Fuzzy-Text-International/ +const fuzzy_strings = { + en_GB:{ + hours:[ + // AM hours + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + // PM hours + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + minutes:[ + "*$1 o'clock", + "five past *$1", + "ten past *$1", + "quarter past *$1", + "twenty past *$1", + "twenty five past *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + text_scale:3.5, + }, + }; + + //const SETTINGS_FILE = "fuzzyw.settings.json"; + //let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB'}; + + //let fuzzy_string = fuzzy_strings[settings.language]; + let fuzzy_string = fuzzy_strings['en_GB']; + + const h = g.getHeight(); + const w = g.getWidth(); + + function getTimeString(date) { + let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let hour = date.getHours() + Math.floor(segment/12); + f_string = fuzzy_string.minutes[segment % 12]; + if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); + } else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); + } + return f_string; + } + + function draw() { + let time_string = getTimeString(new Date()).replace('*', ''); + // print(time_string); + g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); + g.setFontAlign(0, 0); + g.clearRect(0, 24, w, h-24); + g.setColor(g.theme.fg); + g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); + } + + g.clear(); + draw(); + setInterval(draw, 10000); // refresh every 10s + + // Stop updates when LCD is off, restart when on + Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately + } + }); + + Bangle.setUI('clock'); + Bangle.loadWidgets(); + Bangle.drawWidgets(); From 18ac62c0ede389efb61e65c68359ed060e6ca90d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:17:28 +0100 Subject: [PATCH 079/174] Add files via upload --- apps/fuzzyw/ChangeLog | 1 + apps/fuzzyw/README.md | 15 +++++++++++++++ apps/fuzzyw/fuzzy.png | Bin 0 -> 173 bytes apps/fuzzyw/fuzzyw-dark.png | Bin 0 -> 2172 bytes apps/fuzzyw/fuzzyw-light.png | Bin 0 -> 2578 bytes apps/fuzzyw/fuzzyw.icon.js | 1 + apps/fuzzyw/metadata.json | 19 +++++++++++++++++++ 7 files changed, 36 insertions(+) create mode 100644 apps/fuzzyw/ChangeLog create mode 100644 apps/fuzzyw/README.md create mode 100644 apps/fuzzyw/fuzzy.png create mode 100644 apps/fuzzyw/fuzzyw-dark.png create mode 100644 apps/fuzzyw/fuzzyw-light.png create mode 100644 apps/fuzzyw/fuzzyw.icon.js create mode 100644 apps/fuzzyw/metadata.json diff --git a/apps/fuzzyw/ChangeLog b/apps/fuzzyw/ChangeLog new file mode 100644 index 000000000..7b83706bf --- /dev/null +++ b/apps/fuzzyw/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md new file mode 100644 index 000000000..1b5f2b8e8 --- /dev/null +++ b/apps/fuzzyw/README.md @@ -0,0 +1,15 @@ +# Fuzzy Text Clock + +An inaccurate clock for when you're not in a rush. + +This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! + +## TODO +* Other languages (currently only uk style time, could tie into the Languages app) +* Bold hour word + +## References +Based on Pebble app Fuzzy Text International: https://github.com/hallettj/Fuzzy-Text-International + +![](fuzzyw-light.png) +![](fuzzyw-dark.png) diff --git a/apps/fuzzyw/fuzzy.png b/apps/fuzzyw/fuzzy.png new file mode 100644 index 0000000000000000000000000000000000000000..125265aea211223268c701ba1d548552d26c7b77 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw-dark.png b/apps/fuzzyw/fuzzyw-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..88220e5c7f3414e922f735d895d5eea03bae3f5a GIT binary patch literal 2172 zcmeH}|5wt78pr7~ObDIdCUZG=B}JW7cT3YL%F_fqJ?H-LJg@V5etFJ$|MX_Z zMu%H(+rA9~fmla;8-_Qt`>%m*HSeyzxua%mq2a?rA)WG17akR; zUs*vLHa8ct0{X=GGw9Uvjt;>yV?K!LR+N4o_@=m|sOTN@%}ly&0z_4tLr@7{oaq2~PId`sdirI|8}+5voR_>GYZXs+K^@kjU&y7al1G;FVvcurRUQ2L z#mK6S6p&Zp7md0YhUGO{B3|z}21st(&w3&+#mw46U-R3;RZ6PAv~7lU9BRDR6y@~= z=XUV$+*UBIksN$mMDMZ8W20}!xSP*tn7?@IewCsrdgM1~w5Aeo18l~?LC4feHu|hg zz;FM81pzQW{IA*t*k?ux$yuNoCto1mE5RUtl4U~IRXLvVWg&2<)K5iMEj;vNG`&qH6zc8-0 zXxRXdI#`z0YeS}VQQ}WlHMT!;&(XGC>wkrHpyf)Db!zH?iGn=obOl%26u4dj>;IlG zFukfwDImSQcZ20DSoK-u!>VP2(9Zrd;Z@Z#7*ix$u76&+sFiXBmeMr_3YUsF9PvcI zICaHSr#wZ{)Q`C|{FEtPi4`-DleBH^J;{b{ZyRrFo@t{xJ(*YW2XRZT)T{Cec6S7p^n4cq5~ocJ`c);lv; z9p9z@**?%ej{cBj{`gU2RWY`Vc?;S(o($i!em7@@U?9XL{9c;%rT7GZK|H6b4>=?_ zUZK1G5uL}C{xZKybn;{2a}{wz!oMqu%Gg4TdN9Dr9w2#9b36N*x(tE*E?#DyGJsLh zthXgP-WsI?ZY|fyOQ!nA&|+M<=18UNSfZOQp)Ji1y4x;s3oPq}+U9_&xLjie3u;Vn zwgwM|9f1HO;d+^!kb`o_-?<;-Y}WfJ9y#pFvlIY!dCDad19$yzv_$(rw95w9&(P}tB2D%>XV zENDET&$N<`RdP0;(q{cKcMnC%afJA%~9o89|Qu-%ZkN7?S literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw-light.png b/apps/fuzzyw/fuzzyw-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5383e08a49cad86ee7683b811f4bed918a36cd68 GIT binary patch literal 2578 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 literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js new file mode 100644 index 000000000..48750da61 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json new file mode 100644 index 000000000..56ed896a8 --- /dev/null +++ b/apps/fuzzyw/metadata.json @@ -0,0 +1,19 @@ +{ + "id":"fuzzyw", + "name":"Fuzzy Text Clock", + "shortName": "Fuzzy Text", + "version": "0.01", + "description": "An inaccurate clock for when you're not in a rush", + "readme": "README.md", + "icon":"fuzzyw.png", + "screenshots": [{"url":"fuzzyw_light.png"},{"url":"fuzzyw_dark.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, + {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true} + ] +} From 949e746a75f1d26361d63420dd3d6c9d47c79f76 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:20:34 +0100 Subject: [PATCH 080/174] Add files via upload --- apps/fuzzyw/fuzzyw-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/fuzzyw/fuzzyw-icon.js diff --git a/apps/fuzzyw/fuzzyw-icon.js b/apps/fuzzyw/fuzzyw-icon.js new file mode 100644 index 000000000..48750da61 --- /dev/null +++ b/apps/fuzzyw/fuzzyw-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) From b03930125ca0f84ea1ba3e1383b96bf76a3a4785 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:24:17 +0100 Subject: [PATCH 081/174] Add files via upload --- apps/fuzzyw/fuzzyw.png | Bin 0 -> 173 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/fuzzyw/fuzzyw.png diff --git a/apps/fuzzyw/fuzzyw.png b/apps/fuzzyw/fuzzyw.png new file mode 100644 index 0000000000000000000000000000000000000000..125265aea211223268c701ba1d548552d26c7b77 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T literal 0 HcmV?d00001 From 0689cb6c03ce19a44549c579b35dcdee69ef38d2 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:25:42 +0100 Subject: [PATCH 082/174] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 56ed896a8..b1fa4c6d7 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -6,7 +6,7 @@ "description": "An inaccurate clock for when you're not in a rush", "readme": "README.md", "icon":"fuzzyw.png", - "screenshots": [{"url":"fuzzyw_light.png"},{"url":"fuzzyw_dark.png"}], + "screenshots": [{"url":"fuzzyw-light.png"},{"url":"fuzzyw-dark.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS", "BANGLEJS2"], From 96ea439a4560452d0860c4ce3b884133a15a2e8c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:26:38 +0100 Subject: [PATCH 083/174] Create fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/fuzzyw/fuzzyw.settings.js diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -0,0 +1 @@ + From a23dd54b5d446ab6aff9742ac39056a1b9288418 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:26:57 +0100 Subject: [PATCH 084/174] Delete fuzzy.png --- apps/fuzzyw/fuzzy.png | Bin 173 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/fuzzyw/fuzzy.png diff --git a/apps/fuzzyw/fuzzy.png b/apps/fuzzyw/fuzzy.png deleted file mode 100644 index 125265aea211223268c701ba1d548552d26c7b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T From c474d0c5f812557ca61ca738c87f577301296924 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:27:09 +0100 Subject: [PATCH 085/174] Delete fuzzyw.icon.js --- apps/fuzzyw/fuzzyw.icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/fuzzyw/fuzzyw.icon.js diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js deleted file mode 100644 index 48750da61..000000000 --- a/apps/fuzzyw/fuzzyw.icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) From c536aee610158a719d5f54fe5fcec1e3a3397144 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:31:33 +0100 Subject: [PATCH 086/174] Rename fuzzyw-icon.js to fuzzyw.img.js --- apps/fuzzyw/{fuzzyw-icon.js => fuzzyw.img.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/fuzzyw/{fuzzyw-icon.js => fuzzyw.img.js} (100%) diff --git a/apps/fuzzyw/fuzzyw-icon.js b/apps/fuzzyw/fuzzyw.img.js similarity index 100% rename from apps/fuzzyw/fuzzyw-icon.js rename to apps/fuzzyw/fuzzyw.img.js From 991fd8726ee5740e4b13d314f3bb6da98f10c46a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:34:30 +0100 Subject: [PATCH 087/174] Rename fuzzyw.img.js to fuzzyw.icon.js --- apps/fuzzyw/{fuzzyw.img.js => fuzzyw.icon.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/fuzzyw/{fuzzyw.img.js => fuzzyw.icon.js} (100%) diff --git a/apps/fuzzyw/fuzzyw.img.js b/apps/fuzzyw/fuzzyw.icon.js similarity index 100% rename from apps/fuzzyw/fuzzyw.img.js rename to apps/fuzzyw/fuzzyw.icon.js From 2fc67c46cecf8cfb9d7db42a4e25ecd394f800bb Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:22:04 +0100 Subject: [PATCH 088/174] Update fuzzyw.icon.js --- apps/fuzzyw/fuzzyw.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js index 48750da61..acc7e2fcf 100644 --- a/apps/fuzzyw/fuzzyw.icon.js +++ b/apps/fuzzyw/fuzzyw.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) +require("heatshrink").decompress(atob("mEwgP/ABX8oYFD+AFE8AFE8IXE8YFKwFCj08h4FBocenEHCIPDjk4CoIFBhlwAoeMuIFEuBSBAoOI+AFD4HxGoQFB+AFD4P4uYFC8P4gYFD/w7BAFEfApfEj+B/Ecg/Ah8A+EMg/Dw0YseHj/Dw/8sfHAoPH/lhDoIFBwFwj4FB40AvkPAoU8v4dCAoIdDw04FIMP4EOgFwh47Bj8EvEfw/DJwgFXABY")) From 52a237f3e8c8a7cf8549c6ac4c8a4dfbc5702257 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:22:19 +0100 Subject: [PATCH 089/174] Add files via upload --- apps/fuzzyw/fuzzyw.png | Bin 173 -> 893 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.png b/apps/fuzzyw/fuzzyw.png index 125265aea211223268c701ba1d548552d26c7b77..afd0b0f7669ba9f467b95edff2023270b30e76bf 100644 GIT binary patch delta 871 zcmV-t1DO1+0sRJ$BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn!e zW~dHgK~%(1s#pXIrLEAagUO{|(4-+rad8w}3l4rPRvlcNb#-tR1i=pwM<*vm7b)?7 zNufoI2gm(*ckglc4iM^PrkWiSfT~$WG8Ppx*;O&{3O|O?jejwOBxdUI)M6T*F%=a_C-#2dsjo0iUbpE$&dl0tk=JZ{hhi66NxyZpwv;IP0m zLq<9|PaGl^3vDd7F)JD>@icK*Q8mgJGA=8ew>YciDr?@8zc857R#IH2IfNLN5Jv(c zWK>Z?85Sb6YJa4dNYZ}P!$0Ww6XcS~RRSZ&0xD1;Iezdz_}#6UpPF=&f>EIJ#kN02 zfWR)$sM+@Sv28a_0RJ;^rM3K(Ixzc5dab2}kAS{y;NrTa$$P-%4lwYfONQh~ewso) z54@kzH)VnTTcBsn?X9_w(+40;T`k`L2Zz9DfwI><-hbWI-rK)tn*IF%mCbUs8u46L z00006VoOIv03rYe067`TGob(g010qNS#tmYE+YT{E+YYWr9XB6000McNliru<^vxI zEf{}eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C4-mcmVz@jM+PuJe`AS+vt0Dr{Of}M^hE*iMIR1L>Hz+qGhg#hq$ z!>fP>04iY3Q`p@bwP@lM3K0>@e~oQG)x-s$02F|@MSX;^%BzY(VJNgJ;<*T^Ezox> zw?21YhnfRc-HQ|J#i<0>BALCj%uDu{7_rF<%_ySHOf8u#S_JhhW_pIIJ*%A%Mtaj8 z-(VcjD!5kl+%50W$h9KV2s1NOO;_&kfvjuH^K%t?a{ToAr*%!csfE9i{?SSsBgN3d xb1n|-xMWEiW-Ag`Hd+7*K!SoMYlAMm20mqH+ zTi^2eD Date: Thu, 31 Mar 2022 12:48:13 +0100 Subject: [PATCH 090/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 8b1378917..6b2dadb1e 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -1 +1,46 @@ +(function(back) { + const SETTINGS_FILE = "fuzzyw.json"; + + var align_options = ['Left','Centre','Right']; + var language_options = ['System', 'en_GB']; + // initialize with default settings... + let s = {'language': language_options[0], 'align': align_options[1]}; + + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + let settings = storage.readJSON(SETTINGS_FILE, 1) || s; + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + E.showMenu({ + '': { 'title': 'Fuzzy Clock' }, + '< Back': back, + 'Language': { + value: 0 | language_options.indexOf(s.theme), + min: 0, max: language_options.length - 1, + format: v => language_options[v], + onchange: v => { + s.theme = language_options[v]; + save(); + } + }, + 'Language': { + value: 0 | align_options.indexOf(s.theme), + min: 0, max: align_options.length - 1, + format: v => align_options[v], + onchange: v => { + s.theme = align_options[v]; + save(); + } + }, + }); +}) From c270f8d34da94f3db4640d5ef1be54786e6b74ce Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:50:36 +0100 Subject: [PATCH 091/174] Create fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 apps/fuzzyw/fuzzy_strings.json diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json new file mode 100644 index 000000000..21926d747 --- /dev/null +++ b/apps/fuzzyw/fuzzy_strings.json @@ -0,0 +1,25 @@ +{ + "en_GB":{ + "hours":[ + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + "minutes":[ + "*$1 o'clock", + "five past *$1", + "ten past *$1", + "quarter past *$1", + "twenty past *$1", + "twenty five past *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + "text_scale":3.5 + } +} From 924c68527fad3f0863897db80a049f7178bb079c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:51:43 +0100 Subject: [PATCH 092/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 6b2dadb1e..40505aecb 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -33,7 +33,7 @@ save(); } }, - 'Language': { + 'Alignment': { value: 0 | align_options.indexOf(s.theme), min: 0, max: align_options.length - 1, format: v => align_options[v], From dce327bf620759a20f3ec5d6e0b424c195659d78 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:52:55 +0100 Subject: [PATCH 093/174] Update metadata.json --- apps/fuzzyw/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index b1fa4c6d7..1f197c519 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -14,6 +14,7 @@ "storage": [ {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, - {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true} + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"fuzzy_strings.json"} ] } From f76cb9a346639505baa690138dd8e99c603fde16 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:56:53 +0100 Subject: [PATCH 094/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 110 +++++++++++++++----------------------- 1 file changed, 42 insertions(+), 68 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 4057563d3..a8a5c02d5 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,78 +1,52 @@ // adapted from https://github.com/hallettj/Fuzzy-Text-International/ -const fuzzy_strings = { - en_GB:{ - hours:[ - // AM hours - "midnight", "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "ten", "eleven", - // PM hours - "twelve", "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "ten", "eleven" - ], - minutes:[ - "*$1 o'clock", - "five past *$1", - "ten past *$1", - "quarter past *$1", - "twenty past *$1", - "twenty five past *$1", - "half past *$1", - "twenty five to *$2", - "twenty to *$2", - "quarter to *$2", - "ten to *$2", - "five to *$2" - ], - text_scale:3.5, - }, - }; +const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json); - //const SETTINGS_FILE = "fuzzyw.settings.json"; - //let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB'}; +const SETTINGS_FILE = "fuzzyw.settings.json"; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; - //let fuzzy_string = fuzzy_strings[settings.language]; - let fuzzy_string = fuzzy_strings['en_GB']; +let fuzzy_string = fuzzy_strings[settings.language]; +//let fuzzy_string = fuzzy_strings['en_GB']; - const h = g.getHeight(); - const w = g.getWidth(); +const h = g.getHeight(); +const w = g.getWidth(); - function getTimeString(date) { - let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); - let hour = date.getHours() + Math.floor(segment/12); - f_string = fuzzy_string.minutes[segment % 12]; - if (f_string.includes('$1')) { - f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); - } else { - f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); - } - return f_string; - } +function getTimeString(date) { +let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); +let hour = date.getHours() + Math.floor(segment/12); +f_string = fuzzy_string.minutes[segment % 12]; +if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); +} else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); +} +return f_string; +} - function draw() { - let time_string = getTimeString(new Date()).replace('*', ''); - // print(time_string); - g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); - g.setFontAlign(0, 0); - g.clearRect(0, 24, w, h-24); - g.setColor(g.theme.fg); - g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); - } +function draw() { +let time_string = getTimeString(new Date()).replace('*', ''); +// print(time_string); +g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); +g.setFontAlign(0, 0); +g.clearRect(0, 24, w, h-24); +g.setColor(g.theme.fg); +g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); +} - g.clear(); - draw(); - setInterval(draw, 10000); // refresh every 10s +g.clear(); +draw(); +setInterval(draw, 10000); // refresh every 10s - // Stop updates when LCD is off, restart when on - Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; - if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately - } - }); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ +if (secondInterval) clearInterval(secondInterval); +secondInterval = undefined; +if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately +} +}); - Bangle.setUI('clock'); - Bangle.loadWidgets(); - Bangle.drawWidgets(); +Bangle.setUI('clock'); +Bangle.loadWidgets(); +Bangle.drawWidgets(); From cc0e5f14b1ccddd1bcdb05db419263f245588648 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:58:17 +0100 Subject: [PATCH 095/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index a8a5c02d5..988080ea1 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,6 +1,6 @@ // adapted from https://github.com/hallettj/Fuzzy-Text-International/ -const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json); +const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; From 61c5c04c133a6f44ed55193105f3977a40b3cd03 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:04:30 +0100 Subject: [PATCH 096/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 52 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 988080ea1..ba1db294f 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,36 +1,38 @@ - // adapted from https://github.com/hallettj/Fuzzy-Text-International/ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; + +if (settings.language == 'System') { + settings.language = require('locale').name; +} let fuzzy_string = fuzzy_strings[settings.language]; -//let fuzzy_string = fuzzy_strings['en_GB']; const h = g.getHeight(); const w = g.getWidth(); function getTimeString(date) { -let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); -let hour = date.getHours() + Math.floor(segment/12); -f_string = fuzzy_string.minutes[segment % 12]; -if (f_string.includes('$1')) { - f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); -} else { - f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); -} -return f_string; + let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let hour = date.getHours() + Math.floor(segment/12); + f_string = fuzzy_string.minutes[segment % 12]; + if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); + } else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); + } + return f_string; } function draw() { -let time_string = getTimeString(new Date()).replace('*', ''); -// print(time_string); -g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); -g.setFontAlign(0, 0); -g.clearRect(0, 24, w, h-24); -g.setColor(g.theme.fg); -g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); + let time_string = getTimeString(new Date()).replace('*', ''); + // print(time_string); + g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); + g.setFontAlign(0, 0); + g.clearRect(0, 24, w, h-24); + g.setColor(g.theme.fg); + g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); } g.clear(); @@ -39,12 +41,12 @@ setInterval(draw, 10000); // refresh every 10s // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ -if (secondInterval) clearInterval(secondInterval); -secondInterval = undefined; -if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately -} + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately + } }); Bangle.setUI('clock'); From 23916389beb4ee3d4103f941b6e39c6f733a1f3f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:06:30 +0100 Subject: [PATCH 097/174] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 1f197c519..2cc670c79 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -15,6 +15,6 @@ {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, - {"name":"fuzzy_strings.json"} + {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From ea6b4624e671f37775d7fb5b58394129a5a98d07 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:26:41 +0100 Subject: [PATCH 098/174] Update fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 138 +++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 21926d747..6b4b71419 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -21,5 +21,143 @@ "five to *$2" ], "text_scale":3.5 + }, + "en_US":{ + "hours":[ + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + "minutes":[ + "*$1 o'clock", + "five after *$1", + "ten after *$1", + "quarter after *$1", + "twenty after *$1", + "twenty five after *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + "text_scale":3.5 + }, + "es_ES":{ + "hours":[ + "doce", "una", "dos", "tres", "cuatro", "cinco", + "seis", "siete", "ocho", "nueve", "diez", "once", + "doce", "una", "dos", "tres", "cuatro", "cinco", + "seis", "siete", "ocho", "nueve", "diez", "once" + ], + "minutes":[ + "*$1 en punto", + "*$1 y cinco", + "*$1 y diez", + "*$1 y cuarto", + "*$1 y veinte", + "*$1 y veinti- cinco", + "*$1 y media", + "*$2 menos veinti- cinco", + "*$2 menos veinte", + "*$2 menos cuarto", + "*$2 menos diez", + "*$2 menos cinco" + ], + "text_scale":3.5 + }, + "fr_FR":{ + "hours":[ + "douze", "une", "deux", "trois", "quatre", "cinq", + "six", "sept", "huit", "neuf", "dix", "onze", + "douze", "une", "deux", "trois", "quatre", "cinq", + "six", "sept", "huit", "neuf", "dix", "onze" + ], + "minutes":[ + "*$1 heures", + "*$1 heures cinq", + "*$1 heures dix", + "*$1 heures et quart", + "*$1 heures vingt", + "*$1 heures vingt- cinq", + "*$1 heures et demie", + "*$2 moins vingt- cinq", + "*$2 heures moins vingt", + "*$2 moins le quart", + "*$2 heures moins dix", + "*$2 heures moins cinq" + ], + "text_scale":3.5 + }, + "no_NO":{ + "hours":[ + "tolv", "ett", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve", + "tolv", "ett", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve" + ], + "minutes":[ + "klokka er *$1", + "fem over *$1", + "ti over *$1", + "kvart over *$1", + "ti på halv *$2", + "fem på halv *$2", + "halv *$2", + "fem over halv *$2", + "ti over halv *$2", + "kvart på *$2", + "ti på *$2", + "fem på *$2" + ], + "text_scale":3.5 + }, + "sv_SE":{ + "hours":[ + "tolv", "ett", "två", "tre", "fyra", "fem", + "sex", "sju", "åtta", "nio", "tio", "elva", + "tolv", "ett", "två", "tre", "fyra", "fem", + "sex", "sju", "åtta", "nio", "tio", "elva" + ], + "minutes":[ + "*$1", + "fem över *$1", + "tio över *$1", + "kvart över *$1", + "tjugo över *$1", + "fem i halv *$2", + "halv *$2", + "fem över halv *$2", + "tjugo i *$2", + "kvart i *$2", + "tio i *$2", + "fem i *$2" + ], + "text_scale":3.5 + }, + "de_DE":{ + "hours":[ + "zwölf", "eins", "zwei", "drei", "vier", "fünf", + "sechs", "sieben", "acht", "neun", "zehn", "elf", + "zwölf", "eins", "zwei", "drei", "vier", "fünf", + "sechs", "sieben", "acht", "neun", "zehn", "elf" + ], + "minutes":[ + "*$1 uhr", + "fünf nach *$1", + "zehn nach *$1", + "viertel nach *$1", + "zwanzig nach *$1", + "fünf for halb *$2", + "halb *$2", + "fünf nach halb *$2", + "zwanzig vor *$2", + "viertel vor *$2", + "zehn vor *$2", + "fünf vor *$2" + ], + "text_scale":3.5 } } From 5242d8662b70656d495155ff5358702648f48af8 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:28:05 +0100 Subject: [PATCH 099/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 40505aecb..cb0d1117c 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "fuzzyw.json"; var align_options = ['Left','Centre','Right']; - var language_options = ['System', 'en_GB']; + var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... let s = {'language': language_options[0], 'align': align_options[1]}; From 0feebdb318130e9ef0246b698b9ae941d6980bc3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 13:48:45 +0100 Subject: [PATCH 100/174] improved alarm app --- apps/alarm/alarm.js | 52 +++++++---- apps/alarm/app.js | 219 ++++++++++++++++++++++++-------------------- apps/alarm/boot.js | 22 +++-- 3 files changed, 171 insertions(+), 122 deletions(-) diff --git a/apps/alarm/alarm.js b/apps/alarm/alarm.js index a655dad1e..9a9e172cc 100644 --- a/apps/alarm/alarm.js +++ b/apps/alarm/alarm.js @@ -1,20 +1,38 @@ // Chances are boot0.js got run already and scheduled *another* // 'load(alarm.js)' - so let's remove it first! -clearInterval(); - -function formatTime(t) { - var hrs = 0|t; - var mins = Math.round((t-hrs)*60); - return hrs+":"+("0"+mins).substr(-2); +if (Bangle.ALARM) { + clearInterval(Bangle.ALARM); + delete Bangle.ALARM; } -function getCurrentHr() { +// time in ms -> { hrs, mins } +function decodeTime(t) { + t = 0|t; // sanitise + var hrs = 0|(t/3600000); + return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) }; +} + +// time in { hrs, mins } -> ms +function encodeTime(o) { + return o.hrs*3600000 + o.mins*60000; +} + +function formatTime(t) { + var o = decodeTime(t); + return o.hrs+":"+("0"+o.mins).substr(-2); +} + +function getCurrentTime() { var time = new Date(); - return time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); + return ( + time.getHours() * 3600000 + + time.getMinutes() * 60000 + + time.getSeconds() * 1000 + ); } function showAlarm(alarm) { - var msg = formatTime(alarm.hr); + var msg = alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); var buzzCount = 10; if (alarm.msg) msg += "\n"+alarm.msg; @@ -26,13 +44,13 @@ function showAlarm(alarm) { }).then(function(sleep) { buzzCount = 0; if (sleep) { - if(alarm.ohr===undefined) alarm.ohr = alarm.hr; - alarm.hr += 10/60; // 10 minutes + if(alarm.ot===undefined) alarm.ot = alarm.t; + alarm.t += 10*60*1000; // 10 minutes } else { alarm.last = (new Date()).getDate(); - if (alarm.ohr!==undefined) { - alarm.hr = alarm.ohr; - delete alarm.ohr; + if (alarm.ot!==undefined) { + alarm.t = alarm.ot; + delete alarm.ot; } if (!alarm.rp) alarm.on = false; } @@ -59,12 +77,12 @@ function showAlarm(alarm) { // Check for alarms var day = (new Date()).getDate(); -var hr = getCurrentHr()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early +var currentTime = getCurrentTime()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early var alarms = require("Storage").readJSON("alarm.json",1)||[]; -var active = alarms.filter(a=>a.on&&(a.hra.on&&(a.ta.hr-b.hr); + active = active.sort((a,b)=>a.t-b.t); showAlarm(active[0]); } else { // otherwise just go back to default app diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 56184edf1..7419f0d5d 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -4,33 +4,49 @@ Bangle.drawWidgets(); var alarms = require("Storage").readJSON("alarm.json",1)||[]; /*alarms = [ { on : true, - hr : 6.5, // hours + minutes/60 + t : 23400000, // Time of day since midnight in ms msg : "Eat chocolate", last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat as : false, // auto snooze - timer : 5, // OPTIONAL - if set, this is a timer and it's the time in minutes + timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms } ];*/ +// time in ms -> { hrs, mins } +function decodeTime(t) { + t = 0|t; // sanitise + var hrs = 0|(t/3600000); + return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) }; +} + +// time in { hrs, mins } -> ms +function encodeTime(o) { + return o.hrs*3600000 + o.mins*60000; +} + function formatTime(t) { - var hrs = 0|t; - var mins = Math.round((t-hrs)*60); - return hrs+":"+("0"+mins).substr(-2); + var o = decodeTime(t); + return o.hrs+":"+("0"+o.mins).substr(-2); } -function formatMins(t) { - mins = (0|t)%60; - hrs = 0|(t/60); - return hrs+":"+("0"+mins).substr(-2); -} - -function getCurrentHr() { +function getCurrentTime() { var time = new Date(); - return time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); + return ( + time.getHours() * 3600000 + + time.getMinutes() * 60000 + + time.getSeconds() * 1000 + ); +} + +function saveAndReload() { + require("Storage").write("alarm.json",JSON.stringify(alarms)); + eval(require("Storage").read("alarm.boot.js")); } function showMainMenu() { + // Timer img "\0"+atob("DhKBAP////MDDAwwMGGBzgPwB4AeAPwHOBhgwMMzDez////w") + // Alarm img "\0"+atob("FBSBAABgA4YcMPDGP8Zn/mx/48//PP/zD/8A//AP/wD/8A//AP/wH/+D//w//8AAAADwAAYA") const menu = { '': { 'title': 'Alarm/Timer' }, /*LANG*/'< Back' : ()=>{load();}, @@ -38,140 +54,147 @@ function showMainMenu() { /*LANG*/'New Timer': ()=>editTimer(-1) }; alarms.forEach((alarm,idx)=>{ - if (alarm.timer) { - txt = /*LANG*/"TIMER "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatMins(alarm.timer); - } else { - txt = /*LANG*/"ALARM "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatTime(alarm.hr); - if (alarm.rp) txt += /*LANG*/" (repeat)"; - } - menu[txt] = function() { - if (alarm.timer) editTimer(idx); - else editAlarm(idx); + var txt; // a leading space is currently required (JS error in Espruino 2v12) + if (alarm.timer) + txt = /*LANG*/"Timer"+" "+formatTime(alarm.timer); + else + txt = /*LANG*/"Alarm"+" "+formatTime(alarm.t); + if (alarm.rp) txt += "\0"+atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA="); + menu[txt] = { + value : "\0"+atob(alarm.on?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"), + onchange : function() { + if (alarm.timer) editTimer(idx, alarm); + else editAlarm(idx, alarm); + } }; }); - if (WIDGETS["alarm"]) WIDGETS["alarm"].reload(); return E.showMenu(menu); } -function editAlarm(alarmIndex) { +function editDOW(dow, onchange) { + const menu = { + '': { 'title': /*LANG*/'Days of Week' }, + '< Back' : () => onchange(dow) + }; + for (var i = 0; i < 7; i++) (i => { + var dayOfWeek = require("locale").dow({ getDay: () => i }); + menu[dayOfWeek] = { + value: !!(dow&(1< v ? "Yes" : "No", + onchange: v => v ? dow |= 1< showMainMenu(), /*LANG*/'Hours': { - value: hrs, min : 0, max : 23, wrap : true, - onchange: v => hrs=v + value: t.hrs, min : 0, max : 23, wrap : true, + onchange: v => t.hrs=v }, /*LANG*/'Minutes': { - value: mins, min : 0, max : 59, wrap : true, - onchange: v => mins=v + value: t.mins, min : 0, max : 59, wrap : true, + onchange: v => t.mins=v }, /*LANG*/'Enabled': { - value: en, + value: a.on, format: v=>v?"On":"Off", - onchange: v=>en=v + onchange: v=>a.on=v }, /*LANG*/'Repeat': { - value: en, + value: a.rp, format: v=>v?"Yes":"No", - onchange: v=>repeat=v + onchange: v=>a.rp=v + }, + /*LANG*/'Days': { + value: "SMTWTFS".split("").map((d,n)=>a.dow&(1< editDOW(a.dow, d=>{a.dow=d;editAlarm(alarmIndex,a)}) }, /*LANG*/'Auto snooze': { - value: as, + value: a.as, format: v=>v?"Yes":"No", - onchange: v=>as=v + onchange: v=>a.as=v } }; - function getAlarm() { - var hr = hrs+(mins/60); - var day = 0; - // If alarm is for tomorrow not today (eg, in the past), set day - if (hr < getCurrentHr()) - day = (new Date()).getDate(); - // Save alarm - return { - on : en, hr : hr, - last : day, rp : repeat, as: as - }; - } - menu[/*LANG*/"> Save"] = function() { - if (newAlarm) alarms.push(getAlarm()); - else alarms[alarmIndex] = getAlarm(); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + menu[/*LANG*/"Save"] = function() { + a.t = encodeTime(t); + if (a.t < getCurrentTime()) + a.day = (new Date()).getDate(); + if (newAlarm) alarms.push(a); + else alarms[alarmIndex] = a; + saveAndReload(); showMainMenu(); }; if (!newAlarm) { - menu[/*LANG*/"> Delete"] = function() { + menu[/*LANG*/"Delete"] = function() { alarms.splice(alarmIndex,1); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + saveAndReload(); showMainMenu(); }; } return E.showMenu(menu); } -function editTimer(alarmIndex) { +function editTimer(alarmIndex, alarm) { var newAlarm = alarmIndex<0; - var hrs = 0; - var mins = 5; - var en = true; - if (!newAlarm) { - var a = alarms[alarmIndex]; - mins = (0|a.timer)%60; - hrs = 0|(a.timer/60); - en = a.on; + var a = { + timer : 5*60*1000, // 5 minutes + on : true, + rp : false, + as : false, + dow : 0b1111111, + last : 0 } + if (!newAlarm) Object.assign(a, alarms[alarmIndex]); + if (alarm) Object.assign(a,alarm); + var t = decodeTime(a.timer); + const menu = { '': { 'title': /*LANG*/'Timer' }, + '< Back' : () => showMainMenu(), /*LANG*/'Hours': { - value: hrs, min : 0, max : 23, wrap : true, - onchange: v => hrs=v + value: t.hrs, min : 0, max : 23, wrap : true, + onchange: v => t.hrs=v }, /*LANG*/'Minutes': { - value: mins, min : 0, max : 59, wrap : true, - onchange: v => mins=v + value: t.mins, min : 0, max : 59, wrap : true, + onchange: v => t.mins=v }, /*LANG*/'Enabled': { - value: en, - format: v=>v?/*LANG*/"On":/*LANG*/"Off", - onchange: v=>en=v + value: a.on, + format: v=>v?"On":"Off", + onchange: v=>a.on=v } }; - function getTimer() { - var d = new Date(Date.now() + ((hrs*60)+mins)*60000); - var hr = d.getHours() + (d.getMinutes()/60) + (d.getSeconds()/3600); - // Save alarm - return { - on : en, - timer : (hrs*60)+mins, - hr : hr, - rp : false, as: false - }; - } - menu["> Save"] = function() { - if (newAlarm) alarms.push(getTimer()); - else alarms[alarmIndex] = getTimer(); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + menu[/*LANG*/"Save"] = function() { + a.timer = encodeTime(t); + a.hr = getCurrentTime() + a.timer; + if (newAlarm) alarms.push(a); + else alarms[alarmIndex] = a; + saveAndReload(); showMainMenu(); }; if (!newAlarm) { - menu["> Delete"] = function() { + menu[/*LANG*/"Delete"] = function() { alarms.splice(alarmIndex,1); - require("Storage").write("alarm.json",JSON.stringify(alarms)); + saveAndReload(); showMainMenu(); }; } diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js index 47dae5361..a7fdd3658 100644 --- a/apps/alarm/boot.js +++ b/apps/alarm/boot.js @@ -1,25 +1,33 @@ // check for alarms (function() { + if (Bangle.ALARM) { + clearTimeout(Bangle.ALARM); + delete Bangle.ALARM; + } var alarms = require('Storage').readJSON('alarm.json',1)||[]; var time = new Date(); - var active = alarms.filter(a=>a.on); + var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1); if (active.length) { - active = active.sort((a,b)=>(a.hr-b.hr)+(a.last-b.last)*24); - var hr = time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); + active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); if (!require('Storage').read("alarm.js")) { console.log("No alarm app!"); require('Storage').write('alarm.json',"[]"); } else { - var t = 3600000*(active[0].hr-hr); - if (active[0].last == time.getDate() || t < 0) t += 86400000; - if (t<1000) t=1000; + var t = active[0].t-currentTime; + if (active[0].last == time.getDate() || t < -60000) t += 86400000; + if (t<1000) t=1000; // start alarm min 1 sec from now /* execute alarm at the correct time. We avoid execing immediately since this code will get called AGAIN when alarm.js is loaded. alarm.js will then clearInterval() to get rid of this call so it can proceed normally. */ - setTimeout(function() { + Bangle.ALARM = setTimeout(function() { load("alarm.js"); },t); } + } else { // check for new alarms at midnight (so day of week works) + Bangle.ALARM = setTimeout(() => { + eval(require("Storage").read("alarm.boot.js")); + }, 86400000 - (Date.now()%86400000)); } })(); From 9055cd79900da0886920766fbf2fd7d04cf66576 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 31 Mar 2022 15:32:26 +0100 Subject: [PATCH 101/174] Fixes, README and alarm lib --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 70 ++++++++++++++++++++++++++++++++++++++++ apps/alarm/app.js | 19 ++++++----- apps/alarm/boot.js | 7 ++-- apps/alarm/lib.js | 45 ++++++++++++++++++++++++++ apps/alarm/metadata.json | 6 ++-- apps/alarm/widget.js | 1 + 7 files changed, 135 insertions(+), 14 deletions(-) create mode 100644 apps/alarm/README.md create mode 100644 apps/alarm/lib.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 4576237a5..e07e748d4 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,3 +14,4 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system +0.16: Adding alarm library diff --git a/apps/alarm/README.md b/apps/alarm/README.md new file mode 100644 index 000000000..16a39f8b9 --- /dev/null +++ b/apps/alarm/README.md @@ -0,0 +1,70 @@ +Default Alarm & Timer +====================== + +This provides an app, widget, library and tools for alarms and timers. + +Other apps can use this to provide alarm functionality. + +App +--- + +The Alarm app allows you to add/modify any running timers. + + +Internals / Library +------------------- + +Alarms are stored in an array in `alarm.json`, and take the form: + +``` +{ + id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + on : true, // is the alarm enabled? + t : 23400000, // Time of day since midnight in ms + msg : "Eat chocolate", // message to display + last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! + rp : true, // repeat + as : false, // auto snooze + timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms + js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') + // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) +} +``` + +The [`alarm` library](https://github.com/espruino/BangleApps/blob/master/apps/alarm/lib.js) contains +a few helpful functions for getting/setting alarms, but is intentionally sparse so as not to +use too much RAM. + +It can be used as follows: + +``` +// add/update an existing alarm +require("alarm").setAlarm("mytimer", { + msg : "Wake up", + timer : 10*60*1000, // 10 Minutes +}); +// Ensure the widget and alarm timer updates to schedule the new alarm properly +require("alarm").reload(); + +// Get the time to the next alarm for us +var timeToNext = require("alarm").getTimeToAlarm(require("alarm").getAlarm("mytimer")); +// timeToNext===undefined if no alarm or alarm disabled + +// delete an alarm +require("alarm").setAlarm("mytimer", undefined); +// reload after deleting... +require("alarm").reload(); + +// Or add an alarm that runs your own code - in this case +// loading the settings app. The alarm will not be removed/stopped +// automatically. +require("alarm").setAlarm("customrunner", { + js : "load('setting.app.js')", + timer : 1*60*1000, // 1 Minute +}); +``` + + + +If your app requires alarms, you can specify that the alarms app needs to +be installed by adding `"dependencies": {"alarm":"app"},` to your metadata. diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 7419f0d5d..b5efb3f17 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -3,13 +3,16 @@ Bangle.drawWidgets(); var alarms = require("Storage").readJSON("alarm.json",1)||[]; /*alarms = [ - { on : true, - t : 23400000, // Time of day since midnight in ms - msg : "Eat chocolate", - last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! - rp : true, // repeat - as : false, // auto snooze + { + id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + on : true, // is the alarm enabled? + t : 23400000, // Time of day since midnight in ms + msg : "Eat chocolate", // message to display + last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! + rp : true, // repeat + as : false, // auto snooze timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms + js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') } ];*/ @@ -41,7 +44,7 @@ function getCurrentTime() { function saveAndReload() { require("Storage").write("alarm.json",JSON.stringify(alarms)); - eval(require("Storage").read("alarm.boot.js")); + require("alarm").reload(); } function showMainMenu() { @@ -185,7 +188,7 @@ function editTimer(alarmIndex, alarm) { }; menu[/*LANG*/"Save"] = function() { a.timer = encodeTime(t); - a.hr = getCurrentTime() + a.timer; + a.t = getCurrentTime() + a.timer; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js index a7fdd3658..cb3a82a7e 100644 --- a/apps/alarm/boot.js +++ b/apps/alarm/boot.js @@ -20,10 +20,9 @@ /* execute alarm at the correct time. We avoid execing immediately since this code will get called AGAIN when alarm.js is loaded. alarm.js will then clearInterval() to get rid of this call so it can proceed - normally. */ - Bangle.ALARM = setTimeout(function() { - load("alarm.js"); - },t); + normally. + If active[0].js is defined, just run that code as-is and not alarm.js */ + Bangle.ALARM = setTimeout(active[0].js||'load("alarm.js")',t); } } else { // check for new alarms at midnight (so day of week works) Bangle.ALARM = setTimeout(() => { diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js new file mode 100644 index 000000000..a0d8b3938 --- /dev/null +++ b/apps/alarm/lib.js @@ -0,0 +1,45 @@ +// Return an array of all alarms +exports.getAlarms = function() { + return require("Storage").readJSON("alarm.json",1)||[]; +}; +// Return an alarm object based on ID +exports.getAlarm = function(id) { + var alarms = require("Storage").readJSON("alarm.json",1)||[]; + return alarms.find(a=>a.id==id); +}; +// Set an alarm object based on ID. Leave 'alarm' undefined to remove it +exports.setAlarm = function(id, alarm) { + var alarms = require("Storage").readJSON("alarm.json",1)||[]; + alarms = alarms.filter(a=>a.id!=id); + if (alarm !== undefined) { + alarm.id = id; + if (alarm.dow===undefined) alarm.dow = 0b1111111; + if (alarm.on!==false) alarm.on=true; + if (alarm.timer) { // if it's a timer, set the start time as a time from *now* + var time = new Date(); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + alarm.t = currentTime + alarm.timer; + } + } + alarms.push(alarm); + require("Storage").writeJSON("alarm.json", alarms); +}; +/// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future +exports.getTimeToAlarm = function(alarm, time) { + if (!alarm) return undefined; + if (!time) time = new Date(); + var active = alarm.on && (alarm.dow>>time.getDay())&1; + if (!active) return undefined; + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + var t = alarm.t-currentTime; + if (alarm.last == time.getDate() || t < -60000) t += 86400000; + return t; +}; +/// Force a reload of the current alarms and widget +exports.reload = function() { + eval(require("Storage").read("alarm.boot.js")); + if (WIDGETS["alarm"]) { + WIDGETS["alarm"].reload(); + Bangle.drawWidgets(); + } +}; diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index d29298309..c10f64a5c 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,17 +2,19 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.15", + "version": "0.16", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"alarm.app.js","url":"app.js"}, {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} + {"name":"alarm.wid.js","url":"widget.js"}, + {"name":"alarm","url":"lib.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/alarm/widget.js b/apps/alarm/widget.js index e8bb79fc7..54c17dc6d 100644 --- a/apps/alarm/widget.js +++ b/apps/alarm/widget.js @@ -1,6 +1,7 @@ WIDGETS["alarm"]={area:"tl",width:0,draw:function() { if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); },reload:function() { + // don't include library here as we're trying to use as little RAM as possible WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; } }; From a11999648f539a8397c43dede991544e89565790 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 1 Apr 2022 08:17:59 +0200 Subject: [PATCH 102/174] Minor changes --- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 12 +++++++----- apps/bwclk/app.png | Bin 2103 -> 1795 bytes apps/bwclk/screenshot.png | Bin 2693 -> 2575 bytes apps/bwclk/screenshot_2.png | Bin 3113 -> 2892 bytes 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index a84b133d7..a90e091fd 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgP/AD3vAonB4IFDnOLAod974FD/OfAYP9u/5wP1r/71/zzHt3/9q/H/n9r/63/P/nt7/9+8VzoLB/e/gOB8c/EoNV65RNRrGH8Eqh0AgPFsE/jsAgfAsEgjARBoFAuEQAoPA40umwFBoPEu4XBgHBwEjnGABYImBiHAgHDgUh2AFBocGusVAoPCgE+h4XBAAMUgpUO80zCwdFqILD9MxAocBBYkppQFDotQRrAAGA")) +require("heatshrink").decompress(atob("mEwgP/ADPHv4DB4Hj7wJC5nD7oLCz1zApffAonvDoQFB84LE62nFIXz63PGoXz6QFC+f//U/I4f+KxqTeh8AuFgAoMbwHwAoURwGw4AFBjOAmAFCj+MmOQAoWAmOYAoM5AoMYXoWAmf4AoWMmf8C4WImARCHYMgiBUUjOcAockpgFDnkIAomECIgFEjscRzI")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 5da262d03..272f78ca8 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -126,28 +126,30 @@ function draw() { g.fillRect(0,y,W,H); // Draw date + y -= settings.fullscreen ? 5 : 0; var date = new Date(); g.setColor("#000"); g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); - g.drawString(dateStr, W/2, y+5); + dateStr = ("0"+dateStr).substr(-2); + g.drawString(dateStr, W/2, y+3); g.setSmallFont(); g.setFontAlign(-1,1); - var monthStr = locale.month(date, 1); - g.drawString(monthStr, W/2 + 5, y+2); g.drawString(locale.dow(date, true), W/2 + 5, y-22); + g.drawString(locale.month(date, 1), W/2 + 5, y); // Draw time g.setColor("#fff"); g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); - g.drawString(timeStr, W/2, y+10); + y += settings.fullscreen ? 20 : 10; + g.drawString(timeStr, W/2, y); // Draw steps or timer - y += H/5*2+10; + y += H/5*2; g.setSmallFont(); g.setFontAlign(0,0); var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index cbe7fa8978429136351c0f09dd6becfea57b8b01..c7c42effa88b07093d74b0322dc1446e2b148818 100644 GIT binary patch delta 1764 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 FV1oB43H<;7 diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 5a3c17c868b9710cf95b1518d9122efc3485a798..51f632ed36cd05f851968b66b1ec80d71e93c184 100644 GIT binary patch literal 2575 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 diff --git a/apps/bwclk/screenshot_2.png b/apps/bwclk/screenshot_2.png index 5ce483d7d5aebdf0a65b89c889db121d9f323970..71259932db68015eef9c2c477e43b15b0951229c 100644 GIT binary patch delta 2872 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 HlWzSF79U+A delta 3095 zcmZuzc{r2{7k}q97=x@cO~}68nQO~ZS%yKDp@j@WV@k;~MGG@X^AavMt|$_2$`E7E zS~0x(REh{$$~JLrH)=u%@y%b~U*Gxjob&vi^E~JIE!|iS?zRzY+S#7u!K5zz{W*FS zk4hNbYMXzcGy0BELD?rQpSRGfufC@`A?MoG&mV$nSHXvuf(6Kp_uWQ|_dw*K!>EFS z0*<<0RD0_^;=eMeaJ=OWQ9G#3bb;gwNgt~y}boPtv8_|>;zz(-$Y%a-DFz1wI7Yt*v^*V@O#{!9BJZwuP-rN#P zz#D~4jTwHL(^Z5UWM??`)tlJ|nNHSY&1&=qf3f(^W5h!l_m6|PQ&J%}ZF`k*lxuhP zBfeU9FvmxpfMM!#`D-aaT_W)LQ2U}hR6HQ+@nu;v{@~@(kd&ob#8}K-OAz<4-(TT4C+8_tnUrvJ*vzqJiGAvG3ZKD3L;Qhi4MkHs{M1 z<3giM^g67v4eCX0u?w5>kcP=TSIDpDrRYAHw*zwrgi-thoWpJjg8$f3HvJw02&%TJ z&YveBz_FBE&?T=5cNNXr%b=xsC<<%g>U|K&y#FCz*A@XPJ;KN8pM(H|JGpX4bZsCF zkK*3*g1x^!bXuUY4W8R=`_zS{yf*jBzKnd@nSjxkJT!Fp1kL2hL!$Ah4380M3ET3% z=UhO_%i0C1HawBx4SO+qSku#bEy&w*ewF83RzeYPF6}ZQ4M>3`Z{#n=+K1?Aol%;; z6`ulFXgi1h7(u7P7D8vwX)V4~K0Ifx8DT8LOQPzc*hitw_r;-O)sF8tX_t$CX&}~+ zy#sqQHwIVKjF#%v;H=G0_(lcYMk#AK2T0tior{Rp$+x6eKk2NzYNO#J97o6hR+9iSQ_ zMBj8J*F+pbJh*GEzzf>F(=|!V2aXrfg#9X7r;!{Wn+iqsNBx7=vov#B_)o5il!{!$ z*+cRo-sBOhTa=R}e{emQA>8sQDsbh11re{(f<7*9u@UtOI$1Lhw68Dwo zVrlyQC!UoJ(|(Am#J0r#F=Q(JTd&WJu0*z&ZO2<=b>rrm8CaGsLJMu9&iVQx?SLxb zWf2@gigmQVb9fK4nCRQAFPTt`&D~M#<23y&deR?F0etZ`)%bOogf|3hOov!p48LS8 z^J!3i=lRL!%96=gNDC+?uuZ7_-pCQQ%B?cE@@23ANv~7Wtd&F;1DwL~CWKeWF?21t*597wF+e8hU=sM=7k=dNW7WYe|>0QNmk4xXH1!w5yf z7KCaKP0jHZ;L?KiN$Dc&l~3#4)>{q+j9gU)qD65+a3EAWTiw73yu{C2nvj6q2UH?b zXFt|D@tm%{Ym~@Ls#^&qlnp8Og?+dYZ04v7b9XomHeY5`PFK9F5-t4EUn$H|Jp9V7T}-yuSHFq3Ja_hA?FQO*k~}ZS*tJ?A!MT?7b%4nt2Gr=&3qM8Zx2pbW8no z-o1pWZBsN2NxfKXw`ui{LwO@fTy(1Wo>Xv;#1T$&tD98n*BYvp8tng`m>i;Fa*&=) z#OQ^O;`y$-K9ko~^GLPdrCF{q0|=QBBir%|QnYK^x(@OWM*o<_$-nu->)27u(};j1 zZ4X)S`$_^^p~!ReiF5_by&uANlRqdg_{1(+P2Oty5_geTDtQyf?^d0NjaV z3&0&q(pl|tv;*PwAaY}V)rbkYiu~mX0XnWK%X6#cJ5>gcEUj(HLWY~M!B~<;tnXBC z8tLK1w1If~-=e2V%&;9L=j!&;>`#;%X0&RZF)h%zOx`(>W;v_yGX9lXrRcBg1h_N@ z>!u#do>Gqt%1<`1*XjLfS%vC+o}?J~dJFcEVP$lT-AY}xB1BqI6$uC0iYOiV=l%M( zI~7dKx(GE#Y&`BdO)9v___|ai`#YDHMtvJ8`k7%GM9&847%3U8{w9YL9oUqJS&MT zuu0wgRGruZlV(0dbx!nwxHLVH5tm1-7*^FrofcR)xme&Mkqm>Y8m@D7B zkHs^7{+4i8^V>Q52I-8;WQ8MZa7nuhBzd8FJuOJw#Km+NyhSHpOvlIhzJ410w?^8C zkYY6Ncg)BaC2w(l+s?ql@$RIH*tD!U*qxt2V{WdkY6bUijfqe6VT4mIGE7;4!e$;B zfl%;F#UraYz4LmbR8f3mdSqUf+ON_)d7t;*8Cwo& z&n(Lsex(6RiF%hkcS}#Qf>-!z7fs&H(bcd`(x{ePz6dxLZUhiN*mLwT}qa%RNMboH+@jx)a)1#nZ}P;1((WO{>o^eYlHd5Zts zWyqs-a4II=xNNBNd0+r(mjAr)+Ce;lZ%hamOA!7?g5P>9^Z-JM>$||J0KhBQ@RMsW zGF8BDnlS7CG8zI($f7s<@HSAxpMAtEL6D%B<5E2lUYC}@ipWj z8MsqhwZobvFl!4SwCvjq7#HRdXF4tReU~gt(}6O&E{C1`z*lF<9#3w==)jW8(hsF+ zE_rT89LudjO463j#ely9iLK$c&+?*Il2eev# z9kqwVFBaO6qP-s2j^M2jUjaWaf8+~Kw8=C}I+tHV-she9qQ z{}!uHnH+kj*uNV>UmkqDk?b8eso(;U3tRy9BzED<-t?mn_MyUm;BZlIM7Rm;_c5b0 z?F6DMNN1)a7LJ(eC?H4nm?Nk_jmHx~?rjukVoCj|RSpK%4ftpoFcd~VwK7;fkAj_H ztzTlspu}T0q2gDK3|BL>OUVCvGKp6nyQ@nXqrUYf$nb0+y_z)D#tor+jEa2-qFIE* zc0?Pzn?aI3CeY1-e5+SIXjhRQPYAQIxNSv@2Dh2W9;{&UciU^n Date: Fri, 1 Apr 2022 12:50:36 +0100 Subject: [PATCH 103/174] docs --- apps/alarm/README.md | 10 +++++++++- apps/alarm/app.js | 14 +------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 16a39f8b9..a38d6f6ed 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -20,7 +20,15 @@ Alarms are stored in an array in `alarm.json`, and take the form: { id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers on : true, // is the alarm enabled? - t : 23400000, // Time of day since midnight in ms + t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) + dow : 0b1111111, // Binary encoding for days of the week to run alarm on + // SUN = 1 + // MON = 2 + // TUE = 4 + // WED = 8 + // THU = 16 + // FRI = 32 + // SAT = 64 msg : "Eat chocolate", // message to display last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat diff --git a/apps/alarm/app.js b/apps/alarm/app.js index b5efb3f17..4968fc95b 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -2,19 +2,7 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); var alarms = require("Storage").readJSON("alarm.json",1)||[]; -/*alarms = [ - { - id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers - on : true, // is the alarm enabled? - t : 23400000, // Time of day since midnight in ms - msg : "Eat chocolate", // message to display - last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! - rp : true, // repeat - as : false, // auto snooze - timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms - js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') - } -];*/ +// An array of alarm objects (see README.md) // time in ms -> { hrs, mins } function decodeTime(t) { From 5c33cad685a4dfa52059e5512bd3f34c9e74518a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 1 Apr 2022 13:27:37 +0100 Subject: [PATCH 104/174] Adding alarm.vibrate and menu --- apps/alarm/README.md | 4 ++++ apps/alarm/alarm.js | 20 ++++++++------------ apps/alarm/app.js | 10 +++++++--- apps/messages/settings.js | 10 +--------- apps/messages/widget.js | 9 +-------- modules/buzz.js | 14 ++++++++++++++ modules/buzz_menu.js | 13 +++++++++++++ 7 files changed, 48 insertions(+), 32 deletions(-) create mode 100644 modules/buzz.js create mode 100644 modules/buzz_menu.js diff --git a/apps/alarm/README.md b/apps/alarm/README.md index a38d6f6ed..7bc4b7155 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -32,13 +32,17 @@ Alarms are stored in an array in `alarm.json`, and take the form: msg : "Eat chocolate", // message to display last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat + vibrate : "...", // pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) as : false, // auto snooze timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) + data : { ... } // OPTIONAL - your app can store custom data in here if needed } ``` +You app + The [`alarm` library](https://github.com/espruino/BangleApps/blob/master/apps/alarm/lib.js) contains a few helpful functions for getting/setting alarms, but is intentionally sparse so as not to use too much RAM. diff --git a/apps/alarm/alarm.js b/apps/alarm/alarm.js index 9a9e172cc..7ec8d0b73 100644 --- a/apps/alarm/alarm.js +++ b/apps/alarm/alarm.js @@ -58,20 +58,16 @@ function showAlarm(alarm) { load(); }); function buzz() { - if ((require('Storage').readJSON('setting.json',1)||{}).quiet>1) return; // total silence - Bangle.buzz(100).then(()=>{ - setTimeout(()=>{ - Bangle.buzz(100).then(function() { - if (buzzCount--) - setTimeout(buzz, 3000); - else if(alarm.as) { // auto-snooze - buzzCount = 10; - setTimeout(buzz, 600000); - } - }); - },100); + require("buzz").pattern(alarm.vibrate===undefined?"..":alarm.vibrate).then(function() { + if (buzzCount--) + setTimeout(buzz, 3000); + else if(alarm.as) { // auto-snooze + buzzCount = 10; + setTimeout(buzz, 600000); + } }); } + if ((require('Storage').readJSON('setting.json',1)||{}).quiet>1) return; buzz(); } diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 4968fc95b..e83e1c3d5 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -87,7 +87,8 @@ function editAlarm(alarmIndex, alarm) { rp : true, as : false, dow : 0b1111111, - last : 0 + last : 0, + vibrate : ".." } if (!newAlarm) Object.assign(a, alarms[alarmIndex]); if (alarm) Object.assign(a,alarm); @@ -118,6 +119,7 @@ function editAlarm(alarmIndex, alarm) { value: "SMTWTFS".split("").map((d,n)=>a.dow&(1< editDOW(a.dow, d=>{a.dow=d;editAlarm(alarmIndex,a)}) }, + /*LANG*/'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate=v ), /*LANG*/'Auto snooze': { value: a.as, format: v=>v?"Yes":"No", @@ -151,7 +153,8 @@ function editTimer(alarmIndex, alarm) { rp : false, as : false, dow : 0b1111111, - last : 0 + last : 0, + vibrate : ".." } if (!newAlarm) Object.assign(a, alarms[alarmIndex]); if (alarm) Object.assign(a,alarm); @@ -172,7 +175,8 @@ function editTimer(alarmIndex, alarm) { value: a.on, format: v=>v?"On":"Off", onchange: v=>a.on=v - } + }, + /*LANG*/'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate=v ), }; menu[/*LANG*/"Save"] = function() { a.timer = encodeTime(t); diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 589d603da..7449b473b 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -15,18 +15,10 @@ require('Storage').writeJSON("messages.settings.json", settings); } - var vibPatterns = [/*LANG*/"Off", ".", "-", "--", "-.-", "---"]; var mainmenu = { "" : { "title" : /*LANG*/"Messages" }, "< Back" : back, - /*LANG*/'Vibrate': { - value: Math.max(0,vibPatterns.indexOf(settings().vibrate)), - min: 0, max: vibPatterns.length, - format: v => vibPatterns[v]||"Off", - onchange: v => { - updateSetting("vibrate", vibPatterns[v]); - } - }, + /*LANG*/'Vibrate': require("buzz_menu").pattern(settings().vibrate, v => updateSetting("vibrate", v) }), /*LANG*/'Repeat': { value: settings().repeat, min: 0, max: 10, diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 7abb415c3..3ac726e77 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -32,14 +32,7 @@ draw:function() { Bangle.drawWidgets(); },buzz:function() { if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return; // never buzz during Quiet Mode - let v = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate || "."; - function b() { - var c = v[0]; - v = v.substr(1); - if (c==".") Bangle.buzz().then(()=>setTimeout(b,100)); - if (c=="-") Bangle.buzz(500).then(()=>setTimeout(b,100)); - } - b(); + require("buzz").pattern((require('Storage').readJSON("messages.settings.json", true) || {}).vibrate || "."); },touch:function(b,c) { var w=WIDGETS["messages"]; if (!w||!w.width||c.xw.x+w.width||c.yw.y+w.iconwidth) return; diff --git a/modules/buzz.js b/modules/buzz.js new file mode 100644 index 000000000..488d0228d --- /dev/null +++ b/modules/buzz.js @@ -0,0 +1,14 @@ +/* Call this with a pattern like '.-.', '.. .' or '..' to buzz that pattern +out on the internal vibration motor. use buzz_menu to display a menu +where the patterns can be chosen. */ +exports.pattern = pattern => new Promise(resolve => { + function b() { + if (pattern=="") resolve(); + var c = pattern[0]; + pattern = pattern.substr(1); + if (c==".") Bangle.buzz().then(()=>setTimeout(b,100)); + else if (c=="-") Bangle.buzz(500).then(()=>setTimeout(b,100)); + else setTimeout(b,100); + } + b(); +}); diff --git a/modules/buzz_menu.js b/modules/buzz_menu.js new file mode 100644 index 000000000..64b225343 --- /dev/null +++ b/modules/buzz_menu.js @@ -0,0 +1,13 @@ +/* Display a menu to select from various vibration patterns for use with buzz.js */ + +exports.pattern = function(value, callback) { + var vibPatterns = ["", ".", "..", "-", "--", "-.-", "---"]; + return { + value: Math.max(0,vibPatterns.indexOf(value)), + min: 0, max: vibPatterns.length, + format: v => vibPatterns[v]||/*LANG*/"Off", + onchange: v => { + callback(vibPatterns[v]); + } + }; +} From 74203945a291f54237dca6e8063825012be3abbd Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 1 Apr 2022 13:50:06 +0100 Subject: [PATCH 105/174] oops --- apps/messages/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 7449b473b..754347f19 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -18,7 +18,7 @@ var mainmenu = { "" : { "title" : /*LANG*/"Messages" }, "< Back" : back, - /*LANG*/'Vibrate': require("buzz_menu").pattern(settings().vibrate, v => updateSetting("vibrate", v) }), + /*LANG*/'Vibrate': require("buzz_menu").pattern(settings().vibrate, v => updateSetting("vibrate", v)), /*LANG*/'Repeat': { value: settings().repeat, min: 0, max: 10, From b1382248789c37ea2a0af6d946a89827aa4d147c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 12:22:16 +0200 Subject: [PATCH 106/174] bwclk, lcars, notanalog and smpltmr uses now the new alarm library. --- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 52 +++++++++------ apps/lcars/ChangeLog | 2 +- apps/lcars/README.md | 3 +- apps/lcars/lcars.app.js | 62 ++++++++++++------ apps/lcars/metadata.json | 2 +- apps/notanalog/ChangeLog | 2 +- apps/notanalog/README.md | 2 +- apps/notanalog/notanalog.app.js | 56 +++++++++++++---- apps/qalarm/ChangeLog | 1 - apps/qalarm/lib.js | 108 -------------------------------- apps/qalarm/metadata.json | 3 +- apps/qalarm/qalarmcheck.js | 1 + apps/smpltmr/app.js | 40 ++++++++++-- apps/smpltmr/metadata.json | 4 +- 15 files changed, 164 insertions(+), 176 deletions(-) delete mode 100644 apps/qalarm/lib.js diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 85f01c8fe..83e4e97dd 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -8,7 +8,7 @@ In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) Additionally, in fullscreen mode a lock icon can be shown... -If you installed the "qalarm" app, you can directly set a timer. Simply tab at +If you installed the "alarm" app, you can directly set a timer. Simply tab at top / bottom of the screen. ## Thanks to diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 272f78ca8..967231648 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,3 +1,4 @@ +const TIMER_IDX = "bwclk"; const SETTINGS_FILE = "bwclk.setting.json"; const locale = require('locale'); const storage = require('Storage'); @@ -75,41 +76,56 @@ function getSteps() { return 0; } - function isAlarmEnabled(){ try{ - var qalarm = require('qalarm'); - return qalarm.isTimerStarted("bwclk"); + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + } catch(ex){ } return false; } - function getAlarmMinutes(){ - try{ - var qalarm = require('qalarm'); - return qalarm.getTimerMin("bwclk"); - } catch(ex){ } - return -1; + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ try{ - var qalarm = require('qalarm'); - var mins = qalarm.getTimerMin("bwclk")+5; - qalarm.deleteTimer("bwclk"); - qalarm.editTimer("bwclk", 0, mins, 0); + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); } catch(ex){ } } function decreaseAlarm(){ try{ - var qalarm = require('qalarm'); - var mins = qalarm.getTimerMin("bwclk")-5; - qalarm.deleteTimer("bwclk"); - if(mins > 0){ - qalarm.editTimer("bwclk", 0, mins, 0); + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); } + + alarm.reload(); } catch(ex){ } } diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index dec0a4aa2..4935fe714 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -16,5 +16,5 @@ 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. 0.18: Fullscreen mode can now be enabled or disabled in the settings. -0.19: Use qalarm for alarm functionality instead of own implementation. 0.19: Alarms can not go bigger than 100. +0.20: Use alarm for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index cf360d647..f506f96c4 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -3,7 +3,8 @@ A simple LCARS inspired clock. Note: To display the steps, the wpedom app is required. To show weather data such as temperature, humidity or window you BangleJS must be connected -with Gadgetbride and the weather app must be installed. +with Gadgetbride and the weather app must be installed. To use the timer +the "alarm" app must be installed on your device. ## Control * Tap left / right to change between screens. diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 357070fdc..353cc62dd 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,7 +1,7 @@ +const TIMER_IDX = "lcars"; const SETTINGS_FILE = "lcars.setting.json"; const locale = require('locale'); const storage = require('Storage'); -const qalarm = require('qalarm'); let settings = { alarm: -1, dataRow1: "Steps", @@ -566,25 +566,56 @@ function getWeather(){ * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("lcars"); + try{ + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + + } catch(ex){ } + return false; } function getAlarmMinutes(){ - return qalarm.getTimerMin("lcars"); + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")+5; - qalarm.deleteTimer("lcars"); - qalarm.editTimer("lcars", 0, mins, 0); + try{ + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); + } catch(ex){ } } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")-5; - qalarm.deleteTimer("lcars"); - if(mins > 0){ - qalarm.editTimer("lcars", 0, mins, 0); - } + try{ + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); + } + + alarm.reload(); + } catch(ex){ } } @@ -612,15 +643,6 @@ Bangle.on('charging',function(charging) { }); -function increaseAlarm(){ - if(isAlarmEnabled() && getAlarmMinutes() < 95){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } -} - - function feedback(){ Bangle.buzz(40, 0.3); } diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index b5d8e0a52..2fb17b550 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,7 +3,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.19", + "version":"0.20", "readme": "README.md", "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index 3d6f1fce8..6515f787c 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,4 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. 0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. -0.04: Use qalarm for timer instead of own alarm implementation. \ No newline at end of file +0.04: Use alarm for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index 3a0963090..f4cf19ed6 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -9,7 +9,7 @@ The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. ## Other Features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.) - depends on widtmr. +- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "alarm" is installed. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index fcd49af25..b7c81837d 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -1,11 +1,10 @@ /** * NOT ANALOG CLOCK */ - +const TIMER_IDX = "notanalog"; const locale = require('locale'); const storage = require('Storage') const SETTINGS_FILE = "notanalog.setting.json"; -const qalarm = require('qalarm'); let settings = { alarm: -1, }; @@ -394,25 +393,56 @@ function queueDraw() { * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("notanalog"); -} + try{ + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + + } catch(ex){ } + return false; + } function getAlarmMinutes(){ - return qalarm.getTimerMin("notanalog"); + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("notanalog")+5; - qalarm.deleteTimer("notanalog"); - qalarm.editTimer("notanalog", 0, mins, 0); + try{ + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); + } catch(ex){ } } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("notanalog")-5; - qalarm.deleteTimer("notanalog"); - if(mins > 0){ - qalarm.editTimer("notanalog", 0, mins, 0); - } + try{ + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); + } + + alarm.reload(); + } catch(ex){ } } function feedback(){ diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index 424571439..b9be6039d 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,4 +4,3 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. -0.05: Include library that can be used by other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js deleted file mode 100644 index 6d186d190..000000000 --- a/apps/qalarm/lib.js +++ /dev/null @@ -1,108 +0,0 @@ -let alarms = require("Storage").readJSON("qalarm.json", 1) || []; - -/** - * LIBRARY - */ - -function getCurrentTime() { - let time = new Date(); - return ( - time.getHours() * 3600000 + - time.getMinutes() * 60000 + - time.getSeconds() * 1000 - ); -} - -function getAlarmIndex(idx){ - for(var i=0; i= 0 && alarmIndex < alarms.length; - return exists; -} - -function isAlarmStarted(idx){ - if(!alarmExists(idx)){ - return false; - } - - var alarmIndex = getAlarmIndex(idx); - var time = new Date(); - var t = getCurrentTime(); - a = alarms[alarmIndex]; - return a.on && - t <= a.t && - a.last != time.getDate() && - (a.timer || a.daysOfWeek[time.getDay()]); -} - -function getTimerMin(idx){ - if(!isAlarmStarted(idx)){ - return 0; - } - - var alarmIndex = getAlarmIndex(idx); - var a = alarms[alarmIndex] ; - var diff = a.t - getCurrentTime(); - // let hrs = Math.floor(t / 3600000); - var mins = Math.round((diff / 60000) % 60); - // return hrs + ":" + ("0" + mins).substr(-2); - return mins; -} - -function reloadQalarm(){ - require("Storage").write("qalarm.json", JSON.stringify(alarms)); - eval(require("Storage").read("qalarmcheck.js")); - if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); -} - -function editTimer(idx, hrs, mins, secs){ - var alarmIndex = getAlarmIndex(idx); - var a = { - idx: idx, - on: true, - rp: false, - as: false, - hard: false, - }; - a.timer = hrs * 3600 + mins * 60 + secs; - a.t = (getCurrentTime() + a.timer * 1000) % 86400000; - - if(alarmExists(idx)){ - alarms[alarmIndex] = a; - } else { - alarms.push(a) - alarmIndex = alarms.length-1; - } - - reloadQalarm(); -} - -function deleteAlarm(idx){ - var alarmIndex = getAlarmIndex(idx); - if(!alarmExists(idx)){ - return; - } - - alarms.splice(alarmIndex, 1); - reloadQalarm(); -} - - -// Export functions -exports.alarmExists = alarmExists; -exports.isAlarmStarted = isAlarmStarted; -exports.deleteAlarm = deleteAlarm; - -exports.timerExists = alarmExists; -exports.isTimerStarted = isAlarmStarted; -exports.getTimerMin = getTimerMin; -exports.editTimer = editTimer; -exports.deleteTimer = deleteAlarm; diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 1ab4f4192..326ba33a7 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -3,12 +3,11 @@ "name": "Q Alarm and Timer", "shortName": "Q Alarm", "icon": "app.png", - "version": "0.05", + "version": "0.04", "description": "Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ - { "name": "qalarm", "url": "lib.js" }, { "name": "qalarm.app.js", "url": "app.js" }, { "name": "qalarm.boot.js", "url": "boot.js" }, { "name": "qalarm.js", "url": "qalarm.js" }, diff --git a/apps/qalarm/qalarmcheck.js b/apps/qalarm/qalarmcheck.js index 4976afb6f..8dac43800 100644 --- a/apps/qalarm/qalarmcheck.js +++ b/apps/qalarm/qalarmcheck.js @@ -2,6 +2,7 @@ * This file checks for upcoming alarms and schedules qalarm.js to deal with them and itself to continue doing these checks. */ +print("Checking for alarms..."); if (Bangle.QALARM) { clearInterval(Bangle.QALARM); diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index 754fbae5b..f7717a2fc 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const qalarm = require('qalarm'); +const alarm = require("alarm"); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); @@ -19,6 +19,33 @@ var minutes = 5; var interval; //used for the 1 second interval timer +function isTimerEnabled(){ + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; +} + +function getTimerMin(){ + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); +} + +function setTimer(minutes){ + alarm.setAlarm(TIMER_IDX, { + // msg : "Simple Timer", + timer : minutes*60*1000, + }); + alarm.reload(); +} + +function deleteTimer(){ + alarm.setAlarm(TIMER_IDX, undefined); + alarm.reload(); +} + setWatch(_=>load(), BTN1); function draw(){ g.clear(1); @@ -32,10 +59,11 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = qalarm.isTimerStarted(TIMER_IDX); + + var started = isTimerEnabled(); var text = minutes + " min."; if(started){ - var min = qalarm.getTimerMin(TIMER_IDX); + var min = getTimerMin(); text = min + " min."; } @@ -65,7 +93,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = qalarm.isTimerStarted(TIMER_IDX); + var started = isTimerEnabled(); if(isRight && !started){ minutes += 1; @@ -81,9 +109,9 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - qalarm.editTimer(TIMER_IDX, 0, minutes, 0); + setTimer(minutes); } else { - qalarm.deleteTimer(TIMER_IDX); + deleteTimer(); } Bangle.buzz(80, 0.6); } diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 4f0d473b4..feb841819 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -3,10 +3,10 @@ "name": "Simple Timer", "shortName": "Simple Timer", "version": "0.01", - "description": "A simple app to set a timer.", + "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"qalarm":"app"}, + "dependencies": {"alarm":"app"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 280d5d1a8892e137067242a0bd42455a5b211bd2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 12:24:41 +0200 Subject: [PATCH 107/174] Removed dependency to qalarm --- apps/lcars/metadata.json | 1 - apps/notanalog/metadata.json | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 2fb17b550..7155442f8 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -5,7 +5,6 @@ "icon": "lcars.png", "version":"0.20", "readme": "README.md", - "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 25cfa706d..0a291b180 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -7,7 +7,6 @@ "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", - "dependencies": {"qalarm":"app"}, "type": "clock", "tags": "clock", "screenshots": [ From 5781d4a7166bab112b3eafbaf4525f5055283908 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 14:43:27 +0200 Subject: [PATCH 108/174] Minor design improvements --- apps/bwclk/app.js | 8 ++++---- apps/bwclk/screenshot.png | Bin 2575 -> 2889 bytes apps/bwclk/screenshot_2.png | Bin 2892 -> 3152 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 967231648..7437293ae 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -148,13 +148,13 @@ function draw() { g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); - dateStr = ("0"+dateStr).substr(-2); - g.drawString(dateStr, W/2, y+3); + dateStr = ("0" + dateStr).substr(-2); + g.drawString(dateStr, W/2-2, y+3); g.setSmallFont(); g.setFontAlign(-1,1); - g.drawString(locale.dow(date, true), W/2 + 5, y-22); - g.drawString(locale.month(date, 1), W/2 + 5, y); + g.drawString(locale.dow(date, true), W/2 + 10, y-23); + g.drawString(locale.month(date, 1), W/2 + 10, y+1); // Draw time g.setColor("#fff"); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 51f632ed36cd05f851968b66b1ec80d71e93c184..5a6ffced04dfa772ba6dfdcb61d7ecebd66575ae 100644 GIT binary patch literal 2889 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 S@%}mqI11Xr-n_vSOZX44)xbyq delta 2873 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 KZ~5GUa`k^eCtXwk From 79db8ba05d22c06746c1e1f0175e698c0fea77bd Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 15:59:44 +0200 Subject: [PATCH 109/174] V0.03 - Use theme of bangle. --- apps/bwclk/ChangeLog | 5 +++-- apps/bwclk/README.md | 14 +++++++++++--- apps/bwclk/app.js | 12 +++++++----- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_3.png | Bin 0 -> 3005 bytes 5 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 apps/bwclk/screenshot_3.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index 1e1f155bb..ce0443d4b 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,2 +1,3 @@ -0.01: New App! -0.02: Use build in function for steps and other improvements. \ No newline at end of file +0.01: New App. +0.02: Use build in function for steps and other improvements. +0.03: Adapt colors based on the theme of the user. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 83e4e97dd..62df9a2d9 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -2,15 +2,23 @@ ![](screenshot.png) - +## Fullscreen mode In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) -Additionally, in fullscreen mode a lock icon can be shown... -If you installed the "alarm" app, you can directly set a timer. Simply tab at + +## Custom theme +If you switch the light/dark theme on your bangle, the design changes accordingly: + +![](screenshot_3.png) + +## Other features +- Lock icon: Show lock icon in fullscreen mode +- Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at top / bottom of the screen. + ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 7437293ae..91eddc468 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -138,13 +138,13 @@ function draw() { var yOffset = settings.fullscreen ? 0 : 10; var y = H/5*2 + yOffset; g.reset().clearRect(0,0,W,W); - g.setColor("#000"); + g.setColor(g.theme.fg); g.fillRect(0,y,W,H); // Draw date y -= settings.fullscreen ? 5 : 0; var date = new Date(); - g.setColor("#000"); + g.setColor(g.theme.fg); g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); @@ -157,7 +157,7 @@ function draw() { g.drawString(locale.month(date, 1), W/2 + 10, y+1); // Draw time - g.setColor("#fff"); + g.setColor(g.theme.bg); g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); @@ -174,7 +174,7 @@ function draw() { // Draw lock if(settings.showLock && Bangle.isLocked()){ - g.setColor("#000"); + g.setColor(g.theme.bg); g.drawImage(imgLock, 2, 2); } @@ -189,7 +189,9 @@ function draw() { Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); +var bgOrig = g.theme.bg +var fgOrig = g.theme.fg +g.setTheme({bg:fgOrig,fg:bgOrig}).clear(); // draw immediately at first, queue update draw(); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 3fe04c4d5..366622eeb 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.02", + "version": "0.03", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_3.png b/apps/bwclk/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfb5efe87cbeb9cc01bff74ac63ec7794b98e45 GIT binary patch literal 3005 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 literal 0 HcmV?d00001 From 240a14c715138eb5723957d73696bcc424ee8542 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:19:47 +0200 Subject: [PATCH 110/174] Hide steps --- apps/bwclk/ChangeLog | 3 ++- apps/bwclk/README.md | 6 ++++++ apps/bwclk/app.js | 31 ++++++++++++++++++++++++------- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_4.png | Bin 0 -> 2958 bytes apps/bwclk/settings.js | 25 +++++++++++++++++-------- 6 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ce0443d4b..ba8fd775b 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App. 0.02: Use build in function for steps and other improvements. -0.03: Adapt colors based on the theme of the user. \ No newline at end of file +0.03: Adapt colors based on the theme of the user. +0.04: Steps can be hidden now such that the time is even larger. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 62df9a2d9..d2ad03c09 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -13,6 +13,12 @@ If you switch the light/dark theme on your bangle, the design changes accordingl ![](screenshot_3.png) +## Show / Hide steps +Optionally, you can hide the steps in the settings. + +![](screenshot_4.png) + + ## Other features - Lock icon: Show lock icon in fullscreen mode - Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 91eddc468..22dbdcf24 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -10,6 +10,7 @@ const storage = require('Storage'); let settings = { fullscreen: false, showLock: true, + showSteps: true, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -24,11 +25,19 @@ for (const key in saved_settings) { // Manrope font Graphics.prototype.setLargeFont = function(scale) { + // Actual height 49 (50 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAfwAAAAAAAAf/AAAAAAAAf/8AAAAAAAf//wAAAAAAP///AAAAAAP///8AAAAAP////wAAAAP////4AAAAP////8AAAAH////8AAAAH////8AAAAB////8AAAAAH///+AAAAAAf//+AAAAAAB//+AAAAAAAH/+AAAAAAAAf+AAAAAAAAB/AAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///gAAAAAD////4AAAAA/////4AAAAH/////4AAAA//////wAAAH//////gAAA///////AAAH//////+AAA///////4AAD/4AAAH/wAAP+AAAAP/AAB/wAAAAf8AAH/AAAAA/4AAf4AAAAB/gAB/gAAAAH+AAP8AAAAAf4AA/wAAAAB/gAD/AAAAAH+AAP8AAAAAf4AAf4AAAAB/gAB/gAAAAH+AAH+AAAAA/4AAf8AAAAH/AAB/4AAAA/8AAD/4AAAH/wAAP/8AAH/+AAAf//////4AAA///////AAAB//////4AAAD//////AAAAH/////4AAAAP////+AAAAAP////gAAAAAD///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAB/wAAAAAAAAH/AAAAAAAAA/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAD/gAAAAAAAAP+AAAAAAAAB///////8AAH///////wAAf///////AAB///////8AAH///////wAAf///////AAB///////8AAH///////wAAP///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAfwAAAH8AAAD/AAAB/wAAAf8AAAP/AAAD/wAAB/8AAAf/AAAP/wAAD/8AAB//AAAf/wAAH/8AAD//AAA//gAAf/8AAD/wAAB//wAAf+AAAP//AAB/wAAB//8AAH+AAAP//wAAf4AAB///AAD/AAAP/v8AAP8AAB/8/wAA/wAAP/j/AAD/AAB/8P8AAH+AAH/g/wAAf4AA/8D/AAB/wAH/gP8AAH/AA/+A/wAAf/AP/wD/AAA//D/+AP8AAD////wA/wAAH///+AD/AAAP///wAP8AAAf//+AA/wAAA///wAD/AAAB//+AAP8AAAB//gAA/wAAAB/4AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAD+AAAAHwAAAf4AAAAfwAAB/gAAAB/gAAH+AAAAP/AAAf4AAAA/8AAB/gAAAD/4AAH+ADAAH/wAAf4AeAAP/AAB/gD+AAP8AAH+Af+AA/4AAf4D/4AB/gAB/gP/AAH+AAH+B/8AAf4AAf4P/wAB/gAB/h//AAH+AAH+P/8AAf4AAf5//wAB/gAB/v//gAP+AAH+//+AA/4AAf//f8AH/AAB//5/8B/8AAH//D////gAAf/4P///+AAB//Af///wAAH/4A///+AAAf/AB///wAAB/4AD//+AAAH/AAH//gAAAP4AAD/4AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAA/+AAAAAAAAP/4AAAAAAAH//gAAAAAAB//+AAAAAAAf//4AAAAAAH///gAAAAAB///+AAAAAAf///4AAAAAH//9/gAAAAD///H+AAAAA///wf4AAAAP//8B/gAAAD///AH+AAAA///wAf4AAAH//8AB/gAAAf//AAH+AAAB//gAAf4AAAH/4AAB/gAAAf+AAAH+AAAB/gAf///8AAH4AB////wAAeAAH////AABgAAf///8AAAAAB////wAAAAAH////AAAAAAf///8AAAAAB////wAAAAAH////AAAAAAAAf4AAAAAAAAB/gAAAAAAAAH+AAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAeAAAAAf//AB+AAAH///+AP8AAAf///4A/4AAB////gD/wAAH////Af/gAAf///8B/+AAB////wB/8AAH///+AB/wAAf4Af4AD/gAB/gB/AAP+AAH+AP8AAf4AAf4A/wAB/gAB/gD+AAH+AAH+AP4AAf4AAf4A/gAB/gAB/gD/AAH+AAH+AP8AAf4AAf4A/wAD/gAB/gD/gAf8AAH+AH/AD/wAAf4Af/Af+AAB/gB////4AAH+AD////AAAf4AH///8AAB/gAP///gAAH+AA///8AAAAAAA///AAAAAAAB//4AAAAAAAB/+AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///gAAAAAB////4AAAAAf////4AAAAH/////4AAAA//////wAAAH//////gAAA///////AAAH//////+AAAf//////4AAD/4D/wH/wAAP+AP8AP/AAB/wB/gAf8AAH/AH8AA/4AAf4A/wAB/gAB/gD/AAH+AAH8AP4AAf4AA/wA/gAB/gAD/AD+AAH+AAH8AP8AAf4AAf4A/wAB/gAB/gD/AAP+AAH+AP+AB/wAAf8Af8AP/AAA/4B/8B/8AAD/gH////gAAP8AP///8AAAfgAf///wAAA8AB///+AAADgAD///wAAAAAAD//+AAAAAAAH//gAAAAAAAH/4AAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAH+AAAAAAAAAf4AAAAAAAAB/gAAAAAAAAH+AAAAAAAAAf4AAAAADgAB/gAAAAA+AAH+AAAAAf4AAf4AAAAH/gAB/gAAAD/+AAH+AAAA//4AAf4AAAf//gAB/gAAH//+AAH+AAD///wAAf4AA///8AAB/gAf//+AAAH+AH///gAAAf4D///wAAAB/g///8AAAAH+f//+AAAAAf////gAAAAB////wAAAAAH///8AAAAAAf//+AAAAAAB///gAAAAAAH//wAAAAAAAf/8AAAAAAAB/+AAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAB/wB//wAAAAf/wf//gAAAD//z///AAAAf/////+AAAD//////8AAAf//////4AAD///////gAAP////w//AAB/+f/8Af8AAH/Af/gA/4AAf4A/8AD/gAB/gB/wAH+AAP8AH+AAf4AA/wAf4AB/gAD/AB/gAH+AAP8AH+AAf4AA/wAf4AB/gAB/gB/wAH+AAH+AP/AAf4AAf8A/+AD/gAB/8f/8Af8AAD////4H/wAAP//////+AAAf//////4AAA///////AAAD//////8AAAH//z///gAAAH/+H//4AAAAH/gH//AAAAAAAAH/wAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAP/wAAAAAAAD//wAAAAAAAf//wAAAAAAH///gABgAAA////AAPAAAD///+AB+AAAf///4AP4AAD////wB/wAAP/AP/AH/AAB/4Af+AP+AAH/AA/4A/4AAf4AB/gB/gAB/gAH+AH+AAP8AAP4Af4AA/wAA/gB/gAD/AAD+AH+AAP8AAP4Af4AA/4AB/gB/gAB/gAH+AH+AAH+AAfwA/4AAf8AD/AH/AAB/4Af4A/8AAD/4H/gP/wAAP//////+AAAf//////wAAA///////AAAB//////4AAAD//////AAAAH/////wAAAAH////+AAAAAH////AAAAAAAf/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AP8AAAAAB/gA/wAAAAAH+AD/AAAAAAf4AP8AAAAAB/gA/wAAAAAH+AD/AAAAAAf4AP8AAAAAB/gA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ExwqHCYlJyYoIicoFg=="), 64+(scale<<8)+(1<<16)); + return this; +}; + + +Graphics.prototype.setMediumFont = function(scale) { // Actual height 41 (42 - 2) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); return this; }; + Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); @@ -146,7 +155,7 @@ function draw() { var date = new Date(); g.setColor(g.theme.fg); g.setFontAlign(1,1); - g.setLargeFont(); + g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); g.drawString(dateStr, W/2-2, y+3); @@ -158,23 +167,31 @@ function draw() { // Draw time g.setColor(g.theme.bg); - g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; + + if(!isAlarmEnabled() && !settings.showSteps){ + y += 8; + g.setLargeFont(); + } else { + g.setMediumFont(); + } + g.drawString(timeStr, W/2, y); // Draw steps or timer y += H/5*2; - g.setSmallFont(); g.setFontAlign(0,0); - var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; - g.drawString(str, W/2, y); - + if(isAlarmEnabled() || settings.showSteps){ + g.setSmallFont(); + var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; + g.drawString(str, W/2, y); + } // Draw lock if(settings.showLock && Bangle.isLocked()){ - g.setColor(g.theme.bg); + g.setColor(g.theme.fg); g.drawImage(imgLock, 2, 2); } diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 366622eeb..9c81bd5cc 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.03", + "version": "0.04", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..db36a2088c06f3665d1b512ac14d1d9c8a884562 GIT binary patch literal 2958 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 N (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + }, + 'Show Steps': { + value: settings.showSteps, + format: () => (settings.showSteps ? 'Yes' : 'No'), + onchange: () => { + settings.showSteps = !settings.showSteps; + save(); + }, + }, 'Show Lock': { value: settings.showLock, format: () => (settings.showLock ? 'Yes' : 'No'), @@ -27,14 +44,6 @@ settings.showLock = !settings.showLock; save(); }, - }, - 'Full Screen': { - value: settings.fullscreen, - format: () => (settings.fullscreen ? 'Yes' : 'No'), - onchange: () => { - settings.fullscreen = !settings.fullscreen; - save(); - }, } }); }) From 893e45805ed731b7f639c63bfcffe2295e574511 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:54:16 +0200 Subject: [PATCH 111/174] Circle through information --- apps/bwclk/README.md | 28 +++---------- apps/bwclk/app.js | 78 +++++++++++++++++++++++++++++++----- apps/bwclk/screenshot.png | Bin 2889 -> 2958 bytes apps/bwclk/screenshot_3.png | Bin 3005 -> 0 bytes apps/bwclk/screenshot_4.png | Bin 2958 -> 0 bytes apps/bwclk/settings.js | 9 ----- 6 files changed, 73 insertions(+), 42 deletions(-) delete mode 100644 apps/bwclk/screenshot_3.png delete mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index d2ad03c09..31cc60270 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -2,28 +2,12 @@ ![](screenshot.png) -## Fullscreen mode -In the settings, fullscreen mode can be enabled and disabled: - -![](screenshot_2.png) - - -## Custom theme -If you switch the light/dark theme on your bangle, the design changes accordingly: - -![](screenshot_3.png) - -## Show / Hide steps -Optionally, you can hide the steps in the settings. - -![](screenshot_4.png) - - -## Other features -- Lock icon: Show lock icon in fullscreen mode -- Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at -top / bottom of the screen. - +## Features +- Fullscreen on/off +- The design is adapted to the theme of your bangle. +- Tab in middle of screen to show between different information. +- Enable / disable lock icon in the settings. +- If the "alarm" app is installed tab top / bottom of the screen to set the timer. ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 22dbdcf24..2714a6492 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -10,7 +10,7 @@ const storage = require('Storage'); let settings = { fullscreen: false, showLock: true, - showSteps: true, + showInfo: 0, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -85,6 +85,40 @@ function getSteps() { return 0; } + +function getWeather(){ + var weatherJson; + + try { + weatherJson = storage.readJSON('weather.json'); + var weather = weatherJson.weather; + + // Temperature + weather.temp = locale.temp(weather.temp-273.15); + + // Humidity + weather.hum = weather.hum + "%"; + + // Wind + const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); + weather.wind = Math.round(wind[1]) + " km/h"; + + return weather + + } catch(ex) { + // Return default + } + + return { + temp: "??? °C", + hum: "-", + txt: "-", + wind: "??? km/h", + wdir: "-", + wrose: "-" + }; +} + function isAlarmEnabled(){ try{ var alarm = require('alarm'); @@ -171,7 +205,7 @@ function draw() { var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; - if(!isAlarmEnabled() && !settings.showSteps){ + if(!isAlarmEnabled() && settings.showInfo == 0){ y += 8; g.setLargeFont(); } else { @@ -180,13 +214,32 @@ function draw() { g.drawString(timeStr, W/2, y); - // Draw steps or timer + // Draw info or timer y += H/5*2; g.setFontAlign(0,0); - if(isAlarmEnabled() || settings.showSteps){ + if(isAlarmEnabled() || settings.showInfo > 0){ g.setSmallFont(); - var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; - g.drawString(str, W/2, y); + + var infoStr = ""; + if(isAlarmEnabled()){ + infoStr = "T-" + getAlarmMinutes() + " min."; + } else if (settings.showInfo == 1){ + infoStr = E.getBattery() + "%"; + } else if (settings.showInfo == 2){ + infoStr = getSteps() + infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead + infoStr = infoStr + "k steps"; + } else if (settings.showInfo == 3){ + infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + } else if (settings.showInfo == 4){ + var weather = getWeather(); + infoStr = weather.temp; + } else if (settings.showInfo == 5){ + var weather = getWeather(); + infoStr = weather.wind; + } + + g.drawString(infoStr, W/2, y); } // Draw lock @@ -205,14 +258,12 @@ function draw() { Bangle.loadWidgets(); -// Clear the screen once, at startup +// Clear the screen once, at startup and set the correct theme. var bgOrig = g.theme.bg var fgOrig = g.theme.fg g.setTheme({bg:fgOrig,fg:bgOrig}).clear(); -// draw immediately at first, queue update draw(); - // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (on) { @@ -223,14 +274,12 @@ Bangle.on('lcdPower',on=>{ } }); - Bangle.on('lock', function(isLocked) { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; draw(); }); - Bangle.on('touch', function(btn, e){ var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; @@ -249,6 +298,13 @@ Bangle.on('touch', function(btn, e){ decreaseAlarm(); draw(true); } + + if(!is_lower && !is_upper){ + Bangle.buzz(40, 0.6); + settings.showInfo = (settings.showInfo+1) % 6; + storage.write(SETTINGS_FILE, settings); + draw(true); + } }); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 5a6ffced04dfa772ba6dfdcb61d7ecebd66575ae..db36a2088c06f3665d1b512ac14d1d9c8a884562 100644 GIT binary patch literal 2958 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 N3|)15gx^X$&E|DD}W`+J@%o*p=92^9$d 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 diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png deleted file mode 100644 index db36a2088c06f3665d1b512ac14d1d9c8a884562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2958 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 N (settings.showSteps ? 'Yes' : 'No'), - onchange: () => { - settings.showSteps = !settings.showSteps; - save(); - }, - }, 'Show Lock': { value: settings.showLock, format: () => (settings.showLock ? 'Yes' : 'No'), From bb310a15c2127236eda79c2af3670f2842a19332 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:56:28 +0200 Subject: [PATCH 112/174] Minor design improvement --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 2714a6492..66b3476f6 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -215,7 +215,7 @@ function draw() { g.drawString(timeStr, W/2, y); // Draw info or timer - y += H/5*2; + y += H/5*2-5; g.setFontAlign(0,0); if(isAlarmEnabled() || settings.showInfo > 0){ g.setSmallFont(); From 42c02763551e3dbec5efe2c2ca341a4cdfcde08a Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:59:58 +0200 Subject: [PATCH 113/174] Updated screenshots, icon etc. --- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 2 +- apps/bwclk/app.png | Bin 1795 -> 2116 bytes apps/bwclk/screenshot.png | Bin 2958 -> 2946 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index a90e091fd..1df0fa6a5 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgP/ADPHv4DB4Hj7wJC5nD7oLCz1zApffAonvDoQFB84LE62nFIXz63PGoXz6QFC+f//U/I4f+KxqTeh8AuFgAoMbwHwAoURwGw4AFBjOAmAFCj+MmOQAoWAmOYAoM5AoMYXoWAmf4AoWMmf8C4WImARCHYMgiBUUjOcAockpgFDnkIAomECIgFEjscRzI")) +require("heatshrink").decompress(atob("mEwgIcah0EgEB/H8iFsAoOY4kMBYMDhmGgXkAoUGiWkAoQQBoAFCjgnCAoM4hgFDuEI+wpC8EKyg1C/0eAoMAsEAiQvBAAeAApQAB/4Ao+P4v/wn0P8Pgn/wnkH4Pjv/j/nn9PH//n/nj/IFF4F88AXBAoM88EcAoPHj//jlDAoOf/+Y+YFHjnnjAjBEIIjD+BHDO9IALA==")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 66b3476f6..2ceb7c359 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -245,7 +245,7 @@ function draw() { // Draw lock if(settings.showLock && Bangle.isLocked()){ g.setColor(g.theme.fg); - g.drawImage(imgLock, 2, 2); + g.drawImage(imgLock, W-16, 2); } // Draw widgets if not fullscreen diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index c7c42effa88b07093d74b0322dc1446e2b148818..5073f0ed0ee9f9c74536e8120360af8caf25aa46 100644 GIT binary patch delta 2088 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 N Date: Sun, 3 Apr 2022 13:47:33 +0200 Subject: [PATCH 114/174] Included icons for data that is shown. --- apps/bwclk/ChangeLog | 3 +- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 80 +++++++++++++++++++++++++++++++----- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_2.png | Bin 3152 -> 2874 bytes 5 files changed, 74 insertions(+), 13 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ba8fd775b..05a22774f 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,4 +1,5 @@ 0.01: New App. 0.02: Use build in function for steps and other improvements. 0.03: Adapt colors based on the theme of the user. -0.04: Steps can be hidden now such that the time is even larger. \ No newline at end of file +0.04: Steps can be hidden now such that the time is even larger. +0.05: Included icons for information. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 31cc60270..64662f38b 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -10,7 +10,7 @@ - If the "alarm" app is installed tab top / bottom of the screen to set the timer. ## Thanks to -Lock icons created by Those Icons - Flaticon +Icons created by Flaticon ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 2ceb7c359..7382c1f1a 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,11 +1,19 @@ -const TIMER_IDX = "bwclk"; -const SETTINGS_FILE = "bwclk.setting.json"; +/* + * Includes + */ const locale = require('locale'); const storage = require('Storage'); +/* + * Statics + */ +const SETTINGS_FILE = "bwclk.setting.json"; +const TIMER_IDX = "bwclk"; +const W = g.getWidth(); +const H = g.getHeight(); /* - * Load settings + * Settings */ let settings = { fullscreen: false, @@ -37,7 +45,6 @@ Graphics.prototype.setMediumFont = function(scale) { return this; }; - Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); @@ -50,10 +57,47 @@ var imgLock = { buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) }; +var imgSteps = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA==")) +}; +var imgBattery = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA")) +}; + +var imgBpm = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA")) +}; + +var imgTemperature = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA==")) +}; + +var imgWind = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A==")) +}; + +var imgTimer = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) +}; + + +/* + * Draw timeout + */ // timeout used to update every minute -var W = g.getWidth(); -var H = g.getHeight(); var drawTimeout; // schedule a draw for the next minute @@ -67,7 +111,7 @@ function queueDraw() { /* - * Handle alarm + * Helper */ function getSteps() { try{ @@ -173,6 +217,9 @@ function decreaseAlarm(){ } +/* + * D R A W + */ function draw() { // queue draw in one minute queueDraw(); @@ -221,25 +268,38 @@ function draw() { g.setSmallFont(); var infoStr = ""; + var infoImg; if(isAlarmEnabled()){ - infoStr = "T-" + getAlarmMinutes() + " min."; + infoStr = getAlarmMinutes() + " min."; + infoImg = imgTimer; } else if (settings.showInfo == 1){ infoStr = E.getBattery() + "%"; + infoImg = imgBattery; } else if (settings.showInfo == 2){ infoStr = getSteps() infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead - infoStr = infoStr + "k steps"; + infoStr = infoStr + "k"; + infoImg = imgSteps; } else if (settings.showInfo == 3){ infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + infoImg = imgBpm; } else if (settings.showInfo == 4){ var weather = getWeather(); infoStr = weather.temp; + infoImg = imgTemperature; } else if (settings.showInfo == 5){ var weather = getWeather(); infoStr = weather.wind; + infoImg = imgWind; } - g.drawString(infoStr, W/2, y); + var imgWidth = 0; + if(infoImg !== undefined){ + imgWidth = infoImg.width; + var strWidth = g.stringWidth(infoStr); + g.drawImage(infoImg, W/2 - strWidth/2 - infoImg.width/2 - 5, y - infoImg.height/2); + } + g.drawString(infoStr, W/2 + imgWidth/2, y+3); } // Draw lock diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 9c81bd5cc..babaa37bf 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.04", + "version": "0.05", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_2.png b/apps/bwclk/screenshot_2.png index c5ce87521668c01d77216eb0ba1a1547110b196e..2f31c8b3c918944ea151e5fc4c6c0045fbdf3416 100644 GIT binary patch literal 2874 zcmbW3X*AS}8^?e1Gh-RaQlgO2sH|BFNf=|Mg)G@JVo8r_heu zS^v+73U6=fvuV%mfLwFLqJX+V#W?_guboC)IuSgV?hWOS8;hc&w|-a9x@ij?Q$6Ky z6)pF?ZuztJ9^MbH^WruI>kA*u1&3i78r*}#OuuuXiJAx^3>5%_hR?0_-hgNcpV=>y&~av~70COS&%`AauKf87Ay1@4xc}&vH~X~u zaqp+wsSXXulu7DgmmjVf<(8<<%u?PF)%mnMRpHiM>|f*k@}jK#*WK%t{M_et$DU|+ zXpyB>{05Ymxf%ZA698YE{0_iC=ACcnb{icx$3e;=t~vy}Y)Fd_ zR{xBy*{gjMCV8uXte1LoKCY6;e?4d>vz!GV&&(~P47WW^RKg$n$$Y3kG z!%}AXhB**;EemY6%ob^}A!Dl$FHT9t8eWHFRf>JQU!L5)X?(0GO6JXi)s;1d|Dwy~ zP^IV#)+pIg`^2uXuUUH9#wUu^B?}hKw1L9xJYY+g=<2VqQ@N(^M&A|`@ew1+mIV1B z1P4xO=^j_kPy>{k25cN-)V3--`KyXWJ`?PFy`gM~ilICQ8MXOrzWEw|J~VT!E#DR` zt85|C5+yJRHw&L?}+1= zw&#a|%@5ujc4iypyge{D6l?P4P#ynJ&XdS6`fiuM$A1b&w9(Wu%me(d&`6IlZ+NgI zSJr1bsx7}JNj^CwH4hMW&gNLRJ=xNy<-A}_CHxf+7W7OiNIjcz>im7%5aJ=luBkYI zD*9jp(^cQh@@*>>A6w16$_PC|?A?6{j54o?U)`nS_{i`Y#O4eW&T>&0O8&i1Ur^WS z{cO_D5s(A<38C44rQPJ1pgg<{)QP!^p21Hw!l#37`I8sz_KD)1#)?0yp}RLdSFp1f zD-7_BF5NRV@wB0?qM^Srwid*hjh}xrK^rBnIxUZvLUUR#C5Q53{(!T88_4Am7CIGv z&{0irY^OIQgp|xmA1z5h43`e~W$4Wd*5Gkp2#t!^&J}Q)xjY}#A@BcIi(j+Q??=6o z*`M5H`05CZ?Le;W3!)=w%UC%?5gMxas;gzI(b&vuhxJsE_p===WSa`0A{85FG2_>@ z&JR!`T{u~l0vJr6&NiyRQl)=J0!$S*eXJ~bA4ug zeroe%aSUDrHlcd)@pqO2Y^7&B-$RMg6C+-Mxdf9q@y+qq0)0pc!k=(OAPVJ<%u$sYKwVjTEmDewd;Bti3pOY0e3oMYgx%W`w289? zCgaD!|9te5J@#^@_ciNt?oM4n5Sgj#x8+zqi=~?M#*aw1-0<_G502 zPX}Y|%`r3hZ}CDC(%A;cQ*P*gJI zR!^D#?%QrQb@zsQ62hEkV!$1O?@~Xm@3PyedLV`0K59c{X{*sR!;ca)UA%-_PJL1b z%ESm&m4$%##K|Lt&&g084-h|=& zX3}5JBO!xH(U|WBMqyQ~R_j&5PKA}xzJD6p*ULWjk!D>PJ<6HyyPfc8w(@M67nbAu zyIhl-0nl3fk{Q~pm(dME2rRfrGV%ch1Y~Fe=}Z6Gf@xjDG2yy*)_6?!SS|E0AVf#);t<;`3eN3{K+Vf$YAxJ-JAF^Xd+%qNnE4Fi3D4gs+b zETj8uCK;_YP9!9y^*{zFv>aVm#q8gu;@BZyF??v3PxUSLRyQ6llc)~I3B?I7k3}JQ z<<5$yjf*SunLII8RtiU^0bs=3sb=*AMrT?km?C8ml-IedIH{P8;tMwtb!q~&JLU+D z>6!(H1gHI2!0V||MYexi zgx4v%RX9F2AOyx$5y7QYsGzW>EZs-LMXRg9j(d={&e*bU(E5f54qFt-Vjt*jLY-Q+<+-p^Ah&aVD;?H z=Y%F9zStwpJ0l`ep2XN|ZpDpLE$qz~-^0Y}*MYT@-)kdkk@N{{FE7?CvuEndJTF*+ zd)^wSgm3$Gtzfs|QB zKv#uAE$d?k{Vc0VwmE7asRVkTf@^fw2P#fhoJ>giJOUt@bEk&sh^Cy*HOo|H2Q=IY z8I*kGm7pvosx(e1t#)hAMkQr<3Ccwi9mq`TdHAG+*Nmmc;11mrSRWVht6m7?($4Z% z8ON$v7O)BFELrc6pQ=P<{U{gnwin0xK*G{SkEs;|qJ{pCez`~JUk|~0=}%66Obp#b QZObrl+WH*24uwzpA1k?5N&o-= delta 3135 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 Rdut@%FlY;V^9EBa;Xl+^z%~E? From 32e377941a56fdbba2a6ce3d46b2ac0827378396 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 13:48:19 +0200 Subject: [PATCH 115/174] Minor changes --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 7382c1f1a..39065164e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -239,7 +239,7 @@ function draw() { g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.drawString(dateStr, W/2-2, y+3); + g.drawString(dateStr, W/2-1, y+3); g.setSmallFont(); g.setFontAlign(-1,1); From 4c2b77a5fbce77ce4af58a222acedb52ae29c4c7 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 13:57:05 +0200 Subject: [PATCH 116/174] Minor changes --- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 64662f38b..0262ec7f7 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -5,7 +5,7 @@ ## Features - Fullscreen on/off - The design is adapted to the theme of your bangle. -- Tab in middle of screen to show between different information. +- Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. - If the "alarm" app is installed tab top / bottom of the screen to set the timer. diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 39065164e..65db16a53 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -341,9 +341,13 @@ Bangle.on('lock', function(isLocked) { }); Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.2); + var right = g.getWidth() - left; var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; + var is_left = e.x < left; + var is_right = e.x > right; var is_upper = e.y < upper; var is_lower = e.y > lower; @@ -359,9 +363,18 @@ Bangle.on('touch', function(btn, e){ draw(true); } - if(!is_lower && !is_upper){ + var maxInfo = 6; + if(is_right){ Bangle.buzz(40, 0.6); - settings.showInfo = (settings.showInfo+1) % 6; + settings.showInfo = (settings.showInfo+1) % maxInfo; + storage.write(SETTINGS_FILE, settings); + draw(true); + } + + if(is_left){ + Bangle.buzz(40, 0.6); + settings.showInfo = settings.showInfo-1; + settings.showInfo = settings.showInfo < 0 ? maxInfo-1 : settings.showInfo; storage.write(SETTINGS_FILE, settings); draw(true); } From d39174e792da14e6476f350861fa17d7d52ba6df Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 14:58:41 +0200 Subject: [PATCH 117/174] Minor changes --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 65db16a53..bee40f10d 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -239,7 +239,7 @@ function draw() { g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.drawString(dateStr, W/2-1, y+3); + g.drawString(dateStr, W/2-1, y+4); g.setSmallFont(); g.setFontAlign(-1,1); From 11d3c5c10e5c22bb34a4868ba86350062825a76d Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 14:59:14 +0200 Subject: [PATCH 118/174] Minor changes --- apps/bwclk/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index bee40f10d..420b7e24d 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -154,10 +154,10 @@ function getWeather(){ } return { - temp: "??? °C", + temp: "? °C", hum: "-", txt: "-", - wind: "??? km/h", + wind: "? km/h", wdir: "-", wrose: "-" }; From eba8b17a54184ef11e974fa761b597fb9b1f7e54 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 15:33:54 +0200 Subject: [PATCH 119/174] Show charging icon. --- apps/bwclk/app.js | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 420b7e24d..8456f7a6b 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -93,6 +93,13 @@ var imgTimer = { buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) }; +var imgCharging = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA=")) +}; + + /* * Draw timeout @@ -224,6 +231,17 @@ function draw() { // queue draw in one minute queueDraw(); + // Set info + var showInfo = settings.showInfo; + if(isAlarmEnabled()){ + showInfo = 100; + } + + if(Bangle.isCharging()){ + showInfo = 101; + } + + // Draw background var yOffset = settings.fullscreen ? 0 : 10; var y = H/5*2 + yOffset; @@ -252,7 +270,7 @@ function draw() { var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; - if(!isAlarmEnabled() && settings.showInfo == 0){ + if(showInfo == 0){ y += 8; g.setLargeFont(); } else { @@ -264,30 +282,33 @@ function draw() { // Draw info or timer y += H/5*2-5; g.setFontAlign(0,0); - if(isAlarmEnabled() || settings.showInfo > 0){ + if(showInfo > 0){ g.setSmallFont(); var infoStr = ""; var infoImg; - if(isAlarmEnabled()){ + if(showInfo == 100){ infoStr = getAlarmMinutes() + " min."; infoImg = imgTimer; - } else if (settings.showInfo == 1){ + } else if(showInfo == 101){ + infoStr = ""; + infoImg = imgCharging; + } else if (showInfo == 1){ infoStr = E.getBattery() + "%"; infoImg = imgBattery; - } else if (settings.showInfo == 2){ + } else if (showInfo == 2){ infoStr = getSteps() infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead infoStr = infoStr + "k"; infoImg = imgSteps; - } else if (settings.showInfo == 3){ + } else if (showInfo == 3){ infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; infoImg = imgBpm; - } else if (settings.showInfo == 4){ + } else if (showInfo == 4){ var weather = getWeather(); infoStr = weather.temp; infoImg = imgTemperature; - } else if (settings.showInfo == 5){ + } else if (showInfo == 5){ var weather = getWeather(); infoStr = weather.wind; infoImg = imgWind; From d85017896c95904f1a6a9ebafe7e187882bbf219 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 15:59:20 +0200 Subject: [PATCH 120/174] Listen for oncharging event --- apps/bwclk/app.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 8456f7a6b..26cd3a2b5 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -361,6 +361,12 @@ Bangle.on('lock', function(isLocked) { draw(); }); +Bangle.on('charging',function(charging) { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.2); var right = g.getWidth() - left; From f7d1fda5ff0145e4989686692cd5612e391dbfda Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 22:18:26 +0200 Subject: [PATCH 121/174] Minor fixes --- apps/bwclk/app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 26cd3a2b5..c3e13ee73 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -291,7 +291,7 @@ function draw() { infoStr = getAlarmMinutes() + " min."; infoImg = imgTimer; } else if(showInfo == 101){ - infoStr = ""; + infoStr = E.getBattery() + "%"; infoImg = imgCharging; } else if (showInfo == 1){ infoStr = E.getBattery() + "%"; @@ -381,13 +381,13 @@ Bangle.on('touch', function(btn, e){ if(is_upper){ Bangle.buzz(40, 0.6); increaseAlarm(); - draw(true); + draw(); } if(is_lower){ Bangle.buzz(40, 0.6); decreaseAlarm(); - draw(true); + draw(); } var maxInfo = 6; @@ -395,7 +395,7 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.6); settings.showInfo = (settings.showInfo+1) % maxInfo; storage.write(SETTINGS_FILE, settings); - draw(true); + draw(); } if(is_left){ @@ -403,7 +403,7 @@ Bangle.on('touch', function(btn, e){ settings.showInfo = settings.showInfo-1; settings.showInfo = settings.showInfo < 0 ? maxInfo-1 : settings.showInfo; storage.write(SETTINGS_FILE, settings); - draw(true); + draw(); } }); From 1bc47eb3f17e85e3476d7827805f14024a6cadcd Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:49:52 +0100 Subject: [PATCH 122/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index ba1db294f..fdeda5c51 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -2,7 +2,7 @@ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Center'}; if (settings.language == 'System') { settings.language = require('locale').name; @@ -12,6 +12,15 @@ let fuzzy_string = fuzzy_strings[settings.language]; const h = g.getHeight(); const w = g.getWidth(); +let align_mode = 0; +let align_pos = w/2; +if (settings.alignment =='Left') { + align_mode = -1; + align_pos = 0; +} else if (settings.alignment == 'Right') { + align_mode = 1; + align_pos = w; +} function getTimeString(date) { let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); @@ -29,10 +38,10 @@ function draw() { let time_string = getTimeString(new Date()).replace('*', ''); // print(time_string); g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); - g.setFontAlign(0, 0); + g.setFontAlign(align_mode, 0); g.clearRect(0, 24, w, h-24); g.setColor(g.theme.fg); - g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); + g.drawString(g.wrapString(time_string, w).join("\n"), align_pos, h/2); } g.clear(); From 4e3a3c36d5a6ebaa9cee46598f6e96c43e40f41a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:51:28 +0100 Subject: [PATCH 123/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index cb0d1117c..52526f6b6 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -5,7 +5,7 @@ var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... - let s = {'language': language_options[0], 'align': align_options[1]}; + let s = {'language': language_options[0], 'alignment': align_options[1]}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -22,14 +22,14 @@ } E.showMenu({ - '': { 'title': 'Fuzzy Clock' }, + '': { 'title': 'Fuzzy Word Clock' }, '< Back': back, 'Language': { value: 0 | language_options.indexOf(s.theme), min: 0, max: language_options.length - 1, format: v => language_options[v], onchange: v => { - s.theme = language_options[v]; + s.language = language_options[v]; save(); } }, @@ -38,7 +38,7 @@ min: 0, max: align_options.length - 1, format: v => align_options[v], onchange: v => { - s.theme = align_options[v]; + s.alignment = align_options[v]; save(); } }, From 1ee8dfd3a7b008c506f1490ead81123f4f4bea96 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:52:02 +0100 Subject: [PATCH 124/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 52526f6b6..b316dc159 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -22,7 +22,7 @@ } E.showMenu({ - '': { 'title': 'Fuzzy Word Clock' }, + '': { 'title': 'Fuzzy Text Clock' }, '< Back': back, 'Language': { value: 0 | language_options.indexOf(s.theme), From 417a575d5149025f49355ebdb84f5ad26dca450e Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:59:39 +0100 Subject: [PATCH 125/174] Update metadata.json --- apps/fuzzyw/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 2cc670c79..0a8d0f4a9 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,8 +12,8 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, - {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.app.js","url":"app.js"}, + {"name":"fuzzyw.settings.js","url":"settings.js"}, {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] From 195d279a747749394682a525d9fbbe5a93bd7668 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:01:18 +0100 Subject: [PATCH 126/174] Update metadata.json --- apps/fuzzyw/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 0a8d0f4a9..a8db0d604 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,9 +12,9 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"fuzzyw.app.js","url":"app.js"}, - {"name":"fuzzyw.settings.js","url":"settings.js"}, - {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"app.js","url":"fuzzyw.app.js"}, + {"name":"settings.js","url":"fuzzyw.settings.js"}, + {"name":"icon.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From aab8df3bee340bd2c8a1a787d77b5869314273a1 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:02:41 +0100 Subject: [PATCH 127/174] Update metadata.json --- apps/fuzzyw/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index a8db0d604..2cc670c79 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,9 +12,9 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"app.js","url":"fuzzyw.app.js"}, - {"name":"settings.js","url":"fuzzyw.settings.js"}, - {"name":"icon.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, + {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From d9a3c0a44c490f09267a14114e2df555964818bc Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:10:51 +0100 Subject: [PATCH 128/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index fdeda5c51..494e45124 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -2,7 +2,7 @@ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Center'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; if (settings.language == 'System') { settings.language = require('locale').name; From 1d122ef08ee1d23890e21a8dde3be03fc84ccd1b Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:12:48 +0100 Subject: [PATCH 129/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index b316dc159..32a8b9031 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -1,5 +1,5 @@ (function(back) { - const SETTINGS_FILE = "fuzzyw.json"; + const SETTINGS_FILE = "fuzzyw.settings.json"; var align_options = ['Left','Centre','Right']; var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; From a719435d5622ad1c359eaecbfb1dc37c8cd37024 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:31:29 +0100 Subject: [PATCH 130/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 32a8b9031..765c4f3e4 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -5,7 +5,7 @@ var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... - let s = {'language': language_options[0], 'alignment': align_options[1]}; + let s = {'language': 'System', 'alignment': 'Centre'}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings From b27b6b0277902f8a93cfd9e338319cbb4cee6a50 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:57:01 +0100 Subject: [PATCH 131/174] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 765c4f3e4..00219accf 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -25,7 +25,7 @@ '': { 'title': 'Fuzzy Text Clock' }, '< Back': back, 'Language': { - value: 0 | language_options.indexOf(s.theme), + value: 0 | language_options.indexOf(s.language), min: 0, max: language_options.length - 1, format: v => language_options[v], onchange: v => { @@ -34,7 +34,7 @@ } }, 'Alignment': { - value: 0 | align_options.indexOf(s.theme), + value: 0 | align_options.indexOf(s.alignment), min: 0, max: align_options.length - 1, format: v => align_options[v], onchange: v => { From 84554868e6ff733034cf0e043e4004adab502c93 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:00:45 +0100 Subject: [PATCH 132/174] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 2cc670c79..ebd20e49f 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -3,7 +3,7 @@ "name":"Fuzzy Text Clock", "shortName": "Fuzzy Text", "version": "0.01", - "description": "An inaccurate clock for when you're not in a rush", + "description": "An imprecise clock for when you're not in a rush", "readme": "README.md", "icon":"fuzzyw.png", "screenshots": [{"url":"fuzzyw-light.png"},{"url":"fuzzyw-dark.png"}], From b496307227f6e774bfc77bb14f02b768fcd3060e Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:01:36 +0100 Subject: [PATCH 133/174] Update README.md --- apps/fuzzyw/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index 1b5f2b8e8..b1afeb961 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -1,12 +1,12 @@ # Fuzzy Text Clock -An inaccurate clock for when you're not in a rush. +An imprecise clock for when you're not in a rush. This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! ## TODO -* Other languages (currently only uk style time, could tie into the Languages app) -* Bold hour word +* Bold hour word (as the pebble version has) +* Animation when changing time? ## References Based on Pebble app Fuzzy Text International: https://github.com/hallettj/Fuzzy-Text-International From c7049589fe326d4963a49d5d3f182ebdfbd5850f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:04:04 +0100 Subject: [PATCH 134/174] Update README.md --- apps/fuzzyw/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index b1afeb961..9ad90bccd 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -4,6 +4,16 @@ An imprecise clock for when you're not in a rush. This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! +By default it will use the language set on the watch, go to settings to pick: +* en_GB - English +* en_US - American +* es_ES - Spanish +* fr_FR - French +* no_NO - Norwegian +* sv_SE - Swedish +* de_DE - German +Most translations are taken from the original Fuzzy Text International code. + ## TODO * Bold hour word (as the pebble version has) * Animation when changing time? From aed0aa165909cea413cbfe14571f08fda5c3a19c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:04:23 +0100 Subject: [PATCH 135/174] Update README.md --- apps/fuzzyw/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index 9ad90bccd..906eb167b 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -12,6 +12,7 @@ By default it will use the language set on the watch, go to settings to pick: * no_NO - Norwegian * sv_SE - Swedish * de_DE - German + Most translations are taken from the original Fuzzy Text International code. ## TODO From 5c84ec9e2cdace86854666d1cef23be61491e7d8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 4 Apr 2022 15:49:45 +0100 Subject: [PATCH 136/174] Refactored alarm into separate 'sched' library/app --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 80 +---------------------- apps/alarm/app.js | 6 +- apps/alarm/boot.js | 32 --------- apps/alarm/metadata.json | 13 ++-- apps/alarm/widget.js | 2 +- apps/sched/ChangeLog | 1 + apps/sched/README.md | 82 ++++++++++++++++++++++++ apps/sched/app-icon.js | 1 + apps/sched/app.png | Bin 0 -> 1223 bytes apps/sched/boot.js | 27 ++++++++ apps/{alarm => sched}/lib.js | 12 ++-- apps/sched/metadata.json | 18 ++++++ apps/{alarm/alarm.js => sched/sched.js} | 8 +-- 14 files changed, 151 insertions(+), 132 deletions(-) delete mode 100644 apps/alarm/boot.js create mode 100644 apps/sched/ChangeLog create mode 100644 apps/sched/README.md create mode 100644 apps/sched/app-icon.js create mode 100644 apps/sched/app.png create mode 100644 apps/sched/boot.js rename apps/{alarm => sched}/lib.js (77%) create mode 100644 apps/sched/metadata.json rename apps/{alarm/alarm.js => sched/sched.js} (90%) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index e07e748d4..0811f2166 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -15,3 +15,4 @@ 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system 0.16: Adding alarm library +0.17: Moving alarm internals to 'sched' library diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 7bc4b7155..42131a5a6 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -1,82 +1,6 @@ Default Alarm & Timer ====================== -This provides an app, widget, library and tools for alarms and timers. +This allows you to add/modify any running timers. -Other apps can use this to provide alarm functionality. - -App ---- - -The Alarm app allows you to add/modify any running timers. - - -Internals / Library -------------------- - -Alarms are stored in an array in `alarm.json`, and take the form: - -``` -{ - id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers - on : true, // is the alarm enabled? - t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) - dow : 0b1111111, // Binary encoding for days of the week to run alarm on - // SUN = 1 - // MON = 2 - // TUE = 4 - // WED = 8 - // THU = 16 - // FRI = 32 - // SAT = 64 - msg : "Eat chocolate", // message to display - last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! - rp : true, // repeat - vibrate : "...", // pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) - as : false, // auto snooze - timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms - js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'alarm.js') - // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) - data : { ... } // OPTIONAL - your app can store custom data in here if needed -} -``` - -You app - -The [`alarm` library](https://github.com/espruino/BangleApps/blob/master/apps/alarm/lib.js) contains -a few helpful functions for getting/setting alarms, but is intentionally sparse so as not to -use too much RAM. - -It can be used as follows: - -``` -// add/update an existing alarm -require("alarm").setAlarm("mytimer", { - msg : "Wake up", - timer : 10*60*1000, // 10 Minutes -}); -// Ensure the widget and alarm timer updates to schedule the new alarm properly -require("alarm").reload(); - -// Get the time to the next alarm for us -var timeToNext = require("alarm").getTimeToAlarm(require("alarm").getAlarm("mytimer")); -// timeToNext===undefined if no alarm or alarm disabled - -// delete an alarm -require("alarm").setAlarm("mytimer", undefined); -// reload after deleting... -require("alarm").reload(); - -// Or add an alarm that runs your own code - in this case -// loading the settings app. The alarm will not be removed/stopped -// automatically. -require("alarm").setAlarm("customrunner", { - js : "load('setting.app.js')", - timer : 1*60*1000, // 1 Minute -}); -``` - - - -If your app requires alarms, you can specify that the alarms app needs to -be installed by adding `"dependencies": {"alarm":"app"},` to your metadata. +It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master/apps/sched) to handle the alarm scheduling in an efficient way that can work alongside other apps. diff --git a/apps/alarm/app.js b/apps/alarm/app.js index e83e1c3d5..d5379f469 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,7 +1,7 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); -var alarms = require("Storage").readJSON("alarm.json",1)||[]; +var alarms = require("Storage").readJSON("sched.json",1)||[]; // An array of alarm objects (see README.md) // time in ms -> { hrs, mins } @@ -31,8 +31,8 @@ function getCurrentTime() { } function saveAndReload() { - require("Storage").write("alarm.json",JSON.stringify(alarms)); - require("alarm").reload(); + require("Storage").write("sched.json",JSON.stringify(alarms)); + require("sched").reload(); } function showMainMenu() { diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js deleted file mode 100644 index cb3a82a7e..000000000 --- a/apps/alarm/boot.js +++ /dev/null @@ -1,32 +0,0 @@ -// check for alarms -(function() { - if (Bangle.ALARM) { - clearTimeout(Bangle.ALARM); - delete Bangle.ALARM; - } - var alarms = require('Storage').readJSON('alarm.json',1)||[]; - var time = new Date(); - var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1); - if (active.length) { - active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); - var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); - if (!require('Storage').read("alarm.js")) { - console.log("No alarm app!"); - require('Storage').write('alarm.json',"[]"); - } else { - var t = active[0].t-currentTime; - if (active[0].last == time.getDate() || t < -60000) t += 86400000; - if (t<1000) t=1000; // start alarm min 1 sec from now - /* execute alarm at the correct time. We avoid execing immediately - since this code will get called AGAIN when alarm.js is loaded. alarm.js - will then clearInterval() to get rid of this call so it can proceed - normally. - If active[0].js is defined, just run that code as-is and not alarm.js */ - Bangle.ALARM = setTimeout(active[0].js||'load("alarm.js")',t); - } - } else { // check for new alarms at midnight (so day of week works) - Bangle.ALARM = setTimeout(() => { - eval(require("Storage").read("alarm.boot.js")); - }, 86400000 - (Date.now()%86400000)); - } -})(); diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index c10f64a5c..726e2461c 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -1,20 +1,17 @@ { "id": "alarm", - "name": "Default Alarm & Timer", + "name": "Alarm & Timer", "shortName": "Alarms", - "version": "0.16", + "version": "0.17", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", + "dependencies": {"scheduler":"type"}, "storage": [ {"name":"alarm.app.js","url":"app.js"}, - {"name":"alarm.boot.js","url":"boot.js"}, - {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"}, - {"name":"alarm","url":"lib.js"} - ], - "data": [{"name":"alarm.json"}] + {"name":"alarm.wid.js","url":"widget.js"} + ] } diff --git a/apps/alarm/widget.js b/apps/alarm/widget.js index 54c17dc6d..052ac9ebd 100644 --- a/apps/alarm/widget.js +++ b/apps/alarm/widget.js @@ -2,7 +2,7 @@ WIDGETS["alarm"]={area:"tl",width:0,draw:function() { if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); },reload:function() { // don't include library here as we're trying to use as little RAM as possible - WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; + WIDGETS["alarm"].width = (require('Storage').readJSON('sched.json',1)||[]).some(alarm=>alarm.on&&(alarm.hidden!==false)) ? 24 : 0; } }; WIDGETS["alarm"].reload(); diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/sched/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/sched/README.md b/apps/sched/README.md new file mode 100644 index 000000000..03d93c688 --- /dev/null +++ b/apps/sched/README.md @@ -0,0 +1,82 @@ +Sched: Scheduling library for alarms and timers +==================================== + +This provides boot code, a library and tools for alarms and timers. + +Other apps can use this to provide alarm functionality. + +App +--- + +The Alarm app allows you to add/modify any running timers. + + +Internals / Library +------------------- + +Alarms are stored in an array in `sched.json`, and take the form: + +``` +{ + id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + on : true, // is the alarm enabled? + t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) + dow : 0b1111111, // Binary encoding for days of the week to run alarm on + // SUN = 1 + // MON = 2 + // TUE = 4 + // WED = 8 + // THU = 16 + // FRI = 32 + // SAT = 64 + + date : "2022-04-04", // OPTIONAL date for the alarm, in YYYY-MM-DD format + // eg (new Date()).toISOString().substr(0,10) + msg : "Eat food", // message to display + last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! + rp : true, // repeat the alarm every day? + vibrate : "...", // OPTIONAL pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) + hidden : false, // OPTIONAL if false, the widget should not show an icon for this alarm + as : false, // auto snooze + timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms + js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'sched.js') + // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) + data : { ... } // OPTIONAL - your app can store custom data in here if needed +} +``` + +The [`sched` library](https://github.com/espruino/BangleApps/blob/master/apps/sched/lib.js) contains +a few helpful functions for getting/setting alarms and timers, but is intentionally sparse so as not to +use too much RAM. + +It can be used as follows: + +``` +// add/update an existing alarm +require("sched").setAlarm("mytimer", { + msg : "Wake up", + timer : 10*60*1000, // 10 Minutes +}); +// Ensure the widget and alarm timer updates to schedule the new alarm properly +require("sched").reload(); + +// Get the time to the next alarm for us +var timeToNext = require("sched").getTimeToAlarm(require("sched").getAlarm("mytimer")); +// timeToNext===undefined if no alarm or alarm disabled + +// delete an alarm +require("sched").setAlarm("mytimer", undefined); +// reload after deleting... +require("sched").reload(); + +// Or add an alarm that runs your own code - in this case +// loading the settings app. The alarm will not be removed/stopped +// automatically. +require("sched").setAlarm("customrunner", { + js : "load('setting.app.js')", + timer : 1*60*1000, // 1 Minute +}); +``` + +If your app requires alarms, you can specify that the alarms app needs to +be installed by adding `"dependencies": {"scheduler":"type"},` to your metadata. diff --git a/apps/sched/app-icon.js b/apps/sched/app-icon.js new file mode 100644 index 000000000..05515e859 --- /dev/null +++ b/apps/sched/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkGswAhiMRCCAREAo4eHBIQLEAgwYHsIJDiwHB5gACBpIhHCoYZEGA4gFCw4ABGA4HEjgXJ4IXGAwcUB4VEmf//8zogICoJIFAodMBoNDCoIADmgJB4gXIFwXDCwoABngwFC4guB4k/CQXwh4EC+YMCC44iBp4qDC4n/+gNBC41sEIJCEC4v/GAPGC4dhXYRdFC4xhCCYIXCdQRdDC5HzegQXCsxGHC45IDCwQXCUgwXHJAIXGRogXJSIIXcOw4XIPAYXcBwv/mEDBAwXOgtQC65QGC5vzoEAJAx3Nmk/mEABIiPN+dDAQIwFC4zXGFwKRCGAjvMFwQECGAgXI4YuGGAUvAgU8C4/EFwwGCAgdMC4p4EFwobFOwoXDJAIoEAApGBC4xIEABJGHGAapEAAqNBFwwXD4heI+YuBC5BIBVQhdHIw4wD5inFS4IKCCxFmigNCokzCoMzogICoIWIsMRjgPCAA3BiMWC48RBQIXJEgMRFxAJCCw4lEC44IECooOIBAaBJKwhgIAH4ACA==")) diff --git a/apps/sched/app.png b/apps/sched/app.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5784bde644cca9d42f2081e2a9d05872f7d82a GIT binary patch literal 1223 zcmV;&1UUPNP)yt~5>heLDBtbIv{Ickem(+#iGyMi?Ot;mye3`tA2XRuFvAAO+_-k8R4C zi)@4+UQnF}5R&Y<%K8f+q!11u*zif>(|s-(3`e|Cm=^8hn?Hp74uk^;HbOptsQCz& zAN(1BFDh5h82?vz>^urWeh0#3G}s8|K(G<=IWVsy6bSs%XQAm-4M@SuFYV*0wETJL z&ua%BB?q$7jJ*E*QuMk=BrYah=ZTFTVb8%`437;1U^d3F`^`N#R5Rah!3N>pR1{@t#t=A zfQCFQ$<5 zq=_4&XSwv-ZVvCgM1RjPSvk*e>buh@v5UDmewA_8D6UB-cPAXAm{t)JrKkB)J-tKc zJfBinS|>jeA=T_5e@%GEjm^g1JzISss0 z`YINSh1}d+PM$o8!C>&KJMJ2zzI{7R)!}h>TiurSucyldyb9eIJ*&~#D@rjN6KHE| zqoAMwtJO+TQ4wQfV}5lPM;lnby!bvtN}s9}uwLk+vXvy6ble`dYrKrassB}ay`I+A zRyJcxoVgf4T+iCN?Qkrk(07jTf(^YP6y# zoH%iU!ootVRx4Jk6;)L!FE5{ACqY>@eVB?D<`sZ<_c)hsQcO#;NHKFcMNz1(uBN19 z>SUPBW*>d8GV5~}1iTm0MaQ8!r;_lNW00lBv>Efo#l>`VbRdKvFE7tW|CVDwqXi6j z&j&mJ!=elv&c6Y$57~SI0LagOa06$*X47a1=e_3xUWMX~8#LPX$1x_<@j2@{RR^~I zrfD3pa2J^e@y2IatV;plwsV-~o_Zv+Uo{d*OHVy_oFf1T=p9NPY4Mf|cmNSZk(Ts^ zmduw2EF8VC@1Z;4R2>|>P{-wg4i8I8A>Z@YUeD>(^MBxj)))3msP>FwW6b2N*h)rX zwpLzm-uVankPTaZllJBBx%t3mZoyt;k==Pa)yyslvKkP#ox_~5H*&___%JoCorZS5 z0t>bS9@MlI6eGpQK>94Azar$j{yNaFrZ!U!Y8@h>Y%nWN0p7Wn`G002ovPDHLkV1nE7J?;Pi literal 0 HcmV?d00001 diff --git a/apps/sched/boot.js b/apps/sched/boot.js new file mode 100644 index 000000000..15c332ad7 --- /dev/null +++ b/apps/sched/boot.js @@ -0,0 +1,27 @@ +// check for alarms +(function() { + if (Bangle.ALARM) { + clearTimeout(Bangle.ALARM); + delete Bangle.ALARM; + } + var alarms = require('Storage').readJSON('sched.json',1)||[]; + var time = new Date(); + var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1 && (!a.date || a.date==time.toISOString().substr(0,10))); + if (active.length) { + active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + var t = active[0].t-currentTime; + if (active[0].last == time.getDate() || t < -60000) t += 86400000; + if (t<1000) t=1000; // start alarm min 1 sec from now + /* execute alarm at the correct time. We avoid execing immediately + since this code will get called AGAIN when alarm.js is loaded. alarm.js + will then clearInterval() to get rid of this call so it can proceed + normally. + If active[0].js is defined, just run that code as-is and not alarm.js */ + Bangle.ALARM = setTimeout(active[0].js||'load("sched.js")',t); + } else { // check for new alarms at midnight (so day of week works) + Bangle.ALARM = setTimeout(() => { + eval(require("Storage").read("sched.boot.js")); + }, 86400000 - (Date.now()%86400000)); + } +})(); diff --git a/apps/alarm/lib.js b/apps/sched/lib.js similarity index 77% rename from apps/alarm/lib.js rename to apps/sched/lib.js index a0d8b3938..9d9744b1f 100644 --- a/apps/alarm/lib.js +++ b/apps/sched/lib.js @@ -1,15 +1,15 @@ // Return an array of all alarms exports.getAlarms = function() { - return require("Storage").readJSON("alarm.json",1)||[]; + return require("Storage").readJSON("sched.json",1)||[]; }; // Return an alarm object based on ID exports.getAlarm = function(id) { - var alarms = require("Storage").readJSON("alarm.json",1)||[]; + var alarms = require("Storage").readJSON("sched.json",1)||[]; return alarms.find(a=>a.id==id); }; // Set an alarm object based on ID. Leave 'alarm' undefined to remove it exports.setAlarm = function(id, alarm) { - var alarms = require("Storage").readJSON("alarm.json",1)||[]; + var alarms = require("Storage").readJSON("sched.json",1)||[]; alarms = alarms.filter(a=>a.id!=id); if (alarm !== undefined) { alarm.id = id; @@ -22,13 +22,13 @@ exports.setAlarm = function(id, alarm) { } } alarms.push(alarm); - require("Storage").writeJSON("alarm.json", alarms); + require("Storage").writeJSON("sched.json", alarms); }; /// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future exports.getTimeToAlarm = function(alarm, time) { if (!alarm) return undefined; if (!time) time = new Date(); - var active = alarm.on && (alarm.dow>>time.getDay())&1; + var active = alarm.on && (alarm.dow>>time.getDay())&1 && (!alarm.date || alarm.date==time.toISOString().substr(0,10)); if (!active) return undefined; var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); var t = alarm.t-currentTime; @@ -37,7 +37,7 @@ exports.getTimeToAlarm = function(alarm, time) { }; /// Force a reload of the current alarms and widget exports.reload = function() { - eval(require("Storage").read("alarm.boot.js")); + eval(require("Storage").read("sched.boot.js")); if (WIDGETS["alarm"]) { WIDGETS["alarm"].reload(); Bangle.drawWidgets(); diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json new file mode 100644 index 000000000..60aa71d41 --- /dev/null +++ b/apps/sched/metadata.json @@ -0,0 +1,18 @@ +{ + "id": "sched", + "name": "Scheduler", + "version": "0.01", + "description": "Scheduling library for alarms and timers", + "icon": "app.png", + "type": "scheduler", + "tags": "tool,system,alarm", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"sched.boot.js","url":"boot.js"}, + {"name":"sched.js","url":"sched.js"}, + {"name":"sched.img","url":"app-icon.js","evaluate":true}, + {"name":"sched","url":"lib.js"} + ], + "data": [{"name":"sched.json"}] +} diff --git a/apps/alarm/alarm.js b/apps/sched/sched.js similarity index 90% rename from apps/alarm/alarm.js rename to apps/sched/sched.js index 7ec8d0b73..f42a15fc3 100644 --- a/apps/alarm/alarm.js +++ b/apps/sched/sched.js @@ -1,5 +1,5 @@ // Chances are boot0.js got run already and scheduled *another* -// 'load(alarm.js)' - so let's remove it first! +// 'load(sched.js)' - so let's remove it first! if (Bangle.ALARM) { clearInterval(Bangle.ALARM); delete Bangle.ALARM; @@ -54,7 +54,7 @@ function showAlarm(alarm) { } if (!alarm.rp) alarm.on = false; } - require("Storage").write("alarm.json",JSON.stringify(alarms)); + require("Storage").write("sched.json",JSON.stringify(alarms)); load(); }); function buzz() { @@ -74,8 +74,8 @@ function showAlarm(alarm) { // Check for alarms var day = (new Date()).getDate(); var currentTime = getCurrentTime()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early -var alarms = require("Storage").readJSON("alarm.json",1)||[]; -var active = alarms.filter(a=>a.on&&(a.ta.on&&(a.ta.t-b.t); From 25aafe1ccf3efebb81b6406ed3a8e2e2f2b1465c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 4 Apr 2022 16:58:17 +0100 Subject: [PATCH 137/174] more refactoring to try and reduce code duplication --- apps/alarm/app.js | 6 +++--- apps/alarm/metadata.json | 2 +- apps/qalarm/metadata.json | 2 +- apps/sched/boot.js | 14 ++++++-------- apps/sched/lib.js | 19 ++++++++++++++----- apps/sched/sched.js | 37 +++++++++---------------------------- 6 files changed, 34 insertions(+), 46 deletions(-) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index d5379f469..45edd83f5 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,8 +1,8 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); -var alarms = require("Storage").readJSON("sched.json",1)||[]; -// An array of alarm objects (see README.md) +var alarms = require("sched").getAlarms(); +// An array of alarm objects (see sched/README.md) // time in ms -> { hrs, mins } function decodeTime(t) { @@ -31,7 +31,7 @@ function getCurrentTime() { } function saveAndReload() { - require("Storage").write("sched.json",JSON.stringify(alarms)); + require("sched").setAlarms(alarms); require("sched").reload(); } diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 726e2461c..fe82e04c9 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -3,7 +3,7 @@ "name": "Alarm & Timer", "shortName": "Alarms", "version": "0.17", - "description": "Set and respond to alarms and timers", + "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", "supports": ["BANGLEJS","BANGLEJS2"], diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 326ba33a7..2039af4bf 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -4,7 +4,7 @@ "shortName": "Q Alarm", "icon": "app.png", "version": "0.04", - "description": "Alarm and timer app with days of week and 'hard' option.", + "description": "[Not recommended - use 'Alarm & Timer' app] Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ diff --git a/apps/sched/boot.js b/apps/sched/boot.js index 15c332ad7..c772a135e 100644 --- a/apps/sched/boot.js +++ b/apps/sched/boot.js @@ -1,8 +1,8 @@ // check for alarms -(function() { - if (Bangle.ALARM) { - clearTimeout(Bangle.ALARM); - delete Bangle.ALARM; +(function() { // run in closure to ensure allocated vars get removed + if (Bangle.SCHED) { + clearTimeout(Bangle.SCHED); + delete Bangle.SCHED; } var alarms = require('Storage').readJSON('sched.json',1)||[]; var time = new Date(); @@ -18,10 +18,8 @@ will then clearInterval() to get rid of this call so it can proceed normally. If active[0].js is defined, just run that code as-is and not alarm.js */ - Bangle.ALARM = setTimeout(active[0].js||'load("sched.js")',t); + Bangle.SCHED = setTimeout(active[0].js||'load("sched.js")',t); } else { // check for new alarms at midnight (so day of week works) - Bangle.ALARM = setTimeout(() => { - eval(require("Storage").read("sched.boot.js")); - }, 86400000 - (Date.now()%86400000)); + Bangle.SCHED = setTimeout('eval(require("Storage").read("sched.boot.js"))', 86400000 - (Date.now()%86400000)); } })(); diff --git a/apps/sched/lib.js b/apps/sched/lib.js index 9d9744b1f..4b645aede 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -2,15 +2,24 @@ exports.getAlarms = function() { return require("Storage").readJSON("sched.json",1)||[]; }; +// Write a list of alarms back to storage +exports.setAlarms = function(alarms) { + return require("Storage").writeJSON("sched.json",alarms); +}; // Return an alarm object based on ID exports.getAlarm = function(id) { - var alarms = require("Storage").readJSON("sched.json",1)||[]; - return alarms.find(a=>a.id==id); + return exports.getAlarms().find(a=>a.id==id); }; +// Given a list of alarms from getAlarms, return a list of active alarms for the given time (or current time if time not specified) +exports.getActiveAlarms = function(alarms, time) { + if (!time) time = new Date(); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000) + +10000;// get current time - 10s in future to ensure we alarm if we've started the app a tad early + return alarms.filter(a=>a.on&&(a.ta.t-b.t); +} // Set an alarm object based on ID. Leave 'alarm' undefined to remove it exports.setAlarm = function(id, alarm) { - var alarms = require("Storage").readJSON("sched.json",1)||[]; - alarms = alarms.filter(a=>a.id!=id); + var alarms = exports.getAlarms().filter(a=>a.id!=id); if (alarm !== undefined) { alarm.id = id; if (alarm.dow===undefined) alarm.dow = 0b1111111; @@ -22,7 +31,7 @@ exports.setAlarm = function(id, alarm) { } } alarms.push(alarm); - require("Storage").writeJSON("sched.json", alarms); + exports.setAlarms(alarms); }; /// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future exports.getTimeToAlarm = function(alarm, time) { diff --git a/apps/sched/sched.js b/apps/sched/sched.js index f42a15fc3..a19c85717 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -1,8 +1,8 @@ // Chances are boot0.js got run already and scheduled *another* // 'load(sched.js)' - so let's remove it first! -if (Bangle.ALARM) { - clearInterval(Bangle.ALARM); - delete Bangle.ALARM; +if (Bangle.SCHED) { + clearInterval(Bangle.SCHED); + delete Bangle.SCHED; } // time in ms -> { hrs, mins } @@ -12,25 +12,11 @@ function decodeTime(t) { return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) }; } -// time in { hrs, mins } -> ms -function encodeTime(o) { - return o.hrs*3600000 + o.mins*60000; -} - function formatTime(t) { var o = decodeTime(t); return o.hrs+":"+("0"+o.mins).substr(-2); } -function getCurrentTime() { - var time = new Date(); - return ( - time.getHours() * 3600000 + - time.getMinutes() * 60000 + - time.getSeconds() * 1000 - ); -} - function showAlarm(alarm) { var msg = alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); var buzzCount = 10; @@ -54,7 +40,8 @@ function showAlarm(alarm) { } if (!alarm.rp) alarm.on = false; } - require("Storage").write("sched.json",JSON.stringify(alarms)); + // alarm is still a member of 'alarms', so writing to array writes changes back directly + require("sched").setAlarms(alarms); load(); }); function buzz() { @@ -72,15 +59,9 @@ function showAlarm(alarm) { } // Check for alarms -var day = (new Date()).getDate(); -var currentTime = getCurrentTime()+10000; // get current time - 10s in future to ensure we alarm if we've started the app a tad early -var alarms = require("Storage").readJSON("sched.json",1)||[]; -var active = alarms.filter(a=>a.on&&(a.ta.t-b.t); +var alarms = require("sched").getAlarms(); +var active = require("sched").getActiveAlarms(alarms); +if (active.length) // if there's an alarm, show it showAlarm(active[0]); -} else { - // otherwise just go back to default app +else // otherwise just go back to default app setTimeout(load, 100); -} From 530437750883703875475494cd28b5b2ff915fa0 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 4 Apr 2022 18:32:30 +0200 Subject: [PATCH 138/174] Updated to "sched" library. --- apps/bwclk/app.js | 8 ++++---- apps/lcars/lcars.app.js | 8 ++++---- apps/notanalog/notanalog.app.js | 8 ++++---- apps/smpltmr/app.js | 2 +- apps/smpltmr/metadata.json | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index c3e13ee73..d4e6c50ab 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -172,7 +172,7 @@ function getWeather(){ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -189,7 +189,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -197,7 +197,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -210,7 +210,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 353cc62dd..577955d2e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,7 +567,7 @@ function getWeather(){ */ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -584,7 +584,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -592,7 +592,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -605,7 +605,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index b7c81837d..c3dc9308f 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -394,7 +394,7 @@ function queueDraw() { */ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -411,7 +411,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -419,7 +419,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -432,7 +432,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index f7717a2fc..eb01e27d0 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const alarm = require("alarm"); +const alarm = require("sched"); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index feb841819..5a46ae546 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"alarm":"app"}, + "dependencies": {"sched":"app"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 4d0389ba5c8fe6ff6b96da2d878273588f6536e5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 4 Apr 2022 18:33:40 +0200 Subject: [PATCH 139/174] Updated readme --- apps/bwclk/README.md | 2 +- apps/lcars/README.md | 2 +- apps/notanalog/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 0262ec7f7..a5b66df71 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -7,7 +7,7 @@ - The design is adapted to the theme of your bangle. - Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. -- If the "alarm" app is installed tab top / bottom of the screen to set the timer. +- If the "sched" app is installed tab top / bottom of the screen to set the timer. ## Thanks to Icons created by Flaticon diff --git a/apps/lcars/README.md b/apps/lcars/README.md index f506f96c4..7024e8edf 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -4,7 +4,7 @@ A simple LCARS inspired clock. Note: To display the steps, the wpedom app is required. To show weather data such as temperature, humidity or window you BangleJS must be connected with Gadgetbride and the weather app must be installed. To use the timer -the "alarm" app must be installed on your device. +the "sched" app must be installed on your device. ## Control * Tap left / right to change between screens. diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index f4cf19ed6..e368f75d2 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -9,7 +9,7 @@ The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. ## Other Features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "alarm" is installed. +- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "sched" is installed. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. From 67facc692db64059d92bdc37b964396a267022e8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 5 Apr 2022 10:59:13 +0100 Subject: [PATCH 140/174] fix https://github.com/espruino/BangleApps/issues/1555#issuecomment-1087784581 --- apps/sched/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sched/lib.js b/apps/sched/lib.js index 4b645aede..e517413c3 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -29,8 +29,8 @@ exports.setAlarm = function(id, alarm) { var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); alarm.t = currentTime + alarm.timer; } + alarms.push(alarm); } - alarms.push(alarm); exports.setAlarms(alarms); }; /// Get time until the given alarm (object). Return undefined if alarm not enabled, or if 86400000 or more, alarm could me *more* than a day in the future From 10589f0dc896a533e127d934f6fd693d0bf133e1 Mon Sep 17 00:00:00 2001 From: marko Date: Tue, 5 Apr 2022 09:13:56 -0400 Subject: [PATCH 141/174] Correctly check word boundarie in dictionaries look ups; fix bug in index regeneration. --- apps/bee/ChangeLog | 2 ++ apps/bee/bee.app.js | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 apps/bee/ChangeLog diff --git a/apps/bee/ChangeLog b/apps/bee/ChangeLog new file mode 100644 index 000000000..df0907283 --- /dev/null +++ b/apps/bee/ChangeLog @@ -0,0 +1,2 @@ +0.01: New app! +0.02: Fix bug with regenerating index, fix bug in word lookups diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index a12ca7820..0059f5a08 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -31,8 +31,9 @@ function prepareLetterIdx () { function findWord (w) { "compile" var ci = w.charCodeAt(0)-97; - var f = letterIdx[ci].indexOf(w); - if (f>=0 && letterIdx[ci][f+w.length]=="\n") return true; + if (letterIdx[ci].substr(0, w.length)==w) return true; + var f = letterIdx[ci].indexOf("\n"+w+"\n"); + if (f>=0) return true; return false; } @@ -47,6 +48,7 @@ function checkWord (w) { if (foundWords.indexOf(w)>=0) return false; // already found if (findWord(w)) { foundWords.push(w); + foundWords.sort(); if (w.length==4) score++; else score += w.length; if (isPangram(w)) score += 7; From 4edfcc6d001cb3c8ede84a7cdc040e70cc31debf Mon Sep 17 00:00:00 2001 From: marko Date: Tue, 5 Apr 2022 10:18:42 -0400 Subject: [PATCH 142/174] Small most-likely branch optimization --- apps/bee/bee.app.js | 2 +- apps/bee/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index 0059f5a08..ef1582baa 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -31,9 +31,9 @@ function prepareLetterIdx () { function findWord (w) { "compile" var ci = w.charCodeAt(0)-97; - if (letterIdx[ci].substr(0, w.length)==w) return true; var f = letterIdx[ci].indexOf("\n"+w+"\n"); if (f>=0) return true; + if (letterIdx[ci].substr(0, w.length)==w) return true; return false; } diff --git a/apps/bee/metadata.json b/apps/bee/metadata.json index a89177d4e..a22e1800c 100644 --- a/apps/bee/metadata.json +++ b/apps/bee/metadata.json @@ -2,7 +2,7 @@ "name": "Bee", "shortName":"Bee", "icon": "app.png", - "version":"0.01", + "version":"0.02", "description": "Spelling bee", "supports" : ["BANGLEJS2"], "readme": "README.md", From 19a91003295c8bd5382b6843e12353a01daa88af Mon Sep 17 00:00:00 2001 From: Helge Berland <34238056+hberland@users.noreply.github.com> Date: Tue, 5 Apr 2022 22:10:17 +0200 Subject: [PATCH 143/174] Added norwegian locale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added norwegian locale to the list, and also listed our three special characters æ, ø and å in the fallback list. They are all in the codebook, but I'm unsure if they will be rendered correctly with the current code (the two last days of the weeks contains the ø). --- apps/locale/locales.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 073f4903f..282c808f3 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -39,11 +39,13 @@ these conversions */ const charFallbacks = { "ą":"a", "ā":"a", + "å":"a", "č":"c", "ć":"c", "ě":"e", "ę":"e", "ē":"e", + "æ":"e", "ģ":"g", "i":"ī", "ķ":"k", @@ -53,6 +55,7 @@ const charFallbacks = { "ņ":"n", "ő":"o", "ó":"o", + "ø":"o", "ř":"r", "ś":"s", "š":"s", @@ -681,6 +684,24 @@ var locales = { day: "Pirmdiena,Otrdiena,Trešdiena,Ceturtdiena,Piektdiena,Sestdiena,Svētdiena", trans: { yes: "jā", Yes: "Jā", no: "nē", No: "Nē", ok: "labi", on: "Ieslēgt", off: "Izslēgt", "< Back": "< Atpakaļ" } }, + "no_NB": { // Using charfallbacks + lang: "no_NB", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Ma,Ti,On,To,Fr,Lø,Sø", + day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } + }, /*, "he_IL": { // This won't work until we get a font - see https://github.com/espruino/BangleApps/issues/399 codePage : "ISO8859-8", From 333d4053424da271ec09edd5f64d0fc32c9c91b7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 09:13:35 +0100 Subject: [PATCH 144/174] sleep -> snooze, and add images for alarms/timers --- apps/sched/sched.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index a19c85717..4fdc82736 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -18,15 +18,22 @@ function formatTime(t) { } function showAlarm(alarm) { - var msg = alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); - var buzzCount = 10; - if (alarm.msg) + var msg = ""; + msg += alarm.timer ? formatTime(alarm.timer) : formatTime(alarm.t); + if (alarm.msg) { msg += "\n"+alarm.msg; + } else { + if (alarm.timer) + msg = atob("ACQswgD//33vRcGHIQAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAAAP/wAAAAAAAAAP/wAAAAAAAAAqqoAPAAAAAAqqqqoP8AAAAKqqqqqv/AAACqqqqqqq/wAAKqqqlWqqvwAAqqqqlVaqrAACqqqqlVVqqAAKqqqqlVVaqgAKqaqqlVVWqgAqpWqqlVVVqoAqlWqqlVVVaoCqlV6qlVVVaqCqVVfqlVVVWqCqVVf6lVVVWqKpVVX/lVVVVqqpVVV/+VVVVqqpVVV//lVVVqqpVVVfr1VVVqqpVVVfr1VVVqqpVVVb/lVVVqqpVVVW+VVVVqqpVVVVVVVVVqiqVVVVVVVVWqCqVVVVVVVVWqCqlVVVVVVVaqAqlVVVVVVVaoAqpVVVVVVVqoAKqVVVVVVWqgAKqlVVVVVaqgACqpVVVVVqqAAAqqlVVVaqoAAAKqqVVWqqgAAACqqqqqqqAAAAAKqqqqqgAAAAAAqqqqoAAAAAAAAqqoAAAAA==")+" "+msg; + else + msg = atob("AC0swgF97///RcEpMlVVVVVVf9VVVVVVVVX/9VVf9VVf/1VVV///1Vf9VX///VVX///VWqqlV///1Vf//9aqqqqpf//9V///2qqqqqqn///V///6qqqqqqr///X//+qqoAAKqqv//3//6qoAAAAKqr//3//qqAAAAAAqq//3/+qoAADwAAKqv/3/+qgAADwAACqv/3/aqAAADwAAAqp/19qoAAADwAAAKqfV1qgAAADwAAACqXVWqgAAADwAAACqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAAOsAAAAKpVaoAAAAOsAAAAKpVaoAAAAL/AAAAKpVaoAAAAgPwAAAKpVaoAAACAD8AAAKpVWqAAAIAA/AAAqlVWqAAAgAAPwAAqlVWqAACAAADwAAqlVWqgAIAAAAAACqlVVqgAgAAAAAACqVVVqoAAAAAAAAKqVVVaqAAAAAAAAqpVVVWqgAAAAAACqlVVVWqoAAAAAAKqlVVVVqqAAAAAAqqVVVVVaqoAAAAKqpVVVVVeqqoAAKqqtVVVVV/6qqqqqqr/VVVVX/2qqqqqqn/1VVVf/VaqqqqpV/9VVVf9VVWqqlVVf9VVVf1VVVVVVVVX9VQ==")+" "+msg; + } Bangle.loadWidgets(); Bangle.drawWidgets(); + var buzzCount = 10; E.showPrompt(msg,{ title:alarm.timer ? /*LANG*/"TIMER!" : /*LANG*/"ALARM!", - buttons : {/*LANG*/"Sleep":true,/*LANG*/"Ok":false} // default is sleep so it'll come back in 10 mins + buttons : {/*LANG*/"Snooze":true,/*LANG*/"Ok":false} // default is sleep so it'll come back in 10 mins }).then(function(sleep) { buzzCount = 0; if (sleep) { From b2b4f2e29dd4c7b70c90db2983bdc9f01024c61c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 11:30:20 +0100 Subject: [PATCH 145/174] tweaks for last PR to get the tests passing --- apps/MegaDenti/app-icon.js | 1 - apps/MegaDenti/brush-teeth.png | Bin 42215 -> 0 bytes apps/MegaDenti/metadata.json | 14 -------------- apps/{MegaDenti => megadenti}/ChangeLog | 0 apps/{MegaDenti => megadenti}/README.md | 0 apps/megadenti/app-icon.js | 1 + apps/{MegaDenti => megadenti}/app.js | 2 +- apps/megadenti/brush-teeth.png | Bin 0 -> 11582 bytes apps/megadenti/metadata.json | 15 +++++++++++++++ 9 files changed, 17 insertions(+), 16 deletions(-) delete mode 100644 apps/MegaDenti/app-icon.js delete mode 100644 apps/MegaDenti/brush-teeth.png delete mode 100644 apps/MegaDenti/metadata.json rename apps/{MegaDenti => megadenti}/ChangeLog (100%) rename apps/{MegaDenti => megadenti}/README.md (100%) create mode 100644 apps/megadenti/app-icon.js rename apps/{MegaDenti => megadenti}/app.js (99%) create mode 100644 apps/megadenti/brush-teeth.png create mode 100644 apps/megadenti/metadata.json diff --git a/apps/MegaDenti/app-icon.js b/apps/MegaDenti/app-icon.js deleted file mode 100644 index 0b121d700..000000000 --- a/apps/MegaDenti/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("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")) diff --git a/apps/MegaDenti/brush-teeth.png b/apps/MegaDenti/brush-teeth.png deleted file mode 100644 index e1c8e2baf15f33b5483693e0e97203505861fe84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42215 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 Mz+Aunj%&jI0i39MCjbBd diff --git a/apps/MegaDenti/metadata.json b/apps/MegaDenti/metadata.json deleted file mode 100644 index 5e820a097..000000000 --- a/apps/MegaDenti/metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "MegaDenti", - "name": "Denti", - "shortName":"My Denti", - "icon": "brush-teeth.png", - "version":"0.01", - "description": "This is a description of my awesome teeths app", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"MegaDenti.app.js","url":"app.js"}, - {"name":"brush-teeth.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/MegaDenti/ChangeLog b/apps/megadenti/ChangeLog similarity index 100% rename from apps/MegaDenti/ChangeLog rename to apps/megadenti/ChangeLog diff --git a/apps/MegaDenti/README.md b/apps/megadenti/README.md similarity index 100% rename from apps/MegaDenti/README.md rename to apps/megadenti/README.md diff --git a/apps/megadenti/app-icon.js b/apps/megadenti/app-icon.js new file mode 100644 index 000000000..0690cb9bd --- /dev/null +++ b/apps/megadenti/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4kA///A4M79/6823gvb70/qvLrXrrXdqmyzl2gvTzn0glS4ttuZh9iMQCykBvsRC6vUC6sdppIUgMb2Ol+IYBGaBGB6Oll1xGKMRpsfi/FrQXRjtHutai/uC6EBunRj9SrB5DPppeBj/njVV0IICu1xUpscqvBvgSCC5qlCuN1kqnCI5xGB69VwP1qJ2QUoMR4tcuOBA4LXOUoOKi/lq8RgMd64YMUoXCr8XFgMXs1p6JeM7cRjVS0PZtN5s2Z3oXKiKlBivHjl4swACu4XJgIWB6mxv0l0MZC4eZ3YXHKgPdolLuMR+tXC4lmzq/GQQNEonduILBDwOWC4lmBgLRG3vREQcBFwoABtfRC4kXaIKyFjAHBjtmy4EBvoXFjtBNA0X13u0N5j/O5+BEwhGBDwZICgPykUil0RwUikfqC4kR3YGCgOGwIuBCwIAB+NSkXh/3xIwlIiEBC4MbDgMaCoMl8U+AQNajXhIwcUIwIXBI4ceC4UcmVXJoMfC4nUVooABjhGC0LEBJAM+C4alBew5HCGAPu8QEBC4bsB2IXLAAk+0KlHXwoXLUop1BgK/CmQXG9ynCjtHIwUB3ZLDgJaCC4qJBLwJGDC4zvCAAbvBBoUReYZHCMAcTCYWvGgMu95CDRo7AFl8RiqmCCZSQGqKtCRwYAMgLqB4JYBmXuwIXP4UiRIXj9xyDCpTDBuUuYoWDRwYAKWIUVl4SCjXnC5I5DjORCQMxCQUf8JdNZITMEAggAvA=")) diff --git a/apps/MegaDenti/app.js b/apps/megadenti/app.js similarity index 99% rename from apps/MegaDenti/app.js rename to apps/megadenti/app.js index 556a35ac1..72d517935 100644 --- a/apps/MegaDenti/app.js +++ b/apps/megadenti/app.js @@ -68,7 +68,7 @@ function countDown() { return; } - g.clear(); + g.clear(1); g.setFontAlign(0,0); // center font g.setFont("Vector",80); // vector font, 80px // draw the current counter value diff --git a/apps/megadenti/brush-teeth.png b/apps/megadenti/brush-teeth.png new file mode 100644 index 0000000000000000000000000000000000000000..4903c2d5116d0d164ef3ff7692583c6b7f0fd84e GIT binary patch literal 11582 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 wcPW$Atf6}X` Date: Wed, 6 Apr 2022 11:45:14 +0100 Subject: [PATCH 146/174] docs --- apps/sched/README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/sched/README.md b/apps/sched/README.md index 03d93c688..54c61679c 100644 --- a/apps/sched/README.md +++ b/apps/sched/README.md @@ -19,6 +19,7 @@ Alarms are stored in an array in `sched.json`, and take the form: ``` { id : "mytimer", // optional ID for this alarm/timer, so apps can easily find *their* timers + appid : "myappid", // optional app ID for alarms that you set/use for your app on : true, // is the alarm enabled? t : 23400000, // Time of day since midnight in ms (if a timer, this is set automatically when timer starts) dow : 0b1111111, // Binary encoding for days of the week to run alarm on @@ -32,7 +33,7 @@ Alarms are stored in an array in `sched.json`, and take the form: date : "2022-04-04", // OPTIONAL date for the alarm, in YYYY-MM-DD format // eg (new Date()).toISOString().substr(0,10) - msg : "Eat food", // message to display + msg : "Eat food", // message to display. last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! rp : true, // repeat the alarm every day? vibrate : "...", // OPTIONAL pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) @@ -41,7 +42,7 @@ Alarms are stored in an array in `sched.json`, and take the form: timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'sched.js') // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) - data : { ... } // OPTIONAL - your app can store custom data in here if needed + data : { ... } // OPTIONAL - your app can store custom data in here if needed (don't store a lot of data here) } ``` @@ -73,10 +74,16 @@ require("sched").reload(); // loading the settings app. The alarm will not be removed/stopped // automatically. require("sched").setAlarm("customrunner", { + appid : "myapp", js : "load('setting.app.js')", timer : 1*60*1000, // 1 Minute }); + +// If you have been specifying `appid` you can also find any alarms that +// your app has created with the following: +require("sched").getAlarms().filter(a=>a.appid=="myapp"); ``` If your app requires alarms, you can specify that the alarms app needs to -be installed by adding `"dependencies": {"scheduler":"type"},` to your metadata. +be installed by adding `"dependencies": {"scheduler":"type"},` to your app's +metadata. From eb0d809a610945ac89efc30b8f942e6e51acfada Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:49:59 +0100 Subject: [PATCH 147/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 494e45124..e4fa71070 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -10,6 +10,18 @@ if (settings.language == 'System') { let fuzzy_string = fuzzy_strings[settings.language]; +let timeout = 2.5*60; +let drawTimeout; + +function queueDraw(seconds) { + let millisecs = seconds * 1000; + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, millisecs - (Date.now() % millisecs)); +} + const h = g.getHeight(); const w = g.getWidth(); let align_mode = 0; @@ -42,11 +54,11 @@ function draw() { g.clearRect(0, 24, w, h-24); g.setColor(g.theme.fg); g.drawString(g.wrapString(time_string, w).join("\n"), align_pos, h/2); + queueDraw(timeout); } g.clear(); draw(); -setInterval(draw, 10000); // refresh every 10s // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ From f0fce411b993d3416aa340d18ad4523666cfdb92 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:54:17 +0100 Subject: [PATCH 148/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index e4fa71070..37d497e20 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -62,11 +62,11 @@ draw(); // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; } }); From 575926b654bf6e1ed2ee68c1b9cf5c00dec06086 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 13:17:03 +0100 Subject: [PATCH 149/174] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 37d497e20..07b5c4068 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -35,7 +35,7 @@ if (settings.alignment =='Left') { } function getTimeString(date) { - let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let segment = Math.round((date.getMinutes()*60 + date.getSeconds() + 1)/300); let hour = date.getHours() + Math.floor(segment/12); f_string = fuzzy_string.minutes[segment % 12]; if (f_string.includes('$1')) { From fb3dc7fe71ad1c49e2c2eccf64d5e7d0d820183d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 13:23:55 +0100 Subject: [PATCH 150/174] Update fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 6b4b71419..8594ad554 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -91,7 +91,7 @@ ], "text_scale":3.5 }, - "no_NO":{ + "no_NB":{ "hours":[ "tolv", "ett", "to", "tre", "fire", "fem", "seks", "sju", "åtte", "ni", "ti", "elleve", From c48a951f2d1705f1b57e14a84dd85ae61a82548e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 14:55:07 +0100 Subject: [PATCH 151/174] 0.06: Add button for force compass calibration (#1660) --- apps/compass/ChangeLog | 1 + apps/compass/compass.js | 7 ++++++- apps/compass/metadata.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/compass/ChangeLog b/apps/compass/ChangeLog index 4bb7838ac..d1adafc4c 100644 --- a/apps/compass/ChangeLog +++ b/apps/compass/ChangeLog @@ -3,3 +3,4 @@ 0.03: Eliminate flickering 0.04: Fix for Bangle.js 2 and themes 0.05: Fix bearing not clearing correctly (visible in single or double digit bearings) +0.06: Add button for force compass calibration diff --git a/apps/compass/compass.js b/apps/compass/compass.js index 65ad83c4f..ee0d3d8ba 100644 --- a/apps/compass/compass.js +++ b/apps/compass/compass.js @@ -64,7 +64,12 @@ Bangle.on('mag', function(m) { oldHeading = m.heading; }); -g.clear(); +g.clear(1); +g.setFont("6x8").setFontAlign(0,0,3).drawString("RESET", g.getWidth()-5, g.getHeight()/2); +setWatch(function() { + Bangle.resetCompass(); +}, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); + Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.setCompassPower(1); diff --git a/apps/compass/metadata.json b/apps/compass/metadata.json index 318d90c86..e24ca4adc 100644 --- a/apps/compass/metadata.json +++ b/apps/compass/metadata.json @@ -1,7 +1,7 @@ { "id": "compass", "name": "Compass", - "version": "0.05", + "version": "0.06", "description": "Simple compass that points North", "icon": "compass.png", "screenshots": [{"url":"screenshot_compass.png"}], From 459fb273f195957e59abdc0519ec19f730268cc0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 15:09:41 +0100 Subject: [PATCH 152/174] Add altimeter app --- apps/altimeter/ChangeLog | 1 + apps/altimeter/app-icon.js | 1 + apps/altimeter/app.js | 34 ++++++++++++++++++++++++++++++++++ apps/altimeter/app.png | Bin 0 -> 1289 bytes apps/altimeter/metadata.json | 12 ++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 apps/altimeter/ChangeLog create mode 100644 apps/altimeter/app-icon.js create mode 100644 apps/altimeter/app.js create mode 100644 apps/altimeter/app.png create mode 100644 apps/altimeter/metadata.json diff --git a/apps/altimeter/ChangeLog b/apps/altimeter/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/altimeter/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/altimeter/app-icon.js b/apps/altimeter/app-icon.js new file mode 100644 index 000000000..1f8dfb637 --- /dev/null +++ b/apps/altimeter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///t9TmuV3+GJf4AN+ALVgf8BasP/4LVn//4ALUWgJUJBZUDBYJUIBZcP3/nKhEOt/WBZE5r+VKg0KgEVr9V3wLHqtaqt9sALElWAqoABt1QBZNeBYuq0ILCrVUBYulBYVWBYkCBYgABBZ8K1WVBYlABZegKQWqBQlVqALKqWoKQWpBYtWBZeqKRAAB1WABZZSHAANq0ALLKQ6qC1ALLKQ5UEAH4AG")) diff --git a/apps/altimeter/app.js b/apps/altimeter/app.js new file mode 100644 index 000000000..06c254a36 --- /dev/null +++ b/apps/altimeter/app.js @@ -0,0 +1,34 @@ +// place your const, vars, functions or classes here + +// clear the screen +g.clear(); + +var n = 0; + +// redraw the screen +function draw() { + g.reset().clearRect(Bangle.appRect); + g.setFont("6x8").setFontAlign(0,0).drawString("Up / Down",g.getWidth()/2,g.getHeight()/2 - 20); + g.setFont("Vector",60).setFontAlign(0,0).drawString(n,g.getWidth()/2,g.getHeight()/2 + 30); +} + +// Respond to user input +Bangle.setUI({mode: "updown"}, function(dir) { + if (dir<0) { + n--; + draw(); + } else if (dir>0) { + n++; + draw(); + } else { + n = 0; + draw(); + } +}); + +// First draw... +draw(); + +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/altimeter/app.png b/apps/altimeter/app.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9d6907762d253ba62b9d3f954c9252c002969b GIT binary patch literal 1289 zcmV+k1@`)hP)85fi3beW{$s+Y+K7*&r}Q6lfXBAc0bT`a@f6drsSP zUN5$G{XKBxbTg*U)j7}ieed%=@B5w8?-a-(ha7VFU!#6R`tkkI@VRWor)&iV0JAlG zfE4Zq04CaN-kEn^d)&XWp ztvJ&=dh2AR17?f#5HXD)wLr|wyUh>h59_6sl@1Wo$qcaxM73%7f3KxyFaY?#D(+C& zFb0N@K~XkDl%1z4){X0-r+Wt!*-)D?c>rJtvS4^yFFjp5V73Ie5et6-Fs(2(Y>?&h zQxyeMYt_`b141oUP96aAWTS9G4@KQN&|u}Q5jivkqWt8sz=91*SVUoIS&U=mkWrSm zpWMBEb}hQPbs#KDwIIr09PEL#n8`#wb9s^ zdu$M_$N+%(D?dSz!*S}ACoa3{)}p;?17}(~y3Vw8bS3jOU!O0T?YnTmGyZ$*)hT(L zkd_=^MTUE9Fg7>r_rYbk61%teT?7fnm(9QWHfPm9Q)_!AfI|QdH8ywdj~|=+qxY!a zHc^_q#ye?&_nH-vz;Xib7`hBu3IYIvi#AN0`^x07^naXH1BycLMX!nY!{~L@;kSyw z{A#*2-bo8wmVp#rmV$5$T>=1@ita+l=f=WsJylP>ZZ6iEJg^D_O|9*fMA#Qc?TL1Q z*9k`fq!kvI90)Ah(#CX-4j{C=1k;91*9k^Zo)S8uF?Rq^`N_Y5C!TutTO!;a&k69Y(?3=$G;r!?G0%OrP_fs)sJG2(X{bX03}+) z;^CPX28X10YLiJ6s%>84ajZAM=hy zgd>sFoOx6cblQ`tEi4zjq9sN~1DUGN%$S{9(4wIgCl1!sq@1TRA+3SN=Fa_@tM7yq z()65ZMQI^zco6`YnVMQUyPH}%yO}xd!80w{*xb>R&HyuGaCj7=B&A!XC#E-w&awyh z9(;y~&jJ7uo_p>2r@u>{n9>2Yy}#&k-HPM^V4G+C<`;;R`Y6H7ADP?QQl7gM18RGJ z#y+oankq1maGDu6KOjI46ia!BQ|86rs8!$TUV@{DycY z!GK!zZT2~xQ(PG{$(n=`nS*b{Q!xW-)pvP3@CSq0$Wax6U=XgPE)db1UwqScPxL-! zAXD`Lz;+Aweln)*bKtm7Q2>QulMwsc(g3Je-|g|>Z@)jgS*pMv2*Bg@C6Y|lpEY-t z0XGc%SF0bz^lZxWmuDck9ssDRwY`#=eonX0Yv%pZ&lb;UXJ3TJL4%PqDKsB z)t{M7Ic(iF%-B=@J|brRCQa1;Lk(xU|hM!ENZ00000NkvXXu0mjf&Ua!E literal 0 HcmV?d00001 diff --git a/apps/altimeter/metadata.json b/apps/altimeter/metadata.json new file mode 100644 index 000000000..137ceb8ba --- /dev/null +++ b/apps/altimeter/metadata.json @@ -0,0 +1,12 @@ +{ "id": "altimeter", + "name": "Altimeter", + "version":"0.01", + "description": "Simple altimeter that can display height changed using Bangle.js 2's built in pressure sensor.", + "icon": "app.png", + "tags": "tool,outdoors", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"altimeter.app.js","url":"app.js"}, + {"name":"altimeter.img","url":"app-icon.js","evaluate":true} + ] +} From cb6a393110535a565c77744800beea04d98ea357 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 15:44:46 +0100 Subject: [PATCH 153/174] alt 0.02: Actually upload correct code --- apps/altimeter/ChangeLog | 1 + apps/altimeter/app.js | 54 +++++++++++++++++------------------- apps/altimeter/metadata.json | 4 +-- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/apps/altimeter/ChangeLog b/apps/altimeter/ChangeLog index 5560f00bc..29388520e 100644 --- a/apps/altimeter/ChangeLog +++ b/apps/altimeter/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Actually upload correct code diff --git a/apps/altimeter/app.js b/apps/altimeter/app.js index 06c254a36..cac4e80fd 100644 --- a/apps/altimeter/app.js +++ b/apps/altimeter/app.js @@ -1,34 +1,30 @@ -// place your const, vars, functions or classes here +Bangle.setBarometerPower(true, "app"); -// clear the screen -g.clear(); +g.clear(1); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +var zero = 0; +var R = Bangle.appRect; +var y = R.y + R.h/2; +var MEDIANLENGTH = 20; +var avr = [], median; +var value = 0; -var n = 0; - -// redraw the screen -function draw() { - g.reset().clearRect(Bangle.appRect); - g.setFont("6x8").setFontAlign(0,0).drawString("Up / Down",g.getWidth()/2,g.getHeight()/2 - 20); - g.setFont("Vector",60).setFontAlign(0,0).drawString(n,g.getWidth()/2,g.getHeight()/2 + 30); -} - -// Respond to user input -Bangle.setUI({mode: "updown"}, function(dir) { - if (dir<0) { - n--; - draw(); - } else if (dir>0) { - n++; - draw(); - } else { - n = 0; - draw(); +Bangle.on('pressure', function(e) { + while (avr.length>MEDIANLENGTH) avr.pop(); + avr.unshift(e.altitude); + median = avr.slice().sort(); + g.reset().clearRect(0,y-30,g.getWidth()-10,y+30); + if (median.length>10) { + var mid = median.length>>1; + value = E.sum(median.slice(mid-4,mid+5)) / 9; + g.setFont("Vector",50).setFontAlign(0,0).drawString((value-zero).toFixed(1), g.getWidth()/2, y); } }); -// First draw... -draw(); - -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); +g.reset(); +g.setFont("6x8").setFontAlign(0,0).drawString(/*LANG*/"ALTITUDE (m)", g.getWidth()/2, y-40); +g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"ZERO", g.getWidth()-5, g.getHeight()/2); +setWatch(function() { + zero = value; +}, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); diff --git a/apps/altimeter/metadata.json b/apps/altimeter/metadata.json index 137ceb8ba..8bdbf3022 100644 --- a/apps/altimeter/metadata.json +++ b/apps/altimeter/metadata.json @@ -1,10 +1,10 @@ { "id": "altimeter", "name": "Altimeter", - "version":"0.01", + "version":"0.02", "description": "Simple altimeter that can display height changed using Bangle.js 2's built in pressure sensor.", "icon": "app.png", "tags": "tool,outdoors", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"altimeter.app.js","url":"app.js"}, {"name":"altimeter.img","url":"app-icon.js","evaluate":true} From 0b7fa0494d6862cba796a1f95882c1fe57bf4c24 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 6 Apr 2022 17:34:56 +0200 Subject: [PATCH 154/174] use type of sched instead of app --- apps/smpltmr/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 5a46ae546..5adf00921 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"sched":"app"}, + "dependencies": {"sched":"type"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From dfd5461fd9ff58ea722f77446fa0d87ba86a44d2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 16:37:26 +0100 Subject: [PATCH 155/174] https://github.com/espruino/BangleApps/pull/1661#issuecomment-1090413428 --- apps/smpltmr/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 5adf00921..06bad962d 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"sched":"type"}, + "dependencies": {"scheduler":"type"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 3c28c0c9c9a625e663bfbf324b3a58a4fb53eb12 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 19:45:27 +0100 Subject: [PATCH 156/174] readme --- apps/compass/README.md | 29 +++++++++++++++++++++++++++++ apps/compass/compass.js | 4 ++-- apps/compass/metadata.json | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 apps/compass/README.md diff --git a/apps/compass/README.md b/apps/compass/README.md new file mode 100644 index 000000000..d60192f73 --- /dev/null +++ b/apps/compass/README.md @@ -0,0 +1,29 @@ +# Compass + +This app uses Bangle.js's built-in magnetometer as a compass. + +## Usage + +Hold your Bangle.js **face up** (so the display is parallel to the ground), +and the red arrow will point north, with the heading in degrees printed at +the top of the screen. + +This compass app does not include tilt compensation - so much like a real +compass you should always keep it face up when taking a reading. + +The first time you run the compass after your Bangle has booted (or if +you move to an area with a substantially different magnetic field) you will +need to recalibrate your compass (even if a heading is shown). + +## Calibration + +Press the button next to the `RESET` label on the screen. The North/South marker +will disappear and a message will appear asking you to rotate the watch 360 degrees. + +* Hold the watch face up, so the display is parallel to the ground +* Rotate it around slowly, all 360 degrees (with the display still parallel to the ground) +* The `Uncalibrated` message will disappear before you have finished rotating the full 360 degrees - but you should still complete the full rotation in order for the compass to work properly. + +Once you've rotated the full 360 degrees your compass should now work fine, +and calibration is stored between runs of the app. However if you go near +to a strong magnet you may still need to recalibrate. diff --git a/apps/compass/compass.js b/apps/compass/compass.js index ee0d3d8ba..4730111ac 100644 --- a/apps/compass/compass.js +++ b/apps/compass/compass.js @@ -38,7 +38,7 @@ Bangle.on('mag', function(m) { if (!wasUncalibrated) { g.clearRect(0,24,W,48); g.setFontAlign(0,-1).setFont("6x8"); - g.drawString("Uncalibrated\nturn 360° around",M,24+4); + g.drawString(/*LANG*/"Uncalibrated\nturn 360° around",M,24+4); wasUncalibrated = true; } } else { @@ -65,7 +65,7 @@ Bangle.on('mag', function(m) { }); g.clear(1); -g.setFont("6x8").setFontAlign(0,0,3).drawString("RESET", g.getWidth()-5, g.getHeight()/2); +g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"RESET", g.getWidth()-5, g.getHeight()/2); setWatch(function() { Bangle.resetCompass(); }, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); diff --git a/apps/compass/metadata.json b/apps/compass/metadata.json index e24ca4adc..3e3b37f72 100644 --- a/apps/compass/metadata.json +++ b/apps/compass/metadata.json @@ -7,6 +7,7 @@ "screenshots": [{"url":"screenshot_compass.png"}], "tags": "tool,outdoors", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"compass.app.js","url":"compass.js"}, {"name":"compass.img","url":"compass-icon.js","evaluate":true} From a2002c48419b6b3b7c209b0e86fe6c75eed30373 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 6 Apr 2022 22:29:13 +0200 Subject: [PATCH 157/174] lightswitch: masking (espruino/Espruino#2151) + oversize Update ChangeLog and metadata.json Update README.md and settings.json - add oversize setting + description Update settings.js - add oversize setting Update widget.js - add oversize setting - add masking touch and drag input by adding own event listeners first and messing up the handler on a widget related event, using espruino/Espruino#2151 --- apps/lightswitch/ChangeLog | 1 + apps/lightswitch/README.md | 10 +++++++--- apps/lightswitch/metadata.json | 2 +- apps/lightswitch/settings.js | 16 +++++++++++++--- apps/lightswitch/settings.json | 8 ++++++-- apps/lightswitch/widget.js | 22 ++++++++++++++++------ 6 files changed, 44 insertions(+), 15 deletions(-) diff --git a/apps/lightswitch/ChangeLog b/apps/lightswitch/ChangeLog index 4210ccf03..2c6d2b5db 100644 --- a/apps/lightswitch/ChangeLog +++ b/apps/lightswitch/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Add the option to enable touching the widget only on clock and settings. 0.03: Settings page now uses built-in min/max/wrap (fix #1607) +0.04: Add masking widget input to other apps (using espruino/Espruino#2151), add a oversize option to increase the touch area. diff --git a/apps/lightswitch/README.md b/apps/lightswitch/README.md index d58de7ca4..67d070f5c 100644 --- a/apps/lightswitch/README.md +++ b/apps/lightswitch/README.md @@ -1,8 +1,11 @@ # Light Switch Widget -Whis this widget I wanted to create a solution to quickly en-/disable the LCD backlight and even change the brightness. +With this widget I wanted to create a solution to quickly en-/disable the LCD backlight and even change the brightness. In addition it shows the lock status with the option to personalize the lock icon with a tiny image. +All touch and drag inputs related to this widget are cached/masked to prevent actions in the active app. +(See [espruino/Espruino#2151](https://github.com/espruino/Espruino/issues/2151) for more information.) + --- ### Control --- @@ -39,6 +42,9 @@ In addition it shows the lock status with the option to personalize the lock ico * _clk+launch_ -> on all apps of the types _clock_ and _launch_ * _except apps_ -> on all apps of the types _clock_ and _launch_ and in the settings * _always on_ -> always enabled when the widget is displayed +* __Oversize__ + _0px_ / _1px_ / _..._ / __20px__ / _..._ / _50px_ + To make it easier to hit the widget, this value extends the touch area of the widget in all directions. * __Drag Delay__ _off_ / _50ms_ / _100ms_ / _..._ / __500ms__ / _..._ / _1000ms_ Change the maximum delay between first touch and re-touch/drag to change the brightness or disable changing the brightness completely. @@ -85,8 +91,6 @@ This images are stored in a seperate file _(lightswitch.images.json)_. ### Worth Mentioning --- #### To do list -* Catch the touch and draw input related to this widget to prevent actions in the active app. - _(For now I have no idea how to achieve this, help is appreciated)_ * Manage images for the lock icon through a _Customize and Upload App_ page. #### Requests, Bugs and Feedback diff --git a/apps/lightswitch/metadata.json b/apps/lightswitch/metadata.json index 9ac388eda..54dc8389f 100644 --- a/apps/lightswitch/metadata.json +++ b/apps/lightswitch/metadata.json @@ -2,7 +2,7 @@ "id": "lightswitch", "name": "Light Switch Widget", "shortName": "Light Switch", - "version": "0.03", + "version": "0.04", "description": "A fast way to switch LCD backlight on/off, change the brightness and show the lock status. All in one widget.", "icon": "images/app.png", "screenshots": [ diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index bebb16d15..a502324d9 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -7,6 +7,7 @@ colors: "011", image: "default", touchOn: "clock,launch", + oversize: 20, dragDelay: 500, minValue: 0.1, unlockSide: "", @@ -45,7 +46,7 @@ return { value: entry.value.indexOf(settings[key]), min : 0, - max : entry.value.length-1, + max : entry.value.length - 1, wrap : true, format: v => entry.title ? entry.title[v] : entry.value[v], onchange: function(v) { @@ -57,11 +58,11 @@ // return entry for numerical value return { value: settings[key] * entry.factor, - step: entry.step, - format: v => v > 0 ? v + entry.unit : "off", min : entry.min, max : entry.max, + step: entry.step, wrap : true, + format: v => v > 0 ? v + entry.unit : "off", onchange: function(v) { writeSetting(key, v / entry.factor, entry.drawWidgets); }, @@ -96,6 +97,14 @@ value: ["", "clock", "clock,setting.app.js", "clock,launch", "clock,setting.app.js,launch", "always"], drawWidgets: true }, + oversize: { + factor: 1, + unit: "px", + min: 0, + max: 50, + step: 1, + drawWidgets: true + }, dragDelay: { factor: 1, unit: "ms", @@ -142,6 +151,7 @@ "Image": getEntry("image"), "-- Control": 0, "Touch": getEntry("touchOn"), + "Oversize": getEntry("oversize"), "Drag Delay": getEntry("dragDelay"), "Min Value": getEntry("minValue"), "-- Unlock": 0, diff --git a/apps/lightswitch/settings.json b/apps/lightswitch/settings.json index 3d88e2282..176c3cea0 100644 --- a/apps/lightswitch/settings.json +++ b/apps/lightswitch/settings.json @@ -10,8 +10,8 @@ "101" -> magenta * image: string // - "default" -> - "random" -> + "default" -> image nearest to the default lock + "random" -> a random image from all available * touchOn: string // select when widget touch is active "" -> only on default clock @@ -19,6 +19,9 @@ "clock,launch" -> on all clocks and lanchers (default) "always" -> always + * oversize: int // extends the touch area of the widget in px in all directions + 0 to 50, 20 as default + * dragDelay: int // drag listener reset time in ms // time until a drag is needed to activate backlight changing mode 0 -> disabled @@ -59,6 +62,7 @@ "colors": "011", "image": "default", "touchOn": "clock,launch", + "oversize": 20, "dragDelay": 500, "minValue": 0.1, "unlockSide": "", diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index 119a114fe..53f86ee9a 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -4,6 +4,7 @@ colors: "011", image: "default", touchOn: "clock,launch", + oversize: 20, dragDelay: 500, minValue: 0.1, unlockSide: "", @@ -162,6 +163,11 @@ // change brigthness value, skip write to storage while still touching w.changeValue(value, event.b); + // masks this drag event by messing up the event handler + // see https://github.com/espruino/Espruino/issues/2151 + Bangle.removeListener("drag", w.dragListener); + Bangle["#ondrag"] = [w.dragListener].concat(Bangle["#ondrag"]); + // on touch release remove drag listener and reset drag status to indicate stopped drag action if (!event.b) { Bangle.removeListener("drag", w.dragListener); @@ -184,14 +190,14 @@ if (w.dragStatus === "off") { // check if inside widget area - if (!(!w || cursor.x < w.x || cursor.x > w.x + w.width || - cursor.y < w.y || cursor.y > w.y + 23)) { + if (!(!w || cursor.x < w.x - w.oversize || cursor.x > w.x + w.width + w.oversize || + cursor.y < w.y - w.oversize || cursor.y > w.y + 23 + w.oversize)) { // first touch feedback Bangle.buzz(25); // check if drag is disabled if (w.dragDelay) { - // add drag listener - Bangle.on("drag", w.dragListener); + // add drag listener at first position + Bangle["#ondrag"] = [w.dragListener].concat(Bangle["#ondrag"]); // set drag timeout w.dragStatus = setTimeout((w) => { // remove drag listener @@ -204,6 +210,10 @@ } // switch backlight w.changeValue(); + // masks this touch event by messing up the event handler + // see https://github.com/espruino/Espruino/issues/2151 + Bangle.removeListener("touch", w.touchListener); + Bangle["#ontouch"] = [w.touchListener].concat(Bangle["#ontouch"]); } } @@ -236,11 +246,11 @@ // add lock listener Bangle.on("lock", w.draw); - // add touch listener to control the light depending on settings + // add touch listener to control the light depending on settings at first position if (w.touchOn === "always" || !global.__FILE__ || w.touchOn.includes(__FILE__) || w.touchOn.includes(require("Storage").readJSON(__FILE__.replace("app.js", "info")).type)) - Bangle.on("touch", w.touchListener); + Bangle["#ontouch"] = [w.touchListener].concat(Bangle["#ontouch"]); // add tap listener to unlock and/or flash backlight if (w.unlockSide || w.tapSide) Bangle.on("tap", require("lightswitch.js").tapListener); From f7b2ece533a7368f340bbe47bb200c89af59d892 Mon Sep 17 00:00:00 2001 From: marko Date: Wed, 6 Apr 2022 17:30:12 -0400 Subject: [PATCH 158/174] Reword word lookup algorith to use bisection, get rid of index file. --- apps/bee/ChangeLog | 1 + apps/bee/README.md | 7 +- apps/bee/bee.app.js | 48 +- apps/bee/bee_lindex.json | 1 - apps/bee/bee_words_2of12 | 74578 ------------------------------------- apps/bee/metadata.json | 3 +- 6 files changed, 21 insertions(+), 74617 deletions(-) delete mode 100644 apps/bee/bee_lindex.json delete mode 100644 apps/bee/bee_words_2of12 diff --git a/apps/bee/ChangeLog b/apps/bee/ChangeLog index df0907283..cfb44c8e9 100644 --- a/apps/bee/ChangeLog +++ b/apps/bee/ChangeLog @@ -1,2 +1,3 @@ 0.01: New app! 0.02: Fix bug with regenerating index, fix bug in word lookups +0.03: Improve word search performance diff --git a/apps/bee/README.md b/apps/bee/README.md index c6461fb8e..3d0a4c14a 100644 --- a/apps/bee/README.md +++ b/apps/bee/README.md @@ -27,10 +27,7 @@ least once and yields an additional 7 points. Each game contains at least one pa The game uses an internal dictionary consisting of a newline separated list of English words ('bee.words', using the '2of12inf' word list). The dictionary is fairly large (~700kB of flash space) and thus requires appropriate space on the watch and will make installing the app somewhat slow. Because of its size it cannot be compressed (heatshrink needs to hold the compressed/uncompressed data in memory). -In order to make checking the validity of a guessed word faster an index file ('bee_lindex.json') is installed with -the app that facilitates faster word lookups. This index file is specific to the dictionary file used. If one were to -replace the dictionary file with a different version (e.g. a different language) the index file has to be regenerated. The easiest -way to do so is to delete (via the Web IDE or the fileman app on the watch) the file 'bee_lindex.json' - it will be regenerated (and saved, -i.e. it only happens once) on app startup automatically, a process that takes roughly 30 seconds. +This file can be replaced with a custom dictionary, an ASCII file containing a newline-separated (single "\n", not DOS-style "\r\n") alphabetically +sorted (sorting is important for the word lookup algorithm) list of words. ![Screenshot](./bee_screenshot.png) diff --git a/apps/bee/bee.app.js b/apps/bee/bee.app.js index ef1582baa..878e9763c 100644 --- a/apps/bee/bee.app.js +++ b/apps/bee/bee.app.js @@ -1,7 +1,7 @@ const S = require("Storage"); +const words = S.read("bee.words"); var letters = []; -var letterIdx = []; var centers = []; @@ -12,29 +12,17 @@ var score = 0; var intervalID = -1; -function prepareLetterIdx () { +function biSearch(w, ws, start, end, count) { "compile" - var li = [0]; - if (S.read("bee_lindex.json")!==undefined) li = S.readJSON("bee_lindex.json"); // check for cached index - else { - for (var i=1; i<26; ++i) { - var prefix = String.fromCharCode(97+i%26); - console.log(prefix); - li.push(S.read('bee.words').indexOf("\n"+prefix, li[i-1])+1); - } - li.push(S.read('bee.words').length); - S.writeJSON("bee_lindex.json", li); - } - for (var i=0; i<26; ++i) letterIdx[i] = S.read("bee.words", li[i], li[i+1]-li[i]); -} - -function findWord (w) { - "compile" - var ci = w.charCodeAt(0)-97; - var f = letterIdx[ci].indexOf("\n"+w+"\n"); - if (f>=0) return true; - if (letterIdx[ci].substr(0, w.length)==w) return true; - return false; + if (start>end-w.legnth || count--<=0) return ws.substr(start, end-start).indexOf("\n"+w+"\n"); + var mid = (end+start)>>1; + if (ws[mid-1]==="\n") --mid; + else while (midws[mid+i+1]) return biSearch(w, ws, mid+1, end, count); } function isPangram(w) { @@ -46,7 +34,7 @@ function isPangram(w) { function checkWord (w) { if (w.indexOf(String.fromCharCode(97+letters[0]))==-1) return false; // does it contain central letter? if (foundWords.indexOf(w)>=0) return false; // already found - if (findWord(w)) { + if (biSearch(w, words, 0, words.length, 20)>-1) { foundWords.push(w); foundWords.sort(); if (w.length==4) score++; @@ -93,13 +81,12 @@ function pickLetters() { var ltrs = ""; while (ltrs.length!==7) { ltrs = []; - var j = Math.floor(26*Math.random()); - var i = Math.floor((letterIdx[j].length-10)*Math.random()); - while (letterIdx[j][i]!="\n" && i Date: Wed, 6 Apr 2022 17:37:18 -0400 Subject: [PATCH 159/174] Restore accidentally deleted file. --- apps/bee/bee_words_2of12 | 74578 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74578 insertions(+) create mode 100644 apps/bee/bee_words_2of12 diff --git a/apps/bee/bee_words_2of12 b/apps/bee/bee_words_2of12 new file mode 100644 index 000000000..3bab44251 --- /dev/null +++ b/apps/bee/bee_words_2of12 @@ -0,0 +1,74578 @@ +aardvark +aardvarks +abaci +aback +abacus +abacuses +abaft +abalone +abalones +abandon +abandoned +abandoning +abandonment +abandons +abase +abased +abasement +abases +abash +abashed +abashedly +abashes +abashing +abashment +abasing +abate +abated +abatement +abates +abating +abattoir +abattoirs +abbe +abbes +abbess +abbesses +abbey +abbeys +abbot +abbots +abbreviate +abbreviated +abbreviates +abbreviating +abbreviation +abbreviations +abdicate +abdicated +abdicates +abdicating +abdication +abdications +abdomen +abdomens +abdominal +abdominals +abduct +abducted +abducting +abduction +abductions +abductor +abductors +abducts +abeam +abed +aberrant +aberration +aberrational +aberrations +abet +abets +abetted +abetter +abetters +abetting +abettor +abettors +abeyance +abhor +abhorred +abhorrence +abhorrent +abhorrently +abhorring +abhors +abidance +abide +abided +abides +abiding +abidingly +abilities +ability +abject +abjection +abjectly +abjectness +abjuration +abjurations +abjuratory +abjure +abjured +abjurer +abjurers +abjures +abjuring +ablate +ablated +ablates +ablating +ablation +ablations +ablative +ablatives +ablaze +able +abler +ablest +abloom +ablution +ablutions +ably +abnegate +abnegated +abnegates +abnegating +abnegation +abnormal +abnormalities +abnormality +abnormally +aboard +abode +abodes +abolish +abolished +abolishes +abolishing +abolition +abolitionism +abolitionist +abolitionists +abominable +abominably +abominate +abominated +abominates +abominating +abomination +abominations +aboriginal +aboriginals +aborigine +aborigines +aborning +abort +aborted +aborting +abortion +abortionist +abortionists +abortions +abortive +abortively +aborts +abound +abounded +abounding +abounds +about +above +aboveboard +abracadabra +abrade +abraded +abrades +abrading +abrasion +abrasions +abrasive +abrasively +abrasiveness +abrasives +abreast +abridge +abridged +abridgement +abridgements +abridges +abridging +abridgment +abridgments +abroad +abrogate +abrogated +abrogates +abrogating +abrogation +abrogations +abrogator +abrogators +abrupt +abrupter +abruptest +abruptly +abruptness +abscess +abscessed +abscesses +abscessing +abscissa +abscissae +abscissas +abscission +abscond +absconded +absconder +absconders +absconding +absconds +abseil +abseiled +abseiling +abseils +absence +absences +absent +absented +absentee +absenteeism +absentees +absenting +absently +absentminded +absentmindedly +absentmindedness +absents +absinth +absinthe +absolute +absolutely +absoluteness +absolutes +absolutest +absolution +absolutism +absolutist +absolutists +absolve +absolved +absolves +absolving +absorb +absorbed +absorbency +absorbent +absorbents +absorbing +absorbingly +absorbs +absorption +absorptive +abstain +abstained +abstainer +abstainers +abstaining +abstains +abstemious +abstemiously +abstemiousness +abstention +abstentions +abstinence +abstinent +abstract +abstracted +abstractedly +abstractedness +abstracting +abstraction +abstractions +abstractly +abstractness +abstracts +abstruse +abstrusely +abstruseness +absurd +absurder +absurdest +absurdities +absurdity +absurdly +absurdness +abundance +abundances +abundant +abundantly +abuse +abused +abuser +abusers +abuses +abusing +abusive +abusively +abusiveness +abut +abutment +abutments +abuts +abutted +abutting +abuzz +abysmal +abysmally +abyss +abyssal +abysses +acacia +acacias +academe +academia +academic +academically +academician +academicians +academics +academies +academy +acanthi +acanthus +acanthuses +accede +acceded +accedes +acceding +accelerate +accelerated +accelerates +accelerating +acceleration +accelerator +accelerators +accent +accented +accenting +accents +accentual +accentuate +accentuated +accentuates +accentuating +accentuation +accept +acceptability +acceptable +acceptableness +acceptably +acceptance +acceptances +acceptation +acceptations +accepted +accepting +accepts +access +accessed +accesses +accessibility +accessible +accessibly +accessing +accession +accessions +accessories +accessory +accident +accidental +accidentally +accidentals +accidents +acclaim +acclaimed +acclaiming +acclaims +acclamation +acclimate +acclimated +acclimates +acclimating +acclimation +acclimatization +acclimatize +acclimatized +acclimatizes +acclimatizing +acclivities +acclivity +accolade +accolades +accommodate +accommodated +accommodates +accommodating +accommodatingly +accommodation +accommodations +accompanied +accompanies +accompaniment +accompaniments +accompanist +accompanists +accompany +accompanying +accomplice +accomplices +accomplish +accomplished +accomplishes +accomplishing +accomplishment +accomplishments +accord +accordance +accordant +accorded +according +accordingly +accordion +accordionist +accordionists +accordions +accords +accost +accosted +accosting +accosts +account +accountability +accountable +accountancy +accountant +accountants +accounted +accounting +accounts +accouter +accoutered +accoutering +accouterments +accouters +accoutre +accoutred +accoutrements +accoutres +accoutring +accredit +accreditation +accredited +accrediting +accredits +accretion +accretions +accrual +accruals +accrue +accrued +accrues +accruing +acculturate +acculturated +acculturates +acculturating +acculturation +accumulate +accumulated +accumulates +accumulating +accumulation +accumulations +accumulative +accumulator +accumulators +accuracy +accurate +accurately +accurateness +accursed +accursedness +accurst +accusation +accusations +accusative +accusatives +accusatory +accuse +accused +accuser +accusers +accuses +accusing +accusingly +accustom +accustomed +accustoming +accustoms +aced +acerbate +acerbated +acerbates +acerbating +acerbic +acerbically +acerbity +aces +acetaminophen +acetate +acetates +acetic +acetone +acetonic +acetylene +ache +ached +achene +achenes +aches +achier +achiest +achievable +achieve +achieved +achievement +achievements +achiever +achievers +achieves +achieving +aching +achoo +achoos +achromatic +achy +acid +acidic +acidified +acidifies +acidify +acidifying +acidity +acidly +acidosis +acids +acidulous +acing +acknowledge +acknowledged +acknowledgement +acknowledgements +acknowledges +acknowledging +acknowledgment +acknowledgments +acme +acmes +acne +acolyte +acolytes +aconite +aconites +acorn +acorns +acoustic +acoustical +acoustically +acoustics +acquaint +acquaintance +acquaintances +acquaintanceship +acquainted +acquainting +acquaints +acquiesce +acquiesced +acquiescence +acquiescent +acquiescently +acquiesces +acquiescing +acquirable +acquire +acquired +acquirement +acquires +acquiring +acquisition +acquisitions +acquisitive +acquisitively +acquisitiveness +acquit +acquits +acquittal +acquittals +acquitted +acquitting +acre +acreage +acreages +acres +acrid +acrider +acridest +acridity +acridly +acridness +acrimonious +acrimoniously +acrimoniousness +acrimony +acrobat +acrobatic +acrobatically +acrobatics +acrobats +acronym +acronyms +acrophobia +acropolis +acropolises +across +acrostic +acrostics +acrylic +acrylics +acted +acting +actinium +action +actionable +actions +activate +activated +activates +activating +activation +activator +activators +active +actively +activeness +actives +activism +activist +activists +activities +activity +actor +actors +actress +actresses +acts +actual +actualities +actuality +actualization +actualize +actualized +actualizes +actualizing +actually +actuarial +actuaries +actuary +actuate +actuated +actuates +actuating +actuation +actuator +actuators +acuity +acumen +acupressure +acupuncture +acupuncturist +acupuncturists +acute +acutely +acuteness +acuter +acutes +acutest +acyclovir +adage +adages +adagio +adagios +adamant +adamantly +adapt +adaptability +adaptable +adaptation +adaptations +adapted +adapter +adapters +adapting +adaptive +adaptor +adaptors +adapts +addable +added +addend +addenda +addends +addendum +adder +adders +addible +addict +addicted +addicting +addiction +addictions +addictive +addicts +adding +addition +additional +additionally +additions +additive +additives +addle +addled +addles +addling +address +addressed +addressee +addressees +addresses +addressing +adds +adduce +adduced +adduces +adducing +adenine +adenoid +adenoidal +adenoids +adept +adeptly +adeptness +adepts +adequacy +adequate +adequately +adequateness +adhere +adhered +adherence +adherent +adherents +adheres +adhering +adhesion +adhesive +adhesiveness +adhesives +adieu +adieus +adieux +adios +adipose +adjacency +adjacent +adjacently +adjectival +adjectivally +adjective +adjectives +adjoin +adjoined +adjoining +adjoins +adjourn +adjourned +adjourning +adjournment +adjournments +adjourns +adjudge +adjudged +adjudges +adjudging +adjudicate +adjudicated +adjudicates +adjudicating +adjudication +adjudicative +adjudicator +adjudicators +adjudicatory +adjunct +adjuncts +adjuration +adjurations +adjure +adjured +adjures +adjuring +adjust +adjustable +adjusted +adjuster +adjusters +adjusting +adjustment +adjustments +adjustor +adjustors +adjusts +adjutant +adjutants +adman +admen +administer +administered +administering +administers +administrate +administrated +administrates +administrating +administration +administrations +administrative +administratively +administrator +administrators +admirable +admirably +admiral +admirals +admiralty +admiration +admire +admired +admirer +admirers +admires +admiring +admiringly +admissibility +admissible +admissibly +admission +admissions +admit +admits +admittance +admitted +admittedly +admitting +admix +admixed +admixes +admixing +admixture +admixtures +admonish +admonished +admonishes +admonishing +admonishment +admonishments +admonition +admonitions +admonitory +adobe +adobes +adolescence +adolescences +adolescent +adolescents +adopt +adoptable +adopted +adopter +adopters +adopting +adoption +adoptions +adoptive +adopts +adorable +adorableness +adorably +adoration +adore +adored +adorer +adorers +adores +adoring +adoringly +adorn +adorned +adorning +adornment +adornments +adorns +adrenal +adrenalin +adrenaline +adrenals +adrift +adroit +adroitly +adroitness +adsorb +adsorbed +adsorbent +adsorbents +adsorbing +adsorbs +adsorption +adsorptions +adulate +adulated +adulates +adulating +adulation +adulator +adulators +adulatory +adult +adulterant +adulterants +adulterate +adulterated +adulterates +adulterating +adulteration +adulterer +adulterers +adulteress +adulteresses +adulteries +adulterous +adultery +adulthood +adults +adumbrate +adumbrated +adumbrates +adumbrating +adumbration +advance +advanced +advancement +advancements +advances +advancing +advantage +advantaged +advantageous +advantageously +advantages +advantaging +advent +adventitious +adventitiously +advents +adventure +adventured +adventurer +adventurers +adventures +adventuresome +adventuress +adventuresses +adventuring +adventurous +adventurously +adventurousness +adverb +adverbial +adverbially +adverbials +adverbs +adversarial +adversaries +adversary +adverse +adversely +adverseness +adverser +adversest +adversities +adversity +advert +adverted +adverting +advertise +advertised +advertisement +advertisements +advertiser +advertisers +advertises +advertising +advertize +advertized +advertizement +advertizements +advertizes +advertizing +advertorial +advertorials +adverts +advice +advisability +advisable +advisably +advise +advised +advisedly +advisement +adviser +advisers +advises +advising +advisor +advisories +advisors +advisory +advocacy +advocate +advocated +advocates +advocating +adze +adzes +aegis +aeon +aeons +aerate +aerated +aerates +aerating +aeration +aerator +aerators +aerial +aerialist +aerialists +aerially +aerials +aerie +aeries +aerobatic +aerobatics +aerobic +aerobically +aerobics +aerodrome +aerodromes +aerodynamic +aerodynamically +aerodynamics +aeronautic +aeronautical +aeronautics +aeroplane +aeroplanes +aerosol +aerosols +aerospace +aery +aesthete +aesthetes +aesthetic +aesthetically +aestheticism +aesthetics +afar +affability +affable +affably +affair +affairs +affect +affectation +affectations +affected +affectedly +affecting +affectingly +affection +affectionate +affectionately +affections +affects +afferent +affiance +affianced +affiances +affiancing +affidavit +affidavits +affiliate +affiliated +affiliates +affiliating +affiliation +affiliations +affinities +affinity +affirm +affirmation +affirmations +affirmative +affirmatively +affirmatives +affirmed +affirming +affirms +affix +affixed +affixes +affixing +afflatus +afflict +afflicted +afflicting +affliction +afflictions +afflicts +affluence +affluent +affluently +afford +affordable +afforded +affording +affords +afforest +afforestation +afforested +afforesting +afforests +affray +affrays +affront +affronted +affronting +affronts +afghan +afghans +aficionado +aficionados +afield +afire +aflame +afloat +aflutter +afoot +aforementioned +aforesaid +aforethought +afoul +afraid +afresh +after +afterbirth +afterbirths +afterburner +afterburners +aftercare +aftereffect +aftereffects +afterglow +afterglows +afterimage +afterimages +afterlife +afterlives +aftermarket +aftermarkets +aftermath +aftermaths +afternoon +afternoons +aftershave +aftershaves +aftershock +aftershocks +aftertaste +aftertastes +afterthought +afterthoughts +afterward +afterwards +afterword +afterwords +again +against +agape +agar +agate +agates +agave +aged +ageing +ageism +ageist +ageists +ageless +agelessly +agelessness +agencies +agency +agenda +agendas +agent +agents +ageratum +ageratums +ages +agglomerate +agglomerated +agglomerates +agglomerating +agglomeration +agglomerations +agglutinate +agglutinated +agglutinates +agglutinating +agglutination +agglutinations +aggrandize +aggrandized +aggrandizement +aggrandizes +aggrandizing +aggravate +aggravated +aggravates +aggravating +aggravatingly +aggravation +aggravations +aggregate +aggregated +aggregates +aggregating +aggregation +aggregations +aggression +aggressive +aggressively +aggressiveness +aggressor +aggressors +aggrieve +aggrieved +aggrieves +aggrieving +aghast +agile +agilely +agility +aging +agitate +agitated +agitates +agitating +agitation +agitations +agitator +agitators +agitprop +agleam +aglitter +aglow +agnostic +agnosticism +agnostics +agog +agonies +agonize +agonized +agonizes +agonizing +agonizingly +agony +agoraphobia +agoraphobic +agoraphobics +agrarian +agrarianism +agrarians +agree +agreeable +agreeableness +agreeably +agreed +agreeing +agreement +agreements +agrees +agribusiness +agribusinesses +agricultural +agriculturalist +agriculturalists +agriculturally +agriculture +agriculturist +agriculturists +agronomic +agronomics +agronomist +agronomists +agronomy +aground +ague +ahead +ahem +ahoy +aide +aided +aides +aiding +aids +aigrette +aigrettes +ailed +aileron +ailerons +ailing +ailment +ailments +ails +aimed +aiming +aimless +aimlessly +aimlessness +aims +airbag +airbags +airbase +airbases +airborne +airbrush +airbrushed +airbrushes +airbrushing +airbus +airbuses +airbusses +aircraft +airdrop +airdropped +airdropping +airdrops +aired +airfare +airfares +airfield +airfields +airflow +airfoil +airfoils +airfreight +airhead +airheads +airier +airiest +airily +airiness +airing +airings +airless +airlessness +airlift +airlifted +airlifting +airlifts +airline +airliner +airliners +airlines +airlock +airlocks +airmail +airmailed +airmailing +airmails +airman +airmen +airplane +airplanes +airplay +airport +airports +airs +airship +airships +airsick +airsickness +airspace +airstrike +airstrikes +airstrip +airstrips +airtight +airtime +airwaves +airway +airways +airworthier +airworthiest +airworthiness +airworthy +airy +aisle +aisles +aitch +aitches +ajar +akimbo +akin +alabaster +alack +alacrity +alarm +alarmed +alarming +alarmingly +alarmist +alarmists +alarms +alas +albacore +albacores +albatross +albatrosses +albeit +albinism +albino +albinos +albs +album +albumen +albumin +albuminous +albums +alchemist +alchemists +alchemy +alcohol +alcoholic +alcoholically +alcoholics +alcoholism +alcohols +alcove +alcoves +alder +alderman +aldermen +alders +alderwoman +alderwomen +aleatory +alehouse +alehouses +alembic +alembics +alert +alerted +alerting +alertly +alertness +alerts +ales +alewife +alewives +alfalfa +alfresco +alga +algae +algal +algebra +algebraic +algebraically +algorithm +algorithmic +algorithms +alias +aliased +aliases +aliasing +alibi +alibied +alibiing +alibis +alien +alienable +alienate +alienated +alienates +alienating +alienation +alienist +alienists +aliens +alight +alighted +alighting +alights +align +aligned +aligner +aligners +aligning +alignment +alignments +aligns +alike +aliment +alimentary +alimented +alimenting +aliments +alimony +aline +alined +alinement +alinements +alines +alining +alit +alive +aliveness +aliyah +aliyahs +alkali +alkalies +alkaline +alkalinity +alkalis +alkalize +alkalized +alkalizes +alkalizing +alkaloid +alkaloids +alkyd +alkyds +allay +allayed +allaying +allays +allegation +allegations +allege +alleged +allegedly +alleges +allegiance +allegiances +alleging +allegoric +allegorical +allegorically +allegories +allegorist +allegorists +allegory +allegretto +allegrettos +allegro +allegros +allele +alleles +alleluia +alleluias +allergen +allergenic +allergens +allergic +allergically +allergies +allergist +allergists +allergy +alleviate +alleviated +alleviates +alleviating +alleviation +alley +alleys +alleyway +alleyways +alliance +alliances +allied +allies +alligator +alligators +alliterate +alliterated +alliterates +alliterating +alliteration +alliterations +alliterative +alliteratively +allocate +allocated +allocates +allocating +allocation +allocations +allot +allotment +allotments +allots +allotted +allotting +allover +allow +allowable +allowably +allowance +allowances +allowed +allowing +allows +alloy +alloyed +alloying +alloys +allspice +allude +alluded +alludes +alluding +allure +allured +allurement +allurements +allures +alluring +alluringly +allusion +allusions +allusive +allusively +allusiveness +alluvia +alluvial +alluvium +alluviums +ally +allying +almanac +almanacs +almighty +almond +almonds +almoner +almoners +almost +alms +almshouse +almshouses +aloe +aloes +aloft +aloha +alohas +alone +along +alongshore +alongside +aloof +aloofly +aloofness +aloud +alpaca +alpacas +alpha +alphabet +alphabetic +alphabetical +alphabetically +alphabetization +alphabetizations +alphabetize +alphabetized +alphabetizer +alphabetizers +alphabetizes +alphabetizing +alphabets +alphanumeric +alphanumerical +alphanumerically +alphas +alpine +alps +already +alright +also +altar +altarpiece +altarpieces +altars +alter +alterable +alteration +alterations +altercation +altercations +altered +altering +alternate +alternated +alternately +alternates +alternating +alternation +alternations +alternative +alternatively +alternatives +alternator +alternators +alters +altho +although +altimeter +altimeters +altitude +altitudes +alto +altogether +altos +altruism +altruist +altruistic +altruistically +altruists +alum +alumina +aluminium +aluminum +alumna +alumnae +alumni +alumnus +alums +always +amalgam +amalgamate +amalgamated +amalgamates +amalgamating +amalgamation +amalgamations +amalgams +amanuenses +amanuensis +amaranth +amaranths +amaretto +amaryllis +amaryllises +amass +amassed +amasses +amassing +amateur +amateurish +amateurishly +amateurishness +amateurism +amateurs +amatory +amaze +amazed +amazement +amazes +amazing +amazingly +amazon +amazonian +amazons +ambassador +ambassadorial +ambassadors +ambassadorship +ambassadorships +ambassadress +ambassadresses +amber +ambergris +ambiance +ambiances +ambidexterity +ambidextrous +ambidextrously +ambience +ambiences +ambient +ambiguities +ambiguity +ambiguous +ambiguously +ambition +ambitions +ambitious +ambitiously +ambitiousness +ambivalence +ambivalent +ambivalently +amble +ambled +ambler +amblers +ambles +ambling +ambrosia +ambrosial +ambulance +ambulances +ambulant +ambulate +ambulated +ambulates +ambulating +ambulation +ambulations +ambulatories +ambulatory +ambuscade +ambuscaded +ambuscades +ambuscading +ambush +ambushed +ambushes +ambushing +ameba +amebae +amebas +amebic +ameboid +ameliorate +ameliorated +ameliorates +ameliorating +amelioration +ameliorative +amen +amenability +amenable +amenably +amend +amendable +amended +amending +amendment +amendments +amends +amenities +amenity +amerce +amerced +amercement +amercements +amerces +amercing +americium +amethyst +amethysts +amiability +amiable +amiably +amicability +amicable +amicably +amid +amide +amides +amidship +amidships +amidst +amigo +amigos +amir +amirs +amiss +amity +ammeter +ammeters +ammo +ammonia +ammunition +amnesia +amnesiac +amnesiacs +amnesic +amnesics +amnestied +amnesties +amnesty +amnestying +amnia +amniocenteses +amniocentesis +amnion +amnions +amniotic +amoeba +amoebae +amoebas +amoebic +amok +among +amongst +amontillado +amontillados +amoral +amorality +amorally +amorous +amorously +amorousness +amorphous +amorphously +amorphousness +amortization +amortizations +amortize +amortized +amortizes +amortizing +amount +amounted +amounting +amounts +amour +amours +amperage +ampere +amperes +ampersand +ampersands +amphetamine +amphetamines +amphibian +amphibians +amphibious +amphibiously +amphitheater +amphitheaters +amphitheatre +amphitheatres +amphora +amphorae +amphoras +ample +ampler +amplest +amplification +amplifications +amplified +amplifier +amplifiers +amplifies +amplify +amplifying +amplitude +amplitudes +amply +ampoule +ampoules +amps +ampul +ampule +ampules +ampuls +amputate +amputated +amputates +amputating +amputation +amputations +amputee +amputees +amuck +amulet +amulets +amuse +amused +amusement +amusements +amuses +amusing +amusingly +amylase +anabolism +anachronism +anachronisms +anachronistic +anachronistically +anaconda +anacondas +anaemia +anaemic +anaerobe +anaerobes +anaerobic +anaerobically +anaesthesia +anaesthetic +anaesthetics +anaesthetist +anaesthetists +anaesthetize +anaesthetized +anaesthetizes +anaesthetizing +anagram +anagrams +anal +analgesia +analgesic +analgesics +anally +analog +analogical +analogically +analogies +analogize +analogized +analogizes +analogizing +analogous +analogously +analogousness +analogs +analogue +analogues +analogy +analysand +analysands +analyse +analysed +analyses +analysing +analysis +analyst +analysts +analytic +analytical +analytically +analyzable +analyze +analyzed +analyzer +analyzers +analyzes +analyzing +anapaest +anapaests +anapest +anapestic +anapestics +anapests +anarchic +anarchically +anarchism +anarchist +anarchistic +anarchists +anarchy +anathema +anathemas +anathematize +anathematized +anathematizes +anathematizing +anatomic +anatomical +anatomically +anatomies +anatomist +anatomists +anatomize +anatomized +anatomizes +anatomizing +anatomy +ancestor +ancestors +ancestral +ancestrally +ancestress +ancestresses +ancestries +ancestry +anchor +anchorage +anchorages +anchored +anchoring +anchorite +anchorites +anchorman +anchormen +anchorperson +anchorpersons +anchors +anchorwoman +anchorwomen +anchovies +anchovy +ancient +ancienter +ancientest +anciently +ancientness +ancients +ancillaries +ancillary +andante +andantes +andiron +andirons +androgen +androgenic +androgynous +androgyny +android +androids +anecdota +anecdotal +anecdote +anecdotes +anemia +anemic +anemically +anemometer +anemometers +anemone +anemones +anent +anesthesia +anesthesiologist +anesthesiologists +anesthesiology +anesthetic +anesthetics +anesthetist +anesthetists +anesthetization +anesthetize +anesthetized +anesthetizes +anesthetizing +aneurism +aneurisms +aneurysm +aneurysms +anew +angel +angelfish +angelfishes +angelic +angelica +angelical +angelically +angels +anger +angered +angering +angers +angina +angioplasties +angioplasty +angiosperm +angiosperms +angle +angled +angler +anglers +angles +angleworm +angleworms +anglicize +anglicized +anglicizes +anglicizing +angling +angora +angoras +angrier +angriest +angrily +angry +angst +angstrom +angstroms +anguish +anguished +anguishes +anguishing +angular +angularities +angularity +anhydrous +aniline +animadversion +animadversions +animadvert +animadverted +animadverting +animadverts +animal +animalcule +animalcules +animals +animate +animated +animatedly +animates +animating +animation +animations +animator +animators +animism +animist +animistic +animists +animosities +animosity +animus +anion +anionic +anions +anise +aniseed +anisette +ankh +ankhs +ankle +anklebone +anklebones +ankles +anklet +anklets +annalist +annalists +annals +anneal +annealed +annealing +anneals +annelid +annelids +annex +annexation +annexations +annexe +annexed +annexes +annexing +annihilate +annihilated +annihilates +annihilating +annihilation +annihilator +annihilators +anniversaries +anniversary +annotate +annotated +annotates +annotating +annotation +annotations +annotative +annotator +annotators +announce +announced +announcement +announcements +announcer +announcers +announces +announcing +annoy +annoyance +annoyances +annoyed +annoying +annoyingly +annoys +annual +annually +annuals +annuitant +annuitants +annuities +annuity +annul +annular +annulled +annulling +annulment +annulments +annuls +annunciation +annunciations +anode +anodes +anodize +anodized +anodizes +anodizing +anodyne +anodynes +anoint +anointed +anointing +anointment +anoints +anomalies +anomalous +anomalously +anomaly +anon +anonymity +anonymous +anonymously +anopheles +anorak +anoraks +anorectic +anorectics +anorexia +anorexic +anorexics +another +answer +answerable +answered +answering +answers +antacid +antacids +antagonism +antagonisms +antagonist +antagonistic +antagonistically +antagonists +antagonize +antagonized +antagonizes +antagonizing +antarctic +ante +anteater +anteaters +antebellum +antecedence +antecedent +antecedents +antechamber +antechambers +anted +antedate +antedated +antedates +antedating +antediluvian +anteed +anteing +antelope +antelopes +antenatal +antenna +antennae +antennas +anterior +anteroom +anterooms +antes +anthem +anthems +anther +anthers +anthill +anthills +anthologies +anthologist +anthologists +anthologize +anthologized +anthologizes +anthologizing +anthology +anthracite +anthrax +anthropocentric +anthropoid +anthropoids +anthropological +anthropologically +anthropologist +anthropologists +anthropology +anthropomorphic +anthropomorphically +anthropomorphism +anthropomorphous +anti +antiabortion +antiabortionist +antiabortionists +antiaircraft +antibacterial +antibacterials +antibiotic +antibiotics +antibodies +antibody +antic +anticancer +antichrist +antichrists +anticipate +anticipated +anticipates +anticipating +anticipation +anticipations +anticipatory +anticlerical +anticlimactic +anticlimactically +anticlimax +anticlimaxes +anticline +anticlines +anticlockwise +anticoagulant +anticoagulants +anticommunism +anticommunist +anticommunists +antics +anticyclone +anticyclones +anticyclonic +antidemocratic +antidepressant +antidepressants +antidote +antidotes +antifascist +antifascists +antifreeze +antigen +antigenic +antigenicity +antigens +antihero +antiheroes +antihistamine +antihistamines +antiknock +antilabor +antilogarithm +antilogarithms +antimacassar +antimacassars +antimalarial +antimalarials +antimatter +antimicrobial +antimissile +antimony +antinuclear +antioxidant +antioxidants +antiparticle +antiparticles +antipasti +antipasto +antipastos +antipathetic +antipathies +antipathy +antipersonnel +antiperspirant +antiperspirants +antiphon +antiphonal +antiphonally +antiphonals +antiphons +antipodal +antipodean +antipodeans +antipodes +antipollution +antipoverty +antiquarian +antiquarianism +antiquarians +antiquaries +antiquary +antiquate +antiquated +antiquates +antiquating +antique +antiqued +antiques +antiquing +antiquities +antiquity +antis +antisemitic +antisemitism +antisepsis +antiseptic +antiseptically +antiseptics +antisera +antiserum +antiserums +antislavery +antisocial +antisocially +antispasmodic +antispasmodics +antisubmarine +antitank +antitheses +antithesis +antithetic +antithetical +antithetically +antitoxin +antitoxins +antitrust +antivenin +antivenins +antiviral +antivirals +antivivisectionist +antivivisectionists +antiwar +antler +antlered +antlers +antonym +antonymous +antonyms +ants +antsier +antsiest +antsy +anus +anuses +anvil +anvils +anxieties +anxiety +anxious +anxiously +anxiousness +anybodies +anybody +anyhow +anymore +anyone +anyplace +anything +anytime +anyway +anywhere +anywise +aorta +aortae +aortas +aortic +apace +apart +apartheid +apartment +apartments +apathetic +apathetically +apathy +apatite +aped +apelike +aperitif +aperitifs +aperture +apertures +apes +apex +apexes +aphasia +aphasic +aphasics +aphelia +aphelion +aphelions +aphid +aphids +aphorism +aphorisms +aphoristic +aphoristically +aphrodisiac +aphrodisiacs +apiaries +apiarist +apiarists +apiary +apical +apically +apices +apiece +aping +apish +apishly +aplenty +aplomb +apocalypse +apocalypses +apocalyptic +apocrypha +apocryphal +apocryphally +apogee +apogees +apolitical +apolitically +apologetic +apologetically +apologia +apologias +apologies +apologist +apologists +apologize +apologized +apologizes +apologizing +apology +apoplectic +apoplexies +apoplexy +apostasies +apostasy +apostate +apostates +apostatize +apostatized +apostatizes +apostatizing +apostle +apostles +apostleship +apostolic +apostrophe +apostrophes +apothecaries +apothecary +apothegm +apothegms +apotheoses +apotheosis +appal +appall +appalled +appalling +appallingly +appalls +appaloosa +appaloosas +appals +apparatus +apparatuses +apparel +appareled +appareling +apparelled +apparelling +apparels +apparent +apparently +apparition +apparitions +appeal +appealed +appealing +appealingly +appeals +appear +appearance +appearances +appeared +appearing +appears +appease +appeased +appeasement +appeasements +appeaser +appeasers +appeases +appeasing +appellant +appellants +appellate +appellation +appellations +append +appendage +appendages +appendectomies +appendectomy +appended +appendices +appendicitis +appending +appendix +appendixes +appends +appertain +appertained +appertaining +appertains +appetite +appetites +appetizer +appetizers +appetizing +appetizingly +applaud +applauded +applauder +applauders +applauding +applauds +applause +apple +applejack +apples +applesauce +applet +applets +appliance +appliances +applicability +applicable +applicably +applicant +applicants +application +applications +applicator +applicators +applied +applier +appliers +applies +applique +appliqued +appliqueing +appliques +apply +applying +appoint +appointed +appointee +appointees +appointing +appointive +appointment +appointments +appoints +apportion +apportioned +apportioning +apportionment +apportions +appose +apposed +apposes +apposing +apposite +appositely +appositeness +apposition +appositive +appositives +appraisal +appraisals +appraise +appraised +appraiser +appraisers +appraises +appraising +appreciable +appreciably +appreciate +appreciated +appreciates +appreciating +appreciation +appreciations +appreciative +appreciatively +appreciator +appreciators +appreciatory +apprehend +apprehended +apprehending +apprehends +apprehension +apprehensions +apprehensive +apprehensively +apprehensiveness +apprentice +apprenticed +apprentices +apprenticeship +apprenticeships +apprenticing +apprise +apprised +apprises +apprising +apprize +apprized +apprizes +apprizing +approach +approachable +approached +approaches +approaching +approbation +approbations +appropriate +appropriated +appropriately +appropriateness +appropriates +appropriating +appropriation +appropriations +appropriator +appropriators +approval +approvals +approve +approved +approves +approving +approvingly +approximate +approximated +approximately +approximates +approximating +approximation +approximations +appurtenance +appurtenances +appurtenant +apricot +apricots +apron +aprons +apropos +apse +apses +apter +aptest +aptitude +aptitudes +aptly +aptness +aqua +aquaculture +aquae +aqualung +aqualungs +aquamarine +aquamarines +aquanaut +aquanauts +aquaplane +aquaplaned +aquaplanes +aquaplaning +aquaria +aquarium +aquariums +aquas +aquatic +aquatically +aquatics +aquavit +aqueduct +aqueducts +aqueous +aquiculture +aquifer +aquifers +aquiline +arabesque +arabesques +arability +arable +arachnid +arachnids +arbiter +arbiters +arbitrage +arbitraged +arbitrager +arbitragers +arbitrages +arbitrageur +arbitrageurs +arbitraging +arbitrament +arbitraments +arbitrarily +arbitrariness +arbitrary +arbitrate +arbitrated +arbitrates +arbitrating +arbitration +arbitrator +arbitrators +arbor +arboreal +arboreta +arboretum +arboretums +arbors +arborvitae +arborvitaes +arbour +arbours +arbutus +arbutuses +arcade +arcades +arcane +arced +arch +archaeological +archaeologically +archaeologist +archaeologists +archaeology +archaic +archaically +archaism +archaisms +archaist +archaists +archangel +archangels +archbishop +archbishopric +archbishoprics +archbishops +archdeacon +archdeacons +archdiocesan +archdiocese +archdioceses +archduchess +archduchesses +archduke +archdukes +arched +archenemies +archenemy +archeological +archeologist +archeologists +archeology +archer +archers +archery +arches +archest +archetypal +archetype +archetypes +archetypical +archfiend +archfiends +archiepiscopal +arching +archipelago +archipelagoes +archipelagos +architect +architectonic +architectonics +architects +architectural +architecturally +architecture +architectures +architrave +architraves +archival +archive +archived +archives +archiving +archivist +archivists +archly +archness +archway +archways +arcing +arcked +arcking +arcs +arctic +arctics +ardent +ardently +ardor +ardors +ardour +ardours +arduous +arduously +arduousness +area +areal +areas +arena +arenas +ares +argent +argon +argosies +argosy +argot +argots +arguable +arguably +argue +argued +arguer +arguers +argues +arguing +argument +argumentation +argumentative +argumentatively +argumentativeness +arguments +argyle +argyles +aria +arias +arid +aridity +aridly +aright +arise +arisen +arises +arising +aristocracies +aristocracy +aristocrat +aristocratic +aristocratically +aristocrats +arithmetic +arithmetical +arithmetically +arithmetician +arithmeticians +arks +armada +armadas +armadillo +armadillos +armament +armaments +armature +armatures +armband +armbands +armchair +armchairs +armed +armful +armfuls +armhole +armholes +armies +arming +armistice +armistices +armlet +armlets +armor +armored +armorer +armorers +armorial +armories +armoring +armors +armory +armour +armoured +armouries +armouring +armours +armoury +armpit +armpits +armrest +armrests +arms +armsful +army +aroma +aromas +aromatherapist +aromatherapists +aromatherapy +aromatic +aromatically +aromatics +arose +around +arousal +arouse +aroused +arouses +arousing +arpeggio +arpeggios +arraign +arraigned +arraigning +arraignment +arraignments +arraigns +arrange +arranged +arrangement +arrangements +arranger +arrangers +arranges +arranging +arrant +arras +arrases +array +arrayed +arraying +arrays +arrears +arrest +arrested +arresting +arrests +arrhythmia +arrhythmic +arrhythmical +arrival +arrivals +arrive +arrived +arrives +arriving +arrogance +arrogant +arrogantly +arrogate +arrogated +arrogates +arrogating +arrogation +arrow +arrowhead +arrowheads +arrowroot +arrows +arroyo +arroyos +arsenal +arsenals +arsenic +arson +arsonist +arsonists +artefact +artefacts +arterial +arteries +arteriole +arterioles +arteriosclerosis +artery +artful +artfully +artfulness +arthritic +arthritics +arthritis +arthropod +arthropods +arthroscope +arthroscopes +arthroscopic +artichoke +artichokes +article +articles +articular +articulate +articulated +articulately +articulateness +articulates +articulating +articulation +articulations +artier +artiest +artifact +artifacts +artifice +artificer +artificers +artifices +artificial +artificiality +artificially +artillery +artilleryman +artillerymen +artiness +artisan +artisans +artist +artiste +artistes +artistic +artistically +artistry +artists +artless +artlessly +artlessness +arts +artsier +artsiest +artsy +artwork +artworks +arty +arum +arums +asbestos +ascend +ascendance +ascendancy +ascendant +ascendants +ascended +ascendency +ascendent +ascendents +ascending +ascends +ascension +ascensions +ascent +ascents +ascertain +ascertainable +ascertained +ascertaining +ascertainment +ascertains +ascetic +ascetically +asceticism +ascetics +ascot +ascots +ascribable +ascribe +ascribed +ascribes +ascribing +ascription +aseptic +aseptically +asexual +asexuality +asexually +ashamed +ashamedly +ashcan +ashcans +ashen +ashes +ashier +ashiest +ashlar +ashlars +ashore +ashram +ashrams +ashtray +ashtrays +ashy +aside +asides +asinine +asininely +asininities +asininity +askance +asked +askew +asking +asks +aslant +asleep +asocial +asparagus +aspartame +aspect +aspects +aspen +aspens +asperities +asperity +aspersion +aspersions +asphalt +asphalted +asphalting +asphalts +asphodel +asphodels +asphyxia +asphyxiate +asphyxiated +asphyxiates +asphyxiating +asphyxiation +asphyxiations +aspic +aspics +aspidistra +aspidistras +aspirant +aspirants +aspirate +aspirated +aspirates +aspirating +aspiration +aspirations +aspirator +aspirators +aspire +aspired +aspires +aspirin +aspiring +aspirins +asps +assail +assailable +assailant +assailants +assailed +assailing +assails +assassin +assassinate +assassinated +assassinates +assassinating +assassination +assassinations +assassins +assault +assaulted +assaulting +assaults +assay +assayed +assayer +assayers +assaying +assays +assemblage +assemblages +assemble +assembled +assembler +assemblers +assembles +assemblies +assembling +assembly +assemblyman +assemblymen +assemblywoman +assemblywomen +assent +assented +assenting +assents +assert +asserted +asserting +assertion +assertions +assertive +assertively +assertiveness +asserts +asses +assess +assessed +assesses +assessing +assessment +assessments +assessor +assessors +asset +assets +asseverate +asseverated +asseverates +asseverating +asseveration +asshole +assholes +assiduity +assiduous +assiduously +assiduousness +assign +assignable +assignation +assignations +assigned +assigner +assigners +assigning +assignment +assignments +assignor +assignors +assigns +assimilate +assimilated +assimilates +assimilating +assimilation +assist +assistance +assistant +assistants +assisted +assisting +assists +assize +assizes +associate +associated +associates +associating +association +associations +associative +assonance +assonant +assonants +assort +assorted +assorting +assortment +assortments +assorts +assuage +assuaged +assuages +assuaging +assumable +assume +assumed +assumes +assuming +assumption +assumptions +assumptive +assurance +assurances +assure +assured +assuredly +assureds +assures +assuring +astatine +aster +asterisk +asterisked +asterisking +asterisks +astern +asteroid +asteroids +asters +asthma +asthmatic +asthmatics +astigmatic +astigmatism +astigmatisms +astir +astonish +astonished +astonishes +astonishing +astonishingly +astonishment +astound +astounded +astounding +astoundingly +astounds +astraddle +astrakhan +astral +astray +astride +astringency +astringent +astringently +astringents +astrolabe +astrolabes +astrologer +astrologers +astrological +astrologically +astrologist +astrologists +astrology +astronaut +astronautic +astronautical +astronautics +astronauts +astronomer +astronomers +astronomic +astronomical +astronomically +astronomy +astrophysical +astrophysicist +astrophysicists +astrophysics +astute +astutely +astuteness +astuter +astutest +asunder +asylum +asylums +asymmetric +asymmetrical +asymmetrically +asymmetry +asymptomatic +atavism +atavist +atavistic +atavists +ataxia +ataxic +ataxics +atelier +ateliers +atheism +atheist +atheistic +atheists +atherosclerosis +athirst +athlete +athletes +athletic +athletically +athletics +athwart +atilt +atlas +atlases +atmosphere +atmospheres +atmospheric +atmospherically +atmospherics +atoll +atolls +atom +atomic +atomically +atomize +atomized +atomizer +atomizers +atomizes +atomizing +atoms +atonal +atonality +atonally +atone +atoned +atonement +atones +atoning +atop +atria +atrial +atrium +atriums +atrocious +atrociously +atrociousness +atrocities +atrocity +atrophied +atrophies +atrophy +atrophying +atropine +attach +attachable +attache +attached +attaches +attaching +attachment +attachments +attack +attacked +attacker +attackers +attacking +attacks +attain +attainability +attainable +attainder +attained +attaining +attainment +attainments +attains +attar +attempt +attempted +attempting +attempts +attend +attendance +attendances +attendant +attendants +attended +attendee +attendees +attending +attends +attention +attentions +attentive +attentively +attentiveness +attenuate +attenuated +attenuates +attenuating +attenuation +attest +attestation +attestations +attested +attesting +attests +attic +attics +attire +attired +attires +attiring +attitude +attitudes +attitudinal +attitudinize +attitudinized +attitudinizes +attitudinizing +attorney +attorneys +attract +attractable +attractant +attractants +attracted +attracting +attraction +attractions +attractive +attractively +attractiveness +attracts +attributable +attribute +attributed +attributes +attributing +attribution +attributions +attributive +attributively +attributives +attrition +attune +attuned +attunes +attuning +atwitter +atypical +atypically +auburn +auction +auctioned +auctioneer +auctioneers +auctioning +auctions +audacious +audaciously +audaciousness +audacity +audibility +audible +audibles +audibly +audience +audiences +audio +audiobook +audiobooks +audiological +audiologist +audiologists +audiology +audiometer +audiometers +audiophile +audiophiles +audios +audiotape +audiotapes +audiovisual +audiovisuals +audit +audited +auditing +audition +auditioned +auditioning +auditions +auditor +auditoria +auditorium +auditoriums +auditors +auditory +audits +auger +augers +aught +aughts +augment +augmentation +augmentations +augmentative +augmented +augmenter +augmenters +augmenting +augments +augur +augured +auguries +auguring +augurs +augury +august +auguster +augustest +augustly +augustness +auks +aunt +auntie +aunties +aunts +aunty +aura +aurae +aural +aurally +auras +aureola +aureolas +aureole +aureoles +auricle +auricles +auricular +aurora +aurorae +auroras +auscultate +auscultated +auscultates +auscultating +auscultation +auscultations +auspice +auspices +auspicious +auspiciously +auspiciousness +austere +austerely +austerer +austerest +austerities +austerity +austral +authentic +authentically +authenticate +authenticated +authenticates +authenticating +authentication +authentications +authenticity +author +authored +authoress +authoresses +authoring +authoritarian +authoritarianism +authoritarians +authoritative +authoritatively +authoritativeness +authorities +authority +authorization +authorizations +authorize +authorized +authorizes +authorizing +authors +authorship +autism +autistic +auto +autobahn +autobahns +autobiographer +autobiographers +autobiographic +autobiographical +autobiographically +autobiographies +autobiography +autoclave +autoclaves +autocracies +autocracy +autocrat +autocratic +autocratically +autocrats +autodidact +autodidacts +autograph +autographed +autographing +autographs +autoimmune +autoimmunity +automaker +automakers +automata +automate +automated +automates +automatic +automatically +automatics +automating +automation +automatism +automatize +automatized +automatizes +automatizing +automaton +automatons +automobile +automobiles +automotive +autonomic +autonomous +autonomously +autonomy +autopilot +autopilots +autopsied +autopsies +autopsy +autopsying +autos +autoworker +autoworkers +autumn +autumnal +autumns +auxiliaries +auxiliary +auxin +avail +availability +available +availed +availing +avails +avalanche +avalanches +avarice +avaricious +avariciously +avast +avatar +avatars +avaunt +avenge +avenged +avenger +avengers +avenges +avenging +avenue +avenues +aver +average +averaged +averages +averaging +averred +averring +avers +averse +aversion +aversions +avert +averted +averting +averts +avian +aviaries +aviary +aviation +aviator +aviators +aviatrices +aviatrix +aviatrixes +avid +avidity +avidly +avionic +avionics +avitaminosis +avocado +avocadoes +avocados +avocation +avocational +avocations +avoid +avoidable +avoidably +avoidance +avoided +avoiding +avoids +avoirdupois +avouch +avouched +avouches +avouching +avow +avowal +avowals +avowed +avowedly +avowing +avows +avuncular +await +awaited +awaiting +awaits +awake +awaked +awaken +awakened +awakening +awakenings +awakens +awakes +awaking +award +awarded +awarding +awards +aware +awareness +awash +away +awed +aweigh +awes +awesome +awesomely +awesomeness +awestricken +awestruck +awful +awfuller +awfullest +awfully +awfulness +awhile +awing +awkward +awkwarder +awkwardest +awkwardly +awkwardness +awls +awning +awnings +awns +awoke +awoken +awol +awry +axed +axes +axial +axially +axing +axiom +axiomatic +axiomatically +axioms +axis +axle +axles +axletree +axletrees +axolotl +axolotls +axon +axons +ayah +ayahs +ayatollah +ayatollahs +ayes +azalea +azaleas +azimuth +azimuths +azure +baaed +baaing +baas +babble +babbled +babbler +babblers +babbles +babbling +babe +babel +babels +babes +babied +babier +babies +babiest +baboon +baboons +babushka +babushkas +baby +babyhood +babying +babyish +babysat +babysit +babysits +babysitter +babysitters +babysitting +baccalaureate +baccalaureates +baccarat +bacchanal +bacchanalia +bacchanalian +bacchanalians +bacchanalias +bacchanals +bachelor +bachelorhood +bachelors +bacillary +bacilli +bacillus +back +backache +backaches +backbencher +backbenchers +backbit +backbite +backbiter +backbiters +backbites +backbiting +backbitten +backboard +backboards +backbone +backbones +backbreaking +backdate +backdated +backdates +backdating +backdrop +backdrops +backed +backer +backers +backfield +backfields +backfire +backfired +backfires +backfiring +backgammon +background +backgrounder +backgrounders +backgrounds +backhand +backhanded +backhandedly +backhander +backhanders +backhanding +backhands +backhoe +backhoes +backing +backings +backlash +backlashes +backless +backlog +backlogged +backlogging +backlogs +backpack +backpacked +backpacker +backpackers +backpacking +backpacks +backpedal +backpedaled +backpedaling +backpedalled +backpedalling +backpedals +backrest +backrests +backroom +backs +backscratching +backseat +backseats +backside +backsides +backslapper +backslappers +backslapping +backslash +backslashes +backslid +backslidden +backslide +backslider +backsliders +backslides +backsliding +backspace +backspaced +backspaces +backspacing +backspin +backstabber +backstabbers +backstage +backstair +backstairs +backstop +backstopped +backstopping +backstops +backstretch +backstretches +backstroke +backstroked +backstrokes +backstroking +backtalk +backtrack +backtracked +backtracking +backtracks +backup +backups +backward +backwardly +backwardness +backwards +backwash +backwater +backwaters +backwoods +backwoodsman +backwoodsmen +backyard +backyards +bacon +bacteria +bacterial +bactericidal +bactericide +bactericides +bacteriologic +bacteriological +bacteriologist +bacteriologists +bacteriology +bacterium +badder +baddest +baddie +baddies +baddy +bade +badge +badger +badgered +badgering +badgers +badges +badinage +badlands +badly +badman +badmen +badminton +badmouth +badmouthed +badmouthing +badmouths +badness +baffle +baffled +bafflement +baffler +bafflers +baffles +baffling +bagatelle +bagatelles +bagel +bagels +bagful +bagfuls +baggage +bagged +baggie +baggier +baggies +baggiest +baggily +bagginess +bagging +baggy +bagpipe +bagpiper +bagpipers +bagpipes +bags +bagsful +baguette +baguettes +baht +bahts +bail +bailable +bailed +bailiff +bailiffs +bailing +bailiwick +bailiwicks +bailout +bailouts +bails +bailsman +bailsmen +bairn +bairns +bait +baited +baiting +baits +baize +bake +baked +baker +bakeries +bakers +bakery +bakes +bakeshop +bakeshops +baking +baklava +baksheesh +balaclava +balaclavas +balalaika +balalaikas +balance +balanced +balances +balancing +balboa +balboas +balconies +balcony +bald +balded +balder +balderdash +baldest +baldfaced +balding +baldly +baldness +baldric +baldrics +balds +bale +baled +baleen +baleful +balefully +balefulness +baler +balers +bales +baling +balk +balked +balkier +balkiest +balking +balks +balky +ball +ballad +balladeer +balladeers +balladry +ballads +ballast +ballasted +ballasting +ballasts +ballcock +ballcocks +balled +ballerina +ballerinas +ballet +balletic +ballets +ballgame +ballgames +balling +ballistic +ballistics +balloon +ballooned +ballooning +balloonist +balloonists +balloons +ballot +balloted +balloting +ballots +ballpark +ballparks +ballplayer +ballplayers +ballpoint +ballpoints +ballroom +ballrooms +balls +ballsier +ballsiest +ballsy +ballyhoo +ballyhooed +ballyhooing +ballyhoos +balm +balmier +balmiest +balminess +balms +balmy +baloney +balsa +balsam +balsamic +balsams +balsas +baluster +balusters +balustrade +balustrades +bamboo +bamboos +bamboozle +bamboozled +bamboozles +bamboozling +banal +banalities +banality +banally +banana +bananas +band +bandage +bandaged +bandages +bandaging +bandana +bandanas +bandanna +bandannas +bandbox +bandboxes +bandeau +bandeaux +banded +bandied +bandier +bandies +bandiest +banding +bandit +banditry +bandits +banditti +bandmaster +bandmasters +bandoleer +bandoleers +bandolier +bandoliers +bands +bandsman +bandsmen +bandstand +bandstands +bandwagon +bandwagons +bandy +bandying +bane +baneful +banes +bang +banged +banging +bangle +bangles +bangs +bani +banish +banished +banishes +banishing +banishment +banister +banisters +banjo +banjoes +banjoist +banjoists +banjos +bank +bankable +bankbook +bankbooks +bankcard +bankcards +banked +banker +bankers +banking +banknote +banknotes +bankroll +bankrolled +bankrolling +bankrolls +bankrupt +bankruptcies +bankruptcy +bankrupted +bankrupting +bankrupts +banks +banned +banner +banners +banning +bannister +bannisters +bannock +bannocks +banns +banquet +banqueted +banqueter +banqueters +banqueting +banquets +banquette +banquettes +bans +banshee +banshees +banshie +banshies +bantam +bantams +bantamweight +bantamweights +banter +bantered +bantering +banteringly +banters +banyan +banyans +banzai +banzais +baobab +baobabs +baptism +baptismal +baptisms +baptisteries +baptistery +baptistries +baptistry +baptize +baptized +baptizer +baptizers +baptizes +baptizing +barb +barbarian +barbarianism +barbarianisms +barbarians +barbaric +barbarically +barbarism +barbarisms +barbarities +barbarity +barbarize +barbarized +barbarizes +barbarizing +barbarous +barbarously +barbecue +barbecued +barbecues +barbecuing +barbed +barbel +barbell +barbells +barbels +barbeque +barbequed +barbeques +barbequing +barber +barbered +barbering +barberries +barberry +barbers +barbershop +barbershops +barbing +barbiturate +barbiturates +barbs +barbwire +barcarole +barcaroles +barcarolle +barcarolles +bard +bardic +bards +bare +bareback +barebacked +bared +barefaced +barefacedly +barefoot +barefooted +barehanded +bareheaded +barelegged +barely +bareness +barer +bares +barest +barf +barfed +barfing +barflies +barfly +barfs +bargain +bargained +bargainer +bargainers +bargaining +bargains +barge +barged +bargeman +bargemen +barges +barging +barhop +barhopped +barhopping +barhops +baring +baritone +baritones +barium +bark +barked +barkeep +barkeeper +barkeepers +barkeeps +barker +barkers +barking +barks +barley +barmaid +barmaids +barman +barmen +barn +barnacle +barnacled +barnacles +barns +barnstorm +barnstormed +barnstormer +barnstormers +barnstorming +barnstorms +barnyard +barnyards +barometer +barometers +barometric +barometrically +baron +baronage +baronages +baroness +baronesses +baronet +baronetcies +baronetcy +baronets +baronial +baronies +barons +barony +baroque +barque +barques +barrack +barracked +barracking +barracks +barracuda +barracudas +barrage +barraged +barrages +barraging +barre +barred +barrel +barreled +barreling +barrelled +barrelling +barrels +barren +barrener +barrenest +barrenness +barrens +barres +barrette +barrettes +barricade +barricaded +barricades +barricading +barrier +barriers +barring +barrio +barrios +barrister +barristers +barroom +barrooms +barrow +barrows +bars +bartender +bartenders +barter +bartered +barterer +barterers +bartering +barters +baryon +baryons +basal +basally +basalt +basaltic +base +baseball +baseballs +baseboard +baseboards +based +baseless +baseline +baselines +basely +baseman +basemen +basement +basements +baseness +baser +bases +basest +bash +bashed +bashes +bashful +bashfully +bashfulness +bashing +basic +basically +basics +basil +basilica +basilicas +basilisk +basilisks +basin +basinful +basinfuls +basing +basins +basis +bask +basked +basket +basketball +basketballs +basketry +baskets +basketwork +basking +basks +bass +basses +basset +bassets +bassi +bassinet +bassinets +bassist +bassists +basso +bassoon +bassoonist +bassoonists +bassoons +bassos +basswood +basswoods +bast +bastard +bastardization +bastardizations +bastardize +bastardized +bastardizes +bastardizing +bastards +bastardy +baste +basted +baster +basters +bastes +basting +bastion +bastions +batch +batched +batches +batching +bate +bated +bates +bath +bathe +bathed +bather +bathers +bathes +bathetic +bathhouse +bathhouses +bathing +bathmat +bathmats +bathos +bathrobe +bathrobes +bathroom +bathrooms +baths +bathtub +bathtubs +bathyscaph +bathyscaphe +bathyscaphes +bathyscaphs +bathysphere +bathyspheres +batik +batiks +bating +batiste +batman +batmen +baton +batons +bats +batsman +batsmen +battalion +battalions +batted +batten +battened +battening +battens +batter +battered +batterer +batterers +batteries +battering +batters +battery +battier +battiest +batting +battle +battleax +battleaxe +battleaxes +battled +battledore +battledores +battlefield +battlefields +battlefront +battlefronts +battleground +battlegrounds +battlement +battlements +battler +battlers +battles +battleship +battleships +battling +batty +bauble +baubles +baud +bauds +baulk +baulked +baulking +baulks +bauxite +bawd +bawdier +bawdiest +bawdily +bawdiness +bawds +bawdy +bawl +bawled +bawling +bawls +bayberries +bayberry +bayed +baying +bayonet +bayoneted +bayoneting +bayonets +bayonetted +bayonetting +bayou +bayous +bays +bazaar +bazaars +bazooka +bazookas +beach +beachcomber +beachcombers +beached +beaches +beachhead +beachheads +beaching +beachwear +beacon +beacons +bead +beaded +beadier +beadiest +beading +beadle +beadles +beads +beady +beagle +beagles +beak +beaked +beaker +beakers +beaks +beam +beamed +beaming +beams +bean +beanbag +beanbags +beaned +beanie +beanies +beaning +beanpole +beanpoles +beans +beanstalk +beanstalks +bear +bearable +bearably +beard +bearded +bearding +beardless +beards +bearer +bearers +bearing +bearings +bearish +bearishly +bearishness +bearlike +bears +bearskin +bearskins +beast +beastlier +beastliest +beastliness +beastly +beasts +beat +beatable +beaten +beater +beaters +beatific +beatifically +beatification +beatifications +beatified +beatifies +beatify +beatifying +beating +beatings +beatitude +beatitudes +beatnik +beatniks +beats +beau +beaus +beaut +beauteous +beauteously +beautician +beauticians +beauties +beautification +beautified +beautifier +beautifiers +beautifies +beautiful +beautifully +beautify +beautifying +beauts +beauty +beaux +beaver +beavered +beavering +beavers +bebop +becalm +becalmed +becalming +becalms +became +because +beck +beckon +beckoned +beckoning +beckons +becks +becloud +beclouded +beclouding +beclouds +become +becomes +becoming +becomingly +bedaub +bedaubed +bedaubing +bedaubs +bedazzle +bedazzled +bedazzlement +bedazzles +bedazzling +bedbug +bedbugs +bedclothes +bedded +bedding +bedeck +bedecked +bedecking +bedecks +bedevil +bedeviled +bedeviling +bedevilled +bedevilling +bedevilment +bedevils +bedfellow +bedfellows +bedim +bedimmed +bedimming +bedims +bedizen +bedizened +bedizening +bedizens +bedlam +bedlams +bedpan +bedpans +bedpost +bedposts +bedraggle +bedraggled +bedraggles +bedraggling +bedridden +bedrock +bedrocks +bedroll +bedrolls +bedroom +bedrooms +beds +bedside +bedsides +bedsore +bedsores +bedspread +bedspreads +bedstead +bedsteads +bedtime +bedtimes +beebread +beech +beeches +beechnut +beechnuts +beef +beefburger +beefburgers +beefcake +beefcakes +beefed +beefier +beefiest +beefiness +beefing +beefs +beefsteak +beefsteaks +beefy +beehive +beehives +beekeeper +beekeepers +beekeeping +beeline +beelines +been +beep +beeped +beeper +beepers +beeping +beeps +beer +beerier +beeriest +beers +beery +bees +beeswax +beet +beetle +beetled +beetles +beetling +beets +beeves +befall +befallen +befalling +befalls +befell +befit +befits +befitted +befitting +befittingly +befog +befogged +befogging +befogs +before +beforehand +befoul +befouled +befouling +befouls +befriend +befriended +befriending +befriends +befuddle +befuddled +befuddlement +befuddles +befuddling +began +begat +beget +begets +begetting +beggar +beggared +beggaring +beggarly +beggars +beggary +begged +begging +begin +beginner +beginners +beginning +beginnings +begins +begone +begonia +begonias +begot +begotten +begrime +begrimed +begrimes +begriming +begrudge +begrudged +begrudges +begrudging +begrudgingly +begs +beguile +beguiled +beguilement +beguiler +beguilers +beguiles +beguiling +beguilingly +beguine +beguines +begum +begums +begun +behalf +behalves +behave +behaved +behaves +behaving +behavior +behavioral +behaviorally +behaviorism +behaviorist +behaviorists +behaviour +behead +beheaded +beheading +beheads +beheld +behemoth +behemoths +behest +behests +behind +behindhand +behinds +behold +beholden +beholder +beholders +beholding +beholds +behoove +behooved +behooves +behooving +beige +being +beings +bejewel +bejeweled +bejeweling +bejewelled +bejewelling +bejewels +belabor +belabored +belaboring +belabors +belabour +belaboured +belabouring +belabours +belated +belatedly +belay +belayed +belaying +belays +belch +belched +belches +belching +beleaguer +beleaguered +beleaguering +beleaguers +belfries +belfry +belie +belied +belief +beliefs +belies +believable +believably +believe +believed +believer +believers +believes +believing +belittle +belittled +belittlement +belittles +belittling +bell +belladonna +bellboy +bellboys +belle +belled +belles +belletrist +belletristic +belletrists +bellhop +bellhops +bellicose +bellicosity +bellied +bellies +belligerence +belligerency +belligerent +belligerently +belligerents +belling +bellman +bellmen +bellow +bellowed +bellowing +bellows +bells +bellwether +bellwethers +belly +bellyache +bellyached +bellyaches +bellyaching +bellybutton +bellybuttons +bellyful +bellyfuls +bellying +belong +belonged +belonging +belongings +belongs +beloved +beloveds +below +belt +belted +belting +belts +beltway +beltways +beluga +belugas +belying +bemire +bemired +bemires +bemiring +bemoan +bemoaned +bemoaning +bemoans +bemuse +bemused +bemusedly +bemusement +bemuses +bemusing +bench +benched +benches +benching +benchmark +benchmarks +bend +bendable +bender +benders +bending +bends +beneath +benediction +benedictions +benedictory +benefaction +benefactions +benefactor +benefactors +benefactress +benefactresses +benefice +beneficence +beneficent +beneficently +benefices +beneficial +beneficially +beneficiaries +beneficiary +benefit +benefited +benefiting +benefits +benefitted +benefitting +benevolence +benevolences +benevolent +benevolently +benighted +benightedly +benign +benignant +benigner +benignest +benignity +benignly +bent +bents +bentwood +benumb +benumbed +benumbing +benumbs +benzene +benzine +bequeath +bequeathed +bequeathing +bequeaths +bequest +bequests +berate +berated +berates +berating +bereave +bereaved +bereavement +bereavements +bereaves +bereaving +bereft +beret +berets +berg +bergs +beriberi +berkelium +berm +berms +berried +berries +berry +berrying +berrylike +berserk +berth +berthed +berthing +berths +beryl +beryllium +beryls +beseech +beseeched +beseecher +beseechers +beseeches +beseeching +beseechingly +beseem +beseemed +beseeming +beseems +beset +besets +besetting +beside +besides +besiege +besieged +besieger +besiegers +besieges +besieging +besmear +besmeared +besmearing +besmears +besmirch +besmirched +besmirches +besmirching +besom +besoms +besot +besots +besotted +besotting +besought +bespangle +bespangled +bespangles +bespangling +bespatter +bespattered +bespattering +bespatters +bespeak +bespeaking +bespeaks +bespectacled +bespoke +bespoken +best +bested +bestial +bestiality +bestially +bestiaries +bestiary +besting +bestir +bestirred +bestirring +bestirs +bestow +bestowal +bestowals +bestowed +bestowing +bestows +bestrew +bestrewed +bestrewing +bestrewn +bestrews +bestrid +bestridden +bestride +bestrides +bestriding +bestrode +bests +bestseller +bestsellers +beta +betake +betaken +betakes +betaking +betas +betcha +betel +bethink +bethinking +bethinks +bethought +betide +betided +betides +betiding +betimes +betoken +betokened +betokening +betokens +betook +betray +betrayal +betrayals +betrayed +betrayer +betrayers +betraying +betrays +betroth +betrothal +betrothals +betrothed +betrothing +betroths +bets +betted +better +bettered +bettering +betterment +betters +betting +bettor +bettors +between +betwixt +bevel +beveled +beveling +bevelled +bevelling +bevels +beverage +beverages +bevies +bevy +bewail +bewailed +bewailing +bewails +beware +bewared +bewares +bewaring +bewhiskered +bewigged +bewilder +bewildered +bewildering +bewilderingly +bewilderment +bewilders +bewitch +bewitched +bewitches +bewitching +bewitchingly +bewitchment +beyond +beys +bezel +bezels +biannual +biannually +bias +biased +biases +biasing +biassed +biassing +biathlon +biathlons +bible +bibles +biblical +bibliographer +bibliographers +bibliographic +bibliographical +bibliographically +bibliographies +bibliography +bibliophile +bibliophiles +bibs +bibulous +bicameral +bicameralism +bicarb +bicarbonate +bicarbonates +bicarbs +bicentenaries +bicentenary +bicentennial +bicentennials +bicep +biceps +bicepses +bicker +bickered +bickerer +bickerers +bickering +bickers +biconcave +biconvex +bicuspid +bicuspids +bicycle +bicycled +bicycler +bicyclers +bicycles +bicycling +bicyclist +bicyclists +biddable +bidden +bidder +bidders +biddies +bidding +biddy +bide +bided +bides +bidet +bidets +biding +bidirectional +bidirectionally +bids +biennia +biennial +biennially +biennials +biennium +bienniums +bier +biers +bifocal +bifocals +bifurcate +bifurcated +bifurcates +bifurcating +bifurcation +bifurcations +bigamist +bigamists +bigamous +bigamy +bigger +biggest +biggie +biggies +biggish +bighead +bigheads +bighearted +bigheartedness +bighorn +bighorns +bight +bights +bigmouth +bigmouths +bigness +bigot +bigoted +bigotries +bigotry +bigots +bigwig +bigwigs +bijou +bijoux +bike +biked +biker +bikers +bikes +biking +bikini +bikinis +bilabial +bilabials +bilateral +bilaterally +bile +bilge +bilges +bilingual +bilingualism +bilingually +bilinguals +bilious +biliousness +bilk +bilked +bilker +bilkers +bilking +bilks +bill +billable +billboard +billboards +billed +billet +billeted +billeting +billets +billfold +billfolds +billiard +billiards +billies +billing +billings +billingsgate +billion +billionaire +billionaires +billions +billionth +billionths +billow +billowed +billowing +billows +billowy +bills +billy +bimbo +bimboes +bimbos +bimetallic +bimetallics +bimetallism +bimonthlies +bimonthly +binaries +binary +bind +binder +binderies +binders +bindery +binding +bindings +binds +bindweed +binge +binged +bingeing +binges +binging +bingo +binnacle +binnacles +binned +binning +binocular +binoculars +binomial +binomials +bins +biochemical +biochemically +biochemicals +biochemist +biochemistry +biochemists +biodegradability +biodegradable +biodegrade +biodegraded +biodegrades +biodegrading +biodiversity +bioethics +biofeedback +biographer +biographers +biographic +biographical +biographically +biographies +biography +biologic +biological +biologically +biologist +biologists +biology +biomass +bionic +bionically +bionics +biophysical +biophysicist +biophysicists +biophysics +biopic +biopics +biopsied +biopsies +biopsy +biopsying +biorhythm +biorhythms +bios +biosphere +biospheres +biotechnological +biotechnology +biotin +bipartisan +bipartisanship +bipartite +biped +bipedal +bipeds +biplane +biplanes +bipolar +bipolarity +biracial +birch +birched +birches +birching +bird +birdbath +birdbaths +birdbrain +birdbrained +birdbrains +birded +birder +birders +birdhouse +birdhouses +birdie +birdied +birdieing +birdies +birding +birdlime +birds +birdseed +birdwatcher +birdwatchers +biretta +birettas +birth +birthday +birthdays +birthed +birthing +birthmark +birthmarks +birthplace +birthplaces +birthrate +birthrates +birthright +birthrights +births +birthstone +birthstones +biscuit +biscuits +bisect +bisected +bisecting +bisection +bisections +bisector +bisectors +bisects +bisexual +bisexuality +bisexually +bisexuals +bishop +bishopric +bishoprics +bishops +bismuth +bison +bisons +bisque +bistro +bistros +bitch +bitched +bitches +bitchier +bitchiest +bitchily +bitchiness +bitching +bitchy +bite +biter +biters +bites +biting +bitingly +bits +bitten +bitter +bitterer +bitterest +bitterly +bittern +bitterness +bitterns +bitters +bittersweet +bittersweets +bittier +bittiest +bitty +bitumen +bituminous +bivalent +bivalve +bivalves +bivouac +bivouacked +bivouacking +bivouacs +biweeklies +biweekly +biyearly +bizarre +bizarrely +blab +blabbed +blabber +blabbered +blabbering +blabbermouth +blabbermouths +blabbers +blabbing +blabs +black +blackamoor +blackamoors +blackball +blackballed +blackballing +blackballs +blackberries +blackberry +blackbird +blackbirds +blackboard +blackboards +blacked +blacken +blackened +blackening +blackens +blacker +blackest +blackguard +blackguards +blackhead +blackheads +blacking +blackish +blackjack +blackjacked +blackjacking +blackjacks +blacklist +blacklisted +blacklisting +blacklists +blackly +blackmail +blackmailed +blackmailer +blackmailers +blackmailing +blackmails +blackness +blackout +blackouts +blacks +blacksmith +blacksmiths +blacksnake +blacksnakes +blackthorn +blackthorns +blacktop +blacktopped +blacktopping +blacktops +bladder +bladders +blade +bladed +blades +blah +blahs +blamable +blame +blameable +blamed +blameless +blamelessly +blamelessness +blames +blameworthiness +blameworthy +blaming +blanch +blanched +blanches +blanching +blancmange +blancmanges +bland +blander +blandest +blandish +blandished +blandishes +blandishing +blandishment +blandishments +blandly +blandness +blank +blanked +blanker +blankest +blanket +blanketed +blanketing +blankets +blanking +blankly +blankness +blanks +blare +blared +blares +blaring +blarney +blarneyed +blarneying +blarneys +blase +blaspheme +blasphemed +blasphemer +blasphemers +blasphemes +blasphemies +blaspheming +blasphemous +blasphemously +blasphemy +blast +blasted +blaster +blasters +blasting +blastoff +blastoffs +blasts +blatancies +blatancy +blatant +blatantly +blather +blathered +blathering +blathers +blaze +blazed +blazer +blazers +blazes +blazing +blazon +blazoned +blazoning +blazons +bleach +bleached +bleacher +bleachers +bleaches +bleaching +bleak +bleaker +bleakest +bleakly +bleakness +blear +blearier +bleariest +blearily +bleariness +bleary +bleat +bleated +bleating +bleats +bled +bleed +bleeder +bleeders +bleeding +bleeds +bleep +bleeped +bleeper +bleepers +bleeping +bleeps +blemish +blemished +blemishes +blemishing +blench +blenched +blenches +blenching +blend +blended +blender +blenders +blending +blends +blent +bless +blessed +blessedly +blessedness +blesses +blessing +blessings +blest +blew +blight +blighted +blighting +blights +blimey +blimp +blimps +blind +blinded +blinder +blinders +blindest +blindfold +blindfolded +blindfolding +blindfolds +blinding +blindingly +blindly +blindness +blinds +blindside +blindsided +blindsides +blindsiding +blini +blinis +blink +blinked +blinker +blinkered +blinkering +blinkers +blinking +blinks +blintz +blintze +blintzes +blip +blips +bliss +blissful +blissfully +blissfulness +blister +blistered +blistering +blisteringly +blisters +blistery +blithe +blithely +blitheness +blither +blithering +blithesome +blithest +blitz +blitzed +blitzes +blitzing +blitzkrieg +blitzkriegs +blizzard +blizzards +bloat +bloated +bloating +bloats +blob +blobbed +blobbing +blobs +bloc +block +blockade +blockaded +blockader +blockaders +blockades +blockading +blockage +blockages +blockbuster +blockbusters +blockbusting +blocked +blocker +blockers +blockhead +blockheads +blockhouse +blockhouses +blocking +blocks +blocs +bloke +blokes +blond +blonde +blonder +blondes +blondest +blondish +blondness +blonds +blood +bloodbath +bloodbaths +bloodcurdling +blooded +bloodhound +bloodhounds +bloodied +bloodier +bloodies +bloodiest +bloodiness +blooding +bloodless +bloodlessly +bloodlessness +bloodletting +bloodline +bloodlines +bloodmobile +bloodmobiles +bloods +bloodshed +bloodshot +bloodstain +bloodstained +bloodstains +bloodstock +bloodstream +bloodstreams +bloodsucker +bloodsuckers +bloodsucking +bloodthirstier +bloodthirstiest +bloodthirstily +bloodthirstiness +bloodthirsty +bloody +bloodying +bloom +bloomed +bloomer +bloomers +blooming +blooms +bloop +blooped +blooper +bloopers +blooping +bloops +blossom +blossomed +blossoming +blossoms +blossomy +blot +blotch +blotched +blotches +blotchier +blotchiest +blotching +blotchy +blots +blotted +blotter +blotters +blotting +blotto +blouse +bloused +blouses +blousing +blow +blower +blowers +blowflies +blowfly +blowgun +blowguns +blowhard +blowhards +blowier +blowiest +blowing +blown +blowout +blowouts +blowpipe +blowpipes +blows +blowsier +blowsiest +blowsy +blowtorch +blowtorched +blowtorches +blowtorching +blowup +blowups +blowy +blowzier +blowziest +blowzy +blubber +blubbered +blubbering +blubbers +blubbery +bludgeon +bludgeoned +bludgeoning +bludgeons +blue +bluebell +bluebells +blueberries +blueberry +bluebird +bluebirds +bluebonnet +bluebonnets +bluebottle +bluebottles +blued +bluefish +bluefishes +bluegill +bluegills +bluegrass +blueing +blueish +bluejacket +bluejackets +bluejay +bluejays +bluejeans +blueness +bluenose +bluenoses +bluepoint +bluepoints +blueprint +blueprinted +blueprinting +blueprints +bluer +blues +bluesier +bluesiest +bluest +bluestocking +bluestockings +bluesy +bluet +bluets +bluff +bluffed +bluffer +bluffers +bluffest +bluffing +bluffly +bluffness +bluffs +bluing +bluish +blunder +blunderbuss +blunderbusses +blundered +blunderer +blunderers +blundering +blunders +blunt +blunted +blunter +bluntest +blunting +bluntly +bluntness +blunts +blur +blurb +blurbs +blurred +blurrier +blurriest +blurriness +blurring +blurry +blurs +blurt +blurted +blurting +blurts +blush +blushed +blusher +blushers +blushes +blushing +bluster +blustered +blusterer +blusterers +blustering +blusterous +blusters +blustery +boar +board +boarded +boarder +boarders +boarding +boardinghouse +boardinghouses +boardroom +boardrooms +boards +boardwalk +boardwalks +boars +boas +boast +boasted +boaster +boasters +boastful +boastfully +boastfulness +boasting +boasts +boat +boated +boater +boaters +boathouse +boathouses +boating +boatman +boatmen +boats +boatswain +boatswains +bobbed +bobbies +bobbin +bobbing +bobbins +bobble +bobbled +bobbles +bobbling +bobby +bobbysoxer +bobbysoxers +bobcat +bobcats +bobolink +bobolinks +bobs +bobsled +bobsledded +bobsledder +bobsledders +bobsledding +bobsleds +bobsleigh +bobsleighed +bobsleighing +bobsleighs +bobtail +bobtails +bobwhite +bobwhites +bocce +bocci +boccie +bock +bodacious +bode +boded +bodega +bodegas +bodes +bodice +bodices +bodied +bodies +bodily +boding +bodkin +bodkins +bods +body +bodybuilder +bodybuilders +bodybuilding +bodyguard +bodyguards +bodysuit +bodysuits +bodywork +boffo +bogey +bogeyed +bogeying +bogeyman +bogeymen +bogeys +bogged +boggier +boggiest +bogging +boggle +boggled +boggles +boggling +boggy +bogie +bogied +bogieing +bogies +bogs +bogus +bogy +bogyman +bogymen +bohemian +bohemianism +bohemians +boil +boiled +boiler +boilermaker +boilermakers +boilerplate +boilers +boiling +boils +boisterous +boisterously +boisterousness +bola +bolas +bold +bolder +boldest +boldface +boldfaced +boldly +boldness +bole +bolero +boleros +boles +bolivar +bolivares +bolivars +boll +bollix +bollixed +bollixes +bollixing +bolls +bologna +boloney +bolshevik +bolsheviki +bolsheviks +bolster +bolstered +bolstering +bolsters +bolt +bolted +bolting +bolts +bolus +boluses +bomb +bombard +bombarded +bombardier +bombardiers +bombarding +bombardment +bombardments +bombards +bombast +bombastic +bombastically +bombed +bomber +bombers +bombing +bombproof +bombproofed +bombproofing +bombproofs +bombs +bombshell +bombshells +bonanza +bonanzas +bonbon +bonbons +bond +bondage +bonded +bondholder +bondholders +bonding +bondman +bondmen +bonds +bondsman +bondsmen +bondwoman +bondwomen +bone +boned +bonehead +boneheaded +boneheads +boneless +boner +boners +bones +boney +boneyer +boneyest +bonfire +bonfires +bong +bonged +bonging +bongo +bongoes +bongos +bongs +bonhomie +bonier +boniest +boniness +boning +bonito +bonitoes +bonitos +bonkers +bonnet +bonnets +bonnie +bonnier +bonniest +bonny +bonsai +bonus +bonuses +bony +boob +boobed +boobies +boobing +booboo +booboos +boobs +booby +boodle +boodles +booed +boogeyman +boogeymen +boogie +boogied +boogieing +boogieman +boogiemen +boogies +boohoo +boohooed +boohooing +boohoos +booing +book +bookbinder +bookbinderies +bookbinders +bookbindery +bookbinding +bookcase +bookcases +booked +bookend +bookended +bookending +bookends +bookie +bookies +booking +bookings +bookish +bookkeeper +bookkeepers +bookkeeping +booklet +booklets +bookmaker +bookmakers +bookmaking +bookmark +bookmarked +bookmarking +bookmarks +bookmobile +bookmobiles +bookplate +bookplates +books +bookseller +booksellers +bookshelf +bookshelves +bookshop +bookshops +bookstore +bookstores +bookworm +bookworms +boom +boombox +boomboxes +boomed +boomerang +boomeranged +boomeranging +boomerangs +booming +booms +boon +boondocks +boondoggle +boondoggled +boondoggler +boondogglers +boondoggles +boondoggling +boonies +boons +boor +boorish +boorishly +boorishness +boorishnesses +boors +boos +boost +boosted +booster +boosters +boosting +boosts +boot +bootblack +bootblacks +booted +bootee +bootees +booth +booths +bootie +booties +booting +bootleg +bootlegged +bootlegger +bootleggers +bootlegging +bootlegs +bootless +boots +bootstrap +bootstrapped +bootstrapping +bootstraps +booty +booze +boozed +boozer +boozers +boozes +boozier +booziest +boozing +boozy +bopped +bopping +bops +borax +bordello +bordellos +border +bordered +bordering +borderland +borderlands +borderline +borderlines +borders +bore +bored +boredom +borer +borers +bores +boring +born +borne +boron +borough +boroughs +borrow +borrowed +borrower +borrowers +borrowing +borrowings +borrows +borsch +borscht +borzoi +borzois +bosh +bosom +bosoms +bosomy +boss +bossed +bosses +bossier +bossiest +bossily +bossiness +bossing +bossism +bossy +bosun +bosuns +botanic +botanical +botanically +botanist +botanists +botany +botch +botched +botcher +botchers +botches +botching +both +bother +bothered +bothering +bothers +bothersome +bottle +bottled +bottleneck +bottlenecks +bottler +bottlers +bottles +bottling +bottom +bottomed +bottoming +bottomless +bottoms +botulism +boudoir +boudoirs +bouffant +bouffants +bougainvillea +bougainvilleas +bough +boughs +bought +bouillabaisse +bouillabaisses +bouillon +bouillons +boulder +boulders +boulevard +boulevards +bounce +bounced +bouncer +bouncers +bounces +bouncier +bounciest +bouncily +bounciness +bouncing +bouncy +bound +boundaries +boundary +bounded +bounden +bounder +bounders +bounding +boundless +boundlessly +boundlessness +bounds +bounteous +bounteously +bounteousness +bounties +bountiful +bountifully +bountifulness +bounty +bouquet +bouquets +bourbon +bourgeois +bourgeoisie +bout +boutique +boutiques +boutonniere +boutonnieres +bouts +bouzouki +bouzoukis +bovine +bovines +bowdlerization +bowdlerizations +bowdlerize +bowdlerized +bowdlerizes +bowdlerizing +bowed +bowel +bowels +bower +bowers +bowing +bowl +bowlder +bowlders +bowled +bowleg +bowlegged +bowlegs +bowler +bowlers +bowlful +bowlfuls +bowline +bowlines +bowling +bowls +bowman +bowmen +bows +bowsprit +bowsprits +bowstring +bowstrings +bowwow +bowwows +boxcar +boxcars +boxed +boxer +boxers +boxes +boxier +boxiest +boxing +boxlike +boxwood +boxy +boycott +boycotted +boycotting +boycotts +boyfriend +boyfriends +boyhood +boyhoods +boyish +boyishly +boyishness +boys +boysenberries +boysenberry +bozo +bozos +brace +braced +bracelet +bracelets +bracer +bracero +braceros +bracers +braces +bracing +bracken +bracket +bracketed +bracketing +brackets +brackish +brackishness +bract +bracts +brad +brads +brae +braes +brag +braggadocio +braggadocios +braggart +braggarts +bragged +bragger +braggers +bragging +brags +braid +braided +braiding +braids +braille +brain +brainchild +brainchildren +brained +brainier +brainiest +braininess +braining +brainless +brainlessly +brains +brainstorm +brainstormed +brainstorming +brainstorms +brainteaser +brainteasers +brainwash +brainwashed +brainwashes +brainwashing +brainy +braise +braised +braises +braising +brake +braked +brakeman +brakemen +brakes +braking +bramble +brambles +bramblier +brambliest +brambly +bran +branch +branched +branches +branching +branchlike +brand +branded +brander +branders +brandied +brandies +branding +brandish +brandished +brandishes +brandishing +brands +brandy +brandying +bras +brash +brasher +brashest +brashly +brashness +brass +brasserie +brasseries +brasses +brassier +brassiere +brassieres +brassiest +brassily +brassiness +brassy +brat +brats +brattier +brattiest +bratty +bratwurst +bratwursts +bravado +brave +braved +bravely +braveness +braver +bravery +braves +bravest +braving +bravo +bravos +bravura +bravuras +brawl +brawled +brawler +brawlers +brawling +brawls +brawn +brawnier +brawniest +brawniness +brawny +bray +brayed +braying +brays +braze +brazed +brazen +brazened +brazening +brazenly +brazenness +brazens +brazer +brazers +brazes +brazier +braziers +brazing +breach +breached +breaches +breaching +bread +breadbasket +breadbaskets +breadboard +breadboards +breadbox +breadboxes +breadcrumb +breadcrumbs +breaded +breadfruit +breadfruits +breading +breadline +breadlines +breads +breadth +breadths +breadwinner +breadwinners +break +breakable +breakables +breakage +breakages +breakaway +breakaways +breakdown +breakdowns +breaker +breakers +breakeven +breakfast +breakfasted +breakfasting +breakfasts +breakfront +breakfronts +breaking +breakneck +breakout +breakouts +breaks +breakthrough +breakthroughs +breakup +breakups +breakwater +breakwaters +bream +breams +breast +breastbone +breastbones +breasted +breasting +breastplate +breastplates +breasts +breaststroke +breaststrokes +breastwork +breastworks +breath +breathable +breathalyze +breathalyzed +breathalyzes +breathalyzing +breathe +breathed +breather +breathers +breathes +breathier +breathiest +breathing +breathless +breathlessly +breathlessness +breaths +breathtaking +breathtakingly +breathy +bred +breech +breeches +breed +breeder +breeders +breeding +breeds +breeze +breezed +breezes +breezeway +breezeways +breezier +breeziest +breezily +breeziness +breezing +breezy +brethren +breve +breves +brevet +breveted +breveting +brevets +brevetted +brevetting +breviaries +breviary +brevity +brew +brewed +brewer +breweries +brewers +brewery +brewing +brewpub +brewpubs +brews +briar +briars +bribe +bribed +briber +bribers +bribery +bribes +bribing +brick +brickbat +brickbats +bricked +bricking +bricklayer +bricklayers +bricklaying +bricks +brickwork +bridal +bridals +bride +bridegroom +bridegrooms +brides +bridesmaid +bridesmaids +bridge +bridgeable +bridged +bridgehead +bridgeheads +bridges +bridgework +bridging +bridle +bridled +bridles +bridling +brie +brief +briefcase +briefcases +briefed +briefer +briefest +briefing +briefings +briefly +briefness +briefs +brier +briers +brig +brigade +brigades +brigadier +brigadiers +brigand +brigandage +brigands +brigantine +brigantines +bright +brighten +brightened +brightener +brighteners +brightening +brightens +brighter +brightest +brightly +brightness +brights +brigs +brilliance +brilliancy +brilliant +brilliantine +brilliantly +brilliants +brim +brimful +brimfull +brimless +brimmed +brimming +brims +brimstone +brindle +brindled +brine +bring +bringer +bringers +bringing +brings +brinier +briniest +brininess +brink +brinkmanship +brinks +brinksmanship +briny +brioche +brioches +briquet +briquets +briquette +briquettes +brisk +brisked +brisker +briskest +brisket +briskets +brisking +briskly +briskness +brisks +bristle +bristled +bristles +bristlier +bristliest +bristling +bristly +britches +brittle +brittleness +brittler +brittlest +broach +broached +broaches +broaching +broad +broadband +broadcast +broadcasted +broadcaster +broadcasters +broadcasting +broadcasts +broadcloth +broaden +broadened +broadening +broadens +broader +broadest +broadloom +broadly +broadminded +broadness +broads +broadsheet +broadsheets +broadside +broadsided +broadsides +broadsiding +broadsword +broadswords +brocade +brocaded +brocades +brocading +broccoli +brochette +brochettes +brochure +brochures +brogan +brogans +brogue +brogues +broil +broiled +broiler +broilers +broiling +broils +broke +broken +brokenhearted +brokenheartedly +brokenly +brokenness +broker +brokerage +brokerages +brokered +brokering +brokers +bromide +bromides +bromidic +bromine +bronc +bronchi +bronchial +bronchitic +bronchitis +broncho +bronchos +bronchus +bronco +broncobuster +broncobusters +broncos +broncs +brontosaur +brontosauri +brontosaurs +brontosaurus +brontosauruses +bronze +bronzed +bronzes +bronzing +brooch +brooches +brood +brooded +brooder +brooders +broodier +broodiest +brooding +broodingly +broodmare +broodmares +broods +broody +brook +brooked +brooking +brooklet +brooklets +brooks +broom +brooms +broomstick +broomsticks +bros +broth +brothel +brothels +brother +brotherhood +brotherhoods +brotherliness +brotherly +brothers +broths +brougham +broughams +brought +brouhaha +brouhahas +brow +browbeat +browbeaten +browbeating +browbeats +brown +browned +browner +brownest +brownie +brownies +browning +brownish +brownness +brownout +brownouts +browns +brownstone +brownstones +brows +browse +browsed +browser +browsers +browses +browsing +bruin +bruins +bruise +bruised +bruiser +bruisers +bruises +bruising +bruit +bruited +bruiting +bruits +brunch +brunched +brunches +brunching +brunet +brunets +brunette +brunettes +brunt +brush +brushed +brushes +brushing +brushoff +brushoffs +brushwood +brushwork +brusk +brusker +bruskest +brusque +brusquely +brusqueness +brusquer +brusquest +brutal +brutalities +brutality +brutalization +brutalize +brutalized +brutalizes +brutalizing +brutally +brute +brutes +brutish +brutishly +brutishness +bubble +bubbled +bubblegum +bubbles +bubblier +bubbliest +bubbling +bubbly +bubo +buboes +bubs +buccaneer +buccaneers +buck +buckaroo +buckaroos +buckboard +buckboards +bucked +bucket +bucketed +bucketful +bucketfuls +bucketing +buckets +buckeye +buckeyes +bucking +buckle +buckled +buckler +bucklers +buckles +buckling +buckram +bucks +bucksaw +bucksaws +buckshot +buckskin +buckskins +buckteeth +bucktooth +bucktoothed +buckwheat +bucolic +bucolically +bucolics +budded +buddies +budding +buddy +budge +budged +budgerigar +budgerigars +budges +budget +budgetary +budgeted +budgeting +budgets +budgie +budgies +budging +buds +buff +buffalo +buffaloed +buffaloes +buffaloing +buffalos +buffed +buffer +buffered +buffering +buffers +buffet +buffeted +buffeting +buffets +buffing +buffoon +buffoonery +buffoonish +buffoons +buffs +bugaboo +bugaboos +bugbear +bugbears +bugged +bugger +buggered +buggering +buggers +buggier +buggies +buggiest +bugging +buggy +bugle +bugled +bugler +buglers +bugles +bugling +bugs +build +builder +builders +building +buildings +builds +buildup +buildups +built +bulb +bulbous +bulbs +bulge +bulged +bulges +bulgier +bulgiest +bulging +bulgy +bulimarexia +bulimia +bulimic +bulimics +bulk +bulked +bulkhead +bulkheads +bulkier +bulkiest +bulkiness +bulking +bulks +bulky +bull +bulldog +bulldogged +bulldogging +bulldogs +bulldoze +bulldozed +bulldozer +bulldozers +bulldozes +bulldozing +bulled +bullet +bulletin +bulletined +bulletining +bulletins +bulletproof +bulletproofed +bulletproofing +bulletproofs +bullets +bullfight +bullfighter +bullfighters +bullfighting +bullfights +bullfinch +bullfinches +bullfrog +bullfrogs +bullhead +bullheaded +bullheadedly +bullheadedness +bullheads +bullhorn +bullhorns +bullied +bullies +bulling +bullion +bullish +bullishly +bullishness +bullock +bullocks +bullpen +bullpens +bullring +bullrings +bulls +bullshit +bullshits +bullshitted +bullshitter +bullshitters +bullshitting +bully +bullying +bulrush +bulrushes +bulwark +bulwarks +bumble +bumblebee +bumblebees +bumbled +bumbler +bumblers +bumbles +bumbling +bummed +bummer +bummers +bummest +bumming +bump +bumped +bumper +bumpers +bumpier +bumpiest +bumpiness +bumping +bumpkin +bumpkins +bumps +bumptious +bumptiously +bumptiousness +bumpy +bums +bunch +bunched +bunches +bunchier +bunchiest +bunching +bunchy +bunco +buncoed +buncoing +buncombe +buncos +bundle +bundled +bundles +bundling +bung +bungalow +bungalows +bunged +bungee +bungees +bunghole +bungholes +bunging +bungle +bungled +bungler +bunglers +bungles +bungling +bungs +bunion +bunions +bunk +bunked +bunker +bunkers +bunkhouse +bunkhouses +bunking +bunko +bunkos +bunks +bunkum +bunnies +bunny +buns +bunt +bunted +bunting +buntings +bunts +buoy +buoyancy +buoyant +buoyantly +buoyed +buoying +buoys +burble +burbled +burbles +burbling +burbs +burden +burdened +burdening +burdens +burdensome +burdock +bureau +bureaucracies +bureaucracy +bureaucrat +bureaucratic +bureaucratically +bureaucratization +bureaucratize +bureaucratized +bureaucratizes +bureaucratizing +bureaucrats +bureaus +bureaux +burg +burgeon +burgeoned +burgeoning +burgeons +burger +burgers +burgh +burgher +burghers +burghs +burglar +burglaries +burglarize +burglarized +burglarizes +burglarizing +burglarproof +burglarproofed +burglarproofing +burglarproofs +burglars +burglary +burgle +burgled +burgles +burgling +burgomaster +burgomasters +burgs +burgundies +burgundy +burial +burials +buried +buries +burl +burlap +burled +burlesque +burlesqued +burlesques +burlesquing +burlier +burliest +burliness +burls +burly +burn +burnable +burnables +burned +burner +burners +burning +burnish +burnished +burnisher +burnishers +burnishes +burnishing +burnoose +burnooses +burnous +burnouses +burnout +burnouts +burns +burnt +burp +burped +burping +burps +burr +burred +burring +burrito +burritos +burro +burros +burrow +burrowed +burrower +burrowers +burrowing +burrows +burrs +burs +bursa +bursae +bursar +bursaries +bursars +bursary +bursas +bursitis +burst +bursted +bursting +bursts +bury +burying +busbies +busboy +busboys +busby +bused +buses +busgirl +busgirls +bush +bushed +bushel +busheled +busheling +bushelled +bushelling +bushels +bushes +bushier +bushiest +bushiness +bushing +bushings +bushman +bushmaster +bushmasters +bushmen +bushwhack +bushwhacked +bushwhacker +bushwhackers +bushwhacking +bushwhacks +bushy +busied +busier +busies +busiest +busily +business +businesses +businesslike +businessman +businessmen +businessperson +businesspersons +businesswoman +businesswomen +busing +buskin +buskins +buss +bussed +busses +bussing +bust +busted +buster +busters +bustier +bustiest +busting +bustle +bustled +bustles +bustling +busts +busty +busy +busybodies +busybody +busying +busyness +busywork +butane +butch +butcher +butchered +butcheries +butchering +butchers +butchery +butches +butler +butlers +buts +butt +butte +butted +butter +butterball +butterballs +buttercup +buttercups +buttered +butterfat +butterfingered +butterfingers +butterflied +butterflies +butterfly +butterflying +butterier +butteries +butteriest +buttering +buttermilk +butternut +butternuts +butters +butterscotch +buttery +buttes +butting +buttock +buttocks +button +buttoned +buttonhole +buttonholed +buttonholes +buttonholing +buttoning +buttons +buttonwood +buttonwoods +buttress +buttressed +buttresses +buttressing +butts +buxom +buyback +buybacks +buyer +buyers +buying +buyout +buyouts +buys +buzz +buzzard +buzzards +buzzed +buzzer +buzzers +buzzes +buzzing +buzzword +buzzwords +byelaw +byelaws +byes +bygone +bygones +bylaw +bylaws +byline +bylines +bypass +bypassed +bypasses +bypassing +bypast +bypath +bypaths +byplay +byproduct +byproducts +byroad +byroads +bystander +bystanders +byte +bytes +byway +byways +byword +bywords +byzantine +cabal +cabala +caballero +caballeros +cabals +cabana +cabanas +cabaret +cabarets +cabbage +cabbages +cabbed +cabbie +cabbies +cabbing +cabby +cabdriver +cabdrivers +cabin +cabinet +cabinetmaker +cabinetmakers +cabinetmaking +cabinetry +cabinets +cabinetwork +cabins +cable +cablecast +cablecasted +cablecasting +cablecasts +cabled +cablegram +cablegrams +cables +cabling +cabochon +cabochons +caboodle +caboose +cabooses +cabriolet +cabriolets +cabs +cabstand +cabstands +cacao +cacaos +cache +cached +cachepot +cachepots +caches +cachet +cachets +caching +cackle +cackled +cackler +cacklers +cackles +cackling +cacophonies +cacophonous +cacophony +cacti +cactus +cactuses +cadaver +cadaverous +cadavers +caddie +caddied +caddies +caddish +caddishly +caddishness +caddy +caddying +cadence +cadenced +cadences +cadenza +cadenzas +cadet +cadets +cadge +cadged +cadger +cadgers +cadges +cadging +cadmium +cadre +cadres +cads +caducei +caduceus +caesarean +caesareans +caesarian +caesarians +caesura +caesurae +caesuras +cafe +cafes +cafeteria +cafeterias +caffeine +caftan +caftans +cage +caged +cages +cagey +cagier +cagiest +cagily +caginess +caging +cagy +cahoot +cahoots +caiman +caimans +cairn +cairns +caisson +caissons +caitiff +caitiffs +cajole +cajoled +cajolement +cajoler +cajolers +cajolery +cajoles +cajoling +cake +caked +cakes +cakewalk +cakewalks +caking +calabash +calabashes +calaboose +calabooses +calamari +calamaris +calamine +calamities +calamitous +calamitously +calamity +calcareous +calciferous +calcification +calcified +calcifies +calcify +calcifying +calcimine +calcimined +calcimines +calcimining +calcine +calcined +calcines +calcining +calcite +calcium +calculable +calculate +calculated +calculatedly +calculates +calculating +calculatingly +calculation +calculations +calculative +calculator +calculators +calculi +calculus +calculuses +caldera +calderas +caldron +caldrons +calendar +calendared +calendaring +calendars +calender +calendered +calendering +calenders +calf +calfs +calfskin +caliber +calibers +calibrate +calibrated +calibrates +calibrating +calibration +calibrations +calibrator +calibrators +calibre +calibres +calico +calicoes +calicos +calif +californium +califs +caliper +calipered +calipering +calipers +caliph +caliphate +caliphates +caliphs +calisthenic +calisthenics +calk +calked +calking +calks +call +calla +callas +callback +callbacks +called +caller +callers +calligrapher +calligraphers +calligraphic +calligraphist +calligraphists +calligraphy +calling +callings +calliope +calliopes +calliper +callipered +callipering +callipers +callisthenics +callosities +callosity +callous +calloused +callouses +callousing +callously +callousness +callow +callower +callowest +callowness +calls +callus +callused +calluses +callusing +calm +calmed +calmer +calmest +calming +calmly +calmness +calms +caloric +calorie +calories +calorific +calumet +calumets +calumniate +calumniated +calumniates +calumniating +calumniation +calumniator +calumniators +calumnies +calumnious +calumny +calve +calved +calves +calving +calyces +calypso +calypsos +calyx +calyxes +camaraderie +camber +cambered +cambering +cambers +cambia +cambial +cambium +cambiums +cambric +camcorder +camcorders +came +camel +camelhair +camellia +camellias +camels +cameo +cameos +camera +cameraman +cameramen +cameras +camerawoman +camerawomen +camisole +camisoles +camomile +camomiles +camouflage +camouflaged +camouflager +camouflagers +camouflages +camouflaging +camp +campaign +campaigned +campaigner +campaigners +campaigning +campaigns +campanile +campaniles +campanili +campanologist +campanologists +campanology +camped +camper +campers +campfire +campfires +campground +campgrounds +camphor +campier +campiest +camping +camps +campsite +campsites +campus +campuses +campy +cams +camshaft +camshafts +canal +canalization +canalize +canalized +canalizes +canalizing +canals +canape +canapes +canard +canards +canaries +canary +canasta +cancan +cancans +cancel +canceled +canceler +cancelers +canceling +cancellation +cancellations +cancelled +canceller +cancellers +cancelling +cancels +cancer +cancerous +cancers +candelabra +candelabras +candelabrum +candelabrums +candid +candidacies +candidacy +candidate +candidates +candidature +candidatures +candidly +candidness +candied +candies +candle +candled +candlelight +candlepower +candler +candlers +candles +candlestick +candlesticks +candlewick +candlewicks +candling +candor +candour +candy +candying +cane +canebrake +canebrakes +caned +caner +caners +canes +canine +canines +caning +canister +canisters +canker +cankered +cankering +cankerous +cankers +cannabis +cannabises +canned +cannelloni +canneries +cannery +cannibal +cannibalism +cannibalistic +cannibalization +cannibalize +cannibalized +cannibalizes +cannibalizing +cannibals +cannier +canniest +cannily +canniness +canning +cannon +cannonade +cannonaded +cannonades +cannonading +cannonball +cannonballs +cannoned +cannoning +cannons +cannot +canny +canoe +canoed +canoeing +canoeist +canoeists +canoes +canola +canon +canonical +canonically +canonization +canonizations +canonize +canonized +canonizes +canonizing +canons +canopied +canopies +canopy +canopying +cans +canst +cant +cantabile +cantaloup +cantaloupe +cantaloupes +cantaloups +cantankerous +cantankerously +cantankerousness +cantata +cantatas +canted +canteen +canteens +canter +cantered +cantering +canters +canticle +canticles +cantilever +cantilevered +cantilevering +cantilevers +canting +canto +canton +cantonal +cantonment +cantonments +cantons +cantor +cantors +cantos +cants +canvas +canvasback +canvasbacks +canvased +canvases +canvasing +canvass +canvassed +canvasser +canvassers +canvasses +canvassing +canyon +canyons +capabilities +capability +capable +capably +capacious +capaciously +capaciousness +capacitance +capacities +capacitor +capacitors +capacity +caparison +caparisoned +caparisoning +caparisons +cape +caped +caper +capered +capering +capers +capes +capeskin +capillaries +capillarity +capillary +capital +capitalism +capitalist +capitalistic +capitalistically +capitalists +capitalization +capitalize +capitalized +capitalizes +capitalizing +capitally +capitals +capitation +capitations +capitol +capitols +capitulate +capitulated +capitulates +capitulating +capitulation +capitulations +caplet +caplets +capo +capon +capons +capos +capped +capping +cappuccino +cappuccinos +caprice +caprices +capricious +capriciously +capriciousness +caps +capsicum +capsicums +capsize +capsized +capsizes +capsizing +capstan +capstans +capstone +capstones +capsular +capsule +capsuled +capsules +capsuling +capsulize +capsulized +capsulizes +capsulizing +captain +captaincies +captaincy +captained +captaining +captains +caption +captioned +captioning +captions +captious +captiously +captiousness +captivate +captivated +captivates +captivating +captivation +captivator +captivators +captive +captives +captivities +captivity +captor +captors +capture +captured +captures +capturing +caracul +carafe +carafes +caramel +caramelize +caramelized +caramelizes +caramelizing +caramels +carapace +carapaces +carat +carats +caravan +caravans +caravansaries +caravansary +caravanserai +caravanserais +caravel +caravels +caraway +caraways +carbide +carbides +carbine +carbines +carbohydrate +carbohydrates +carbon +carbonaceous +carbonate +carbonated +carbonates +carbonating +carbonation +carboniferous +carbonize +carbonized +carbonizes +carbonizing +carbons +carborundum +carboy +carboys +carbuncle +carbuncles +carbuncular +carburetor +carburetors +carburetter +carburetters +carburettor +carburettors +carcass +carcasses +carcinogen +carcinogenic +carcinogenicity +carcinogenics +carcinogens +carcinoma +carcinomas +carcinomata +card +cardamom +cardamoms +cardboard +carded +carder +carders +cardiac +cardigan +cardigans +cardinal +cardinally +cardinals +carding +cardiogram +cardiograms +cardiograph +cardiographs +cardiologist +cardiologists +cardiology +cardiopulmonary +cardiovascular +cards +cardsharp +cardsharper +cardsharpers +cardsharps +care +cared +careen +careened +careening +careens +career +careered +careering +careerist +careerists +careers +carefree +careful +carefuller +carefullest +carefully +carefulness +caregiver +caregivers +careless +carelessly +carelessness +carer +carers +cares +caress +caressed +caresses +caressing +caret +caretaker +caretakers +carets +careworn +carfare +cargo +cargoes +cargos +carhop +carhops +caribou +caribous +caricature +caricatured +caricatures +caricaturing +caricaturist +caricaturists +caries +carillon +carillons +caring +carious +carjack +carjacked +carjacker +carjackers +carjacking +carjackings +carjacks +carload +carloads +carmine +carnage +carnal +carnality +carnally +carnation +carnations +carnelian +carnelians +carney +carneys +carnies +carnival +carnivals +carnivore +carnivores +carnivorous +carnivorously +carnivorousness +carny +carob +carol +caroled +caroler +carolers +caroling +carolled +caroller +carollers +carolling +carols +carom +caromed +caroming +caroms +carotene +carotid +carotids +carousal +carousals +carouse +caroused +carousel +carousels +carouser +carousers +carouses +carousing +carp +carpal +carpals +carped +carpel +carpels +carpenter +carpentered +carpentering +carpenters +carpentry +carper +carpers +carpet +carpetbag +carpetbagged +carpetbagger +carpetbaggers +carpetbagging +carpetbags +carpeted +carpeting +carpets +carpi +carping +carpool +carpooled +carpooling +carpools +carport +carports +carps +carpus +carrel +carrell +carrells +carrels +carriage +carriages +carried +carrier +carriers +carries +carrion +carrot +carrots +carroty +carrousel +carrousels +carry +carryall +carryalls +carrying +carryout +carryover +carryovers +cars +carsick +carsickness +cart +cartage +carted +cartel +cartels +carter +carters +carthorse +carthorses +cartilage +cartilages +cartilaginous +carting +cartload +cartloads +cartographer +cartographers +cartographic +cartography +carton +cartons +cartoon +cartooned +cartooning +cartoonist +cartoonists +cartoons +cartridge +cartridges +carts +cartwheel +cartwheeled +cartwheeling +cartwheels +carve +carved +carver +carvers +carves +carving +carvings +caryatid +caryatides +caryatids +casaba +casabas +cascade +cascaded +cascades +cascading +cascara +cascaras +case +cased +caseharden +casehardened +casehardening +casehardens +casein +caseload +caseloads +casement +casements +cases +casework +caseworker +caseworkers +cash +cashbook +cashbooks +cashed +cashes +cashew +cashews +cashier +cashiered +cashiering +cashiers +cashing +cashless +cashmere +casing +casings +casino +casinos +cask +casket +caskets +casks +cassava +cassavas +casserole +casseroled +casseroles +casseroling +cassette +cassettes +cassia +cassias +cassino +cassock +cassocks +cassowaries +cassowary +cast +castanet +castanets +castaway +castaways +caste +castellated +caster +casters +castes +castigate +castigated +castigates +castigating +castigation +castigator +castigators +casting +castings +castle +castled +castles +castling +castoff +castoffs +castor +castors +castrate +castrated +castrates +castrating +castration +castrations +casts +casual +casually +casualness +casuals +casualties +casualty +casuist +casuistic +casuistry +casuists +cataclysm +cataclysmal +cataclysmic +cataclysms +catacomb +catacombs +catafalque +catafalques +catalepsy +cataleptic +cataleptics +catalog +cataloged +cataloger +catalogers +cataloging +catalogs +catalogue +catalogued +cataloguer +cataloguers +catalogues +cataloguing +catalpa +catalpas +catalysis +catalyst +catalysts +catalytic +catalytics +catalyze +catalyzed +catalyzes +catalyzing +catamaran +catamarans +catapult +catapulted +catapulting +catapults +cataract +cataracts +catarrh +catastrophe +catastrophes +catastrophic +catastrophically +catatonia +catatonic +catatonics +catbird +catbirds +catboat +catboats +catcall +catcalled +catcalling +catcalls +catch +catchall +catchalls +catcher +catchers +catches +catchier +catchiest +catching +catchment +catchments +catchpenny +catchphrase +catchphrases +catchup +catchword +catchwords +catchy +catechism +catechisms +catechist +catechists +catechize +catechized +catechizes +catechizing +categorical +categorically +categories +categorization +categorizations +categorize +categorized +categorizes +categorizing +category +cater +catercorner +catered +caterer +caterers +catering +caterpillar +caterpillars +caters +caterwaul +caterwauled +caterwauling +caterwauls +catfish +catfishes +catgut +catharses +catharsis +cathartic +cathartics +cathedral +cathedrals +catheter +catheterize +catheterized +catheterizes +catheterizing +catheters +cathode +cathodes +cathodic +catholic +catholicity +cation +cations +catkin +catkins +catlike +catnap +catnapped +catnapping +catnaps +catnip +cats +catsup +cattail +cattails +cattier +cattiest +cattily +cattiness +cattle +cattleman +cattlemen +catty +catwalk +catwalks +caucus +caucused +caucuses +caucusing +caucussed +caucussing +caudal +caudally +caught +cauldron +cauldrons +cauliflower +cauliflowers +caulk +caulked +caulker +caulkers +caulking +caulks +causal +causalities +causality +causally +causation +causative +cause +caused +causeless +causer +causerie +causeries +causers +causes +causeway +causeways +causing +caustic +caustically +causticity +caustics +cauterization +cauterize +cauterized +cauterizes +cauterizing +caution +cautionary +cautioned +cautioning +cautions +cautious +cautiously +cautiousness +cavalcade +cavalcades +cavalier +cavalierly +cavaliers +cavalries +cavalry +cavalryman +cavalrymen +cave +caveat +caveats +caved +caveman +cavemen +cavern +cavernous +cavernously +caverns +caves +caviar +caviare +cavil +caviled +caviler +cavilers +caviling +cavilled +caviller +cavillers +cavilling +cavils +caving +cavities +cavity +cavort +cavorted +cavorting +cavorts +cawed +cawing +caws +cayenne +cayman +caymans +cays +cayuse +cayuses +cease +ceased +ceasefire +ceasefires +ceaseless +ceaselessly +ceaselessness +ceases +ceasing +ceca +cecal +cecum +cedar +cedars +cede +ceded +ceder +ceders +cedes +cedilla +cedillas +ceding +ceiling +ceilings +celandine +celebrant +celebrants +celebrate +celebrated +celebrates +celebrating +celebration +celebrations +celebrator +celebrators +celebratory +celebrities +celebrity +celerity +celery +celesta +celestas +celestial +celestially +celibacy +celibate +celibates +cell +cellar +cellars +celled +celli +cellist +cellists +cellmate +cellmates +cello +cellophane +cellos +cellphone +cellphones +cells +cellular +cellulite +celluloid +cellulose +cement +cemented +cementer +cementers +cementing +cements +cementum +cemeteries +cemetery +cenobite +cenobites +cenobitic +cenotaph +cenotaphs +censer +censers +censor +censored +censorial +censoring +censorious +censoriously +censoriousness +censors +censorship +censurable +censure +censured +censurer +censurers +censures +censuring +census +censused +censuses +censusing +cent +centaur +centaurs +centavo +centavos +centenarian +centenarians +centenaries +centenary +centennial +centennially +centennials +center +centerboard +centerboards +centered +centerfold +centerfolds +centering +centerpiece +centerpieces +centers +centigrade +centigram +centigramme +centigrammes +centigrams +centiliter +centiliters +centime +centimes +centimeter +centimeters +centimetre +centimetres +centipede +centipedes +central +centrality +centralization +centralize +centralized +centralizer +centralizers +centralizes +centralizing +centrally +centrals +centre +centred +centres +centrifugal +centrifugally +centrifuge +centrifuged +centrifuges +centrifuging +centring +centripetal +centripetally +centrism +centrist +centrists +cents +centuries +centurion +centurions +century +cephalic +ceramic +ceramicist +ceramicists +ceramics +ceramist +ceramists +cereal +cereals +cerebella +cerebellar +cerebellum +cerebellums +cerebra +cerebral +cerebrate +cerebrated +cerebrates +cerebrating +cerebration +cerebrum +cerebrums +cerement +cerements +ceremonial +ceremonially +ceremonials +ceremonies +ceremonious +ceremoniously +ceremoniousness +ceremony +cerise +cerium +cermet +certain +certainly +certainties +certainty +certifiable +certifiably +certificate +certificated +certificates +certificating +certification +certifications +certified +certifies +certify +certifying +certitude +cerulean +cervical +cervices +cervix +cervixes +cesarean +cesareans +cesium +cessation +cessations +cession +cessions +cesspool +cesspools +cetacean +cetaceans +chafe +chafed +chafes +chaff +chaffed +chaffinch +chaffinches +chaffing +chaffs +chafing +chagrin +chagrined +chagrining +chagrinned +chagrinning +chagrins +chain +chained +chaining +chains +chainsaw +chainsawed +chainsawing +chainsaws +chair +chaired +chairing +chairlift +chairlifts +chairman +chairmanship +chairmen +chairperson +chairpersons +chairs +chairwoman +chairwomen +chaise +chaises +chalcedony +chalet +chalets +chalice +chalices +chalk +chalkboard +chalkboards +chalked +chalkier +chalkiest +chalkiness +chalking +chalks +chalky +challenge +challenged +challenger +challengers +challenges +challenging +challis +chamber +chambered +chamberlain +chamberlains +chambermaid +chambermaids +chambers +chambray +chameleon +chameleons +chammies +chammy +chamois +chamoix +chamomile +chamomiles +champ +champagne +champagnes +champed +champing +champion +championed +championing +champions +championship +championships +champs +chance +chanced +chancel +chancelleries +chancellery +chancellor +chancellors +chancellorship +chancels +chanceries +chancery +chances +chancier +chanciest +chanciness +chancing +chancre +chancres +chancy +chandelier +chandeliers +chandler +chandlers +change +changeability +changeable +changeableness +changeably +changed +changeless +changelessly +changeling +changelings +changeover +changeovers +changer +changers +changes +changing +channel +channeled +channeling +channelization +channelize +channelized +channelizes +channelizing +channelled +channelling +channels +chanson +chansons +chant +chanted +chanter +chanters +chanteuse +chanteuses +chantey +chanteys +chanticleer +chanticleers +chanties +chanting +chants +chanty +chaos +chaotic +chaotically +chap +chaparral +chaparrals +chapbook +chapbooks +chapeau +chapeaus +chapeaux +chapel +chapels +chaperon +chaperonage +chaperone +chaperoned +chaperones +chaperoning +chaperons +chaplain +chaplaincies +chaplaincy +chaplains +chaplet +chaplets +chapped +chapping +chaps +chapt +chapter +chapters +char +charabanc +charabancs +character +characteristic +characteristically +characteristics +characterization +characterizations +characterize +characterized +characterizes +characterizing +characterless +characters +charade +charades +charbroil +charbroiled +charbroiling +charbroils +charcoal +charcoals +chard +chardonnay +chardonnays +charge +chargeable +charged +charger +chargers +charges +charging +charier +chariest +charily +chariness +chariot +charioteer +charioteers +chariots +charisma +charismatic +charismatics +charitable +charitableness +charitably +charities +charity +charlatan +charlatanism +charlatanry +charlatans +charm +charmed +charmer +charmers +charming +charmingly +charms +charred +charring +chars +chart +charted +charter +chartered +charterer +charterers +chartering +charters +charting +chartreuse +charts +charwoman +charwomen +chary +chase +chased +chaser +chasers +chases +chasing +chasm +chasms +chassis +chaste +chastely +chasten +chastened +chasteness +chastening +chastens +chaster +chastest +chastise +chastised +chastisement +chastisements +chastiser +chastisers +chastises +chastising +chastity +chasuble +chasubles +chat +chateau +chateaus +chateaux +chatelaine +chatelaines +chats +chatted +chattel +chattels +chatter +chatterbox +chatterboxes +chattered +chatterer +chatterers +chattering +chatters +chattier +chattiest +chattily +chattiness +chatting +chatty +chauffeur +chauffeured +chauffeuring +chauffeurs +chauvinism +chauvinist +chauvinistic +chauvinistically +chauvinists +cheap +cheapen +cheapened +cheapening +cheapens +cheaper +cheapest +cheaply +cheapness +cheapskate +cheapskates +cheat +cheated +cheater +cheaters +cheating +cheats +check +checkbook +checkbooks +checked +checker +checkerboard +checkerboards +checkered +checkering +checkers +checking +checklist +checklists +checkmate +checkmated +checkmates +checkmating +checkoff +checkoffs +checkout +checkouts +checkpoint +checkpoints +checkroom +checkrooms +checks +checkup +checkups +cheddar +cheek +cheekbone +cheekbones +cheeked +cheekier +cheekiest +cheekily +cheekiness +cheeking +cheeks +cheeky +cheep +cheeped +cheeping +cheeps +cheer +cheered +cheerer +cheerers +cheerful +cheerfuller +cheerfullest +cheerfully +cheerfulness +cheerier +cheeriest +cheerily +cheeriness +cheering +cheerio +cheerios +cheerleader +cheerleaders +cheerless +cheerlessly +cheerlessness +cheers +cheery +cheese +cheeseburger +cheeseburgers +cheesecake +cheesecakes +cheesecloth +cheeseparing +cheeses +cheesier +cheesiest +cheesiness +cheesy +cheetah +cheetahs +chef +chefs +chemical +chemically +chemicals +chemise +chemises +chemist +chemistry +chemists +chemo +chemotherapeutic +chemotherapy +chemurgy +chenille +cheque +chequer +chequers +cheques +cherish +cherished +cherishes +cherishing +cheroot +cheroots +cherries +cherry +chert +cherub +cherubic +cherubim +cherubims +cherubs +chervil +chess +chessboard +chessboards +chessman +chessmen +chest +chested +chesterfield +chesterfields +chestful +chestfuls +chestier +chestiest +chestnut +chestnuts +chests +chesty +chevalier +chevaliers +cheviot +chevron +chevrons +chew +chewed +chewer +chewers +chewier +chewiest +chewiness +chewing +chews +chewy +chiaroscuro +chic +chicane +chicaneries +chicanery +chicanes +chicer +chicest +chichi +chichis +chick +chickadee +chickadees +chicken +chickened +chickenfeed +chickenhearted +chickening +chickenpox +chickens +chickpea +chickpeas +chicks +chickweed +chicle +chicness +chicories +chicory +chid +chidden +chide +chided +chides +chiding +chidingly +chief +chiefdom +chiefer +chiefest +chiefly +chiefs +chieftain +chieftains +chieftainship +chieftainships +chiffon +chiffonier +chiffoniers +chigger +chiggers +chignon +chignons +chihuahua +chihuahuas +chilblain +chilblains +child +childbearing +childbirth +childbirths +childcare +childhood +childhoods +childish +childishly +childishness +childless +childlessness +childlike +childproof +childproofed +childproofing +childproofs +children +chile +chiles +chili +chilies +chill +chilled +chiller +chillers +chillest +chilli +chillier +chillies +chilliest +chilliness +chilling +chillingly +chillness +chills +chilly +chimaera +chimaeras +chime +chimed +chimer +chimera +chimeras +chimeric +chimerical +chimers +chimes +chiming +chimney +chimneys +chimp +chimpanzee +chimpanzees +chimps +chin +china +chinaware +chinchilla +chinchillas +chine +chines +chink +chinked +chinking +chinks +chinned +chinning +chino +chinos +chins +chinstrap +chinstraps +chintz +chintzier +chintziest +chintzy +chip +chipmunk +chipmunks +chipped +chipper +chippers +chipping +chips +chirography +chiropodist +chiropodists +chiropody +chiropractic +chiropractics +chiropractor +chiropractors +chirp +chirped +chirpier +chirpiest +chirping +chirps +chirpy +chirrup +chirruped +chirruping +chirrupped +chirrupping +chirrups +chis +chisel +chiseled +chiseler +chiselers +chiseling +chiselled +chiseller +chisellers +chiselling +chisels +chit +chitchat +chitchats +chitchatted +chitchatting +chitin +chitinous +chitlings +chitlins +chits +chitterlings +chivalrous +chivalrously +chivalrousness +chivalry +chive +chives +chlamydia +chlamydiae +chlamydias +chloral +chlordane +chloride +chlorides +chlorinate +chlorinated +chlorinates +chlorinating +chlorination +chlorine +chlorofluorocarbon +chlorofluorocarbons +chloroform +chloroformed +chloroforming +chloroforms +chlorophyl +chlorophyll +chloroplast +chloroplasts +chocaholic +chocaholics +chock +chockablock +chocked +chocking +chocks +chocoholic +chocoholics +chocolate +chocolates +chocolatey +chocolaty +choice +choicer +choices +choicest +choir +choirboy +choirboys +choirmaster +choirmasters +choirs +choke +chokecherries +chokecherry +choked +choker +chokers +chokes +choking +choler +cholera +choleric +cholesterol +chomp +chomped +chomping +chomps +choose +chooser +choosers +chooses +choosey +choosier +choosiest +choosiness +choosing +choosy +chop +chophouse +chophouses +chopped +chopper +choppered +choppering +choppers +choppier +choppiest +choppily +choppiness +chopping +choppy +chops +chopstick +chopsticks +choral +chorale +chorales +chorally +chorals +chord +chordal +chordate +chordates +chords +chore +chorea +choreograph +choreographed +choreographer +choreographers +choreographic +choreographically +choreographing +choreographs +choreography +chores +chorister +choristers +choroid +choroids +chortle +chortled +chortler +chortlers +chortles +chortling +chorus +chorused +choruses +chorusing +chorussed +chorussing +chose +chosen +chow +chowder +chowders +chowed +chowing +chows +chrism +christen +christened +christening +christenings +christens +chromatic +chromatically +chromatin +chrome +chromed +chromes +chroming +chromium +chromosomal +chromosome +chromosomes +chronic +chronically +chronicle +chronicled +chronicler +chroniclers +chronicles +chronicling +chronograph +chronographs +chronological +chronologically +chronologies +chronologist +chronologists +chronology +chronometer +chronometers +chrysalides +chrysalis +chrysalises +chrysanthemum +chrysanthemums +chub +chubbier +chubbiest +chubbiness +chubby +chubs +chuck +chucked +chuckhole +chuckholes +chucking +chuckle +chuckled +chuckles +chuckling +chucks +chug +chugged +chugging +chugs +chukka +chukkas +chum +chummed +chummier +chummiest +chummily +chumminess +chumming +chummy +chump +chumps +chums +chunk +chunkier +chunkiest +chunkiness +chunks +chunky +church +churches +churchgoer +churchgoers +churchgoing +churchman +churchmen +churchwarden +churchwardens +churchyard +churchyards +churl +churlish +churlishly +churlishness +churls +churn +churned +churner +churners +churning +churns +chute +chutes +chutney +chutzpa +chutzpah +chyme +ciao +cicada +cicadae +cicadas +cicatrice +cicatrices +cicatrix +cicatrixes +cicerone +cicerones +ciceroni +cider +ciders +cigar +cigaret +cigarets +cigarette +cigarettes +cigarillo +cigarillos +cigars +cilantro +cilia +cilium +cinch +cinched +cinches +cinching +cinchona +cinchonas +cincture +cinctures +cinder +cindered +cindering +cinders +cinema +cinemas +cinematic +cinematographer +cinematographers +cinematographic +cinematography +cinnabar +cinnamon +cipher +ciphered +ciphering +ciphers +circa +circadian +circle +circled +circles +circlet +circlets +circling +circuit +circuital +circuited +circuiting +circuitous +circuitously +circuitousness +circuitry +circuits +circuity +circular +circularity +circularize +circularized +circularizes +circularizing +circularly +circulars +circulate +circulated +circulates +circulating +circulation +circulations +circulatory +circumcise +circumcised +circumcises +circumcising +circumcision +circumcisions +circumference +circumferences +circumferential +circumflex +circumflexes +circumlocution +circumlocutions +circumnavigate +circumnavigated +circumnavigates +circumnavigating +circumnavigation +circumnavigations +circumpolar +circumscribe +circumscribed +circumscribes +circumscribing +circumscription +circumscriptions +circumspect +circumspection +circumspectly +circumstance +circumstanced +circumstances +circumstancing +circumstantial +circumstantially +circumvent +circumvented +circumventing +circumvention +circumvents +circus +circuses +cirque +cirques +cirrhosis +cirrhotic +cirrhotics +cirrus +cistern +cisterns +citadel +citadels +citation +citations +cite +cited +cites +cities +citified +citing +citizen +citizenry +citizens +citizenship +citric +citron +citronella +citrons +citrous +citrus +citruses +city +civet +civets +civic +civically +civics +civies +civil +civilian +civilians +civilisation +civilisations +civilise +civilised +civilises +civilising +civilities +civility +civilization +civilizations +civilize +civilized +civilizes +civilizing +civilly +civvies +clack +clacked +clacking +clacks +clad +cladding +claim +claimable +claimant +claimants +claimed +claimer +claimers +claiming +claims +clairvoyance +clairvoyant +clairvoyants +clam +clambake +clambakes +clamber +clambered +clamberer +clamberers +clambering +clambers +clammed +clammier +clammiest +clammily +clamminess +clamming +clammy +clamor +clamored +clamoring +clamorous +clamors +clamour +clamoured +clamouring +clamours +clamp +clampdown +clampdowns +clamped +clamping +clamps +clams +clan +clandestine +clandestinely +clang +clanged +clanging +clangor +clangorous +clangorously +clangour +clangs +clank +clanked +clanking +clanks +clannish +clannishness +clans +clansman +clansmen +clap +clapboard +clapboarded +clapboarding +clapboards +clapped +clapper +clappers +clapping +claps +claptrap +claque +claques +claret +clarets +clarification +clarifications +clarified +clarifies +clarify +clarifying +clarinet +clarinetist +clarinetists +clarinets +clarinettist +clarinettists +clarion +clarions +clarity +clash +clashed +clashes +clashing +clasp +clasped +clasping +clasps +class +classed +classes +classic +classical +classically +classicism +classicist +classicists +classics +classier +classiest +classifiable +classification +classifications +classified +classifieds +classifier +classifiers +classifies +classify +classifying +classiness +classing +classless +classmate +classmates +classroom +classrooms +classwork +classy +clatter +clattered +clattering +clatters +clausal +clause +clauses +claustrophobia +claustrophobic +clavichord +clavichords +clavicle +clavicles +clavier +claviers +claw +clawed +clawing +claws +clay +clayey +clayier +clayiest +clean +cleanable +cleaned +cleaner +cleaners +cleanest +cleaning +cleanings +cleanlier +cleanliest +cleanliness +cleanly +cleanness +cleans +cleanse +cleansed +cleanser +cleansers +cleanses +cleansing +cleanup +cleanups +clear +clearance +clearances +cleared +clearer +clearest +clearheaded +clearing +clearinghouse +clearinghouses +clearings +clearly +clearness +clears +cleat +cleats +cleavage +cleavages +cleave +cleaved +cleaver +cleavers +cleaves +cleaving +clef +clefs +cleft +clefts +clematis +clematises +clemency +clement +clemently +clench +clenched +clenches +clenching +clerestories +clerestory +clergies +clergy +clergyman +clergymen +clergywoman +clergywomen +cleric +clerical +clericalism +clerically +clerics +clerk +clerked +clerking +clerks +clerkship +clever +cleverer +cleverest +cleverly +cleverness +clevis +clevises +clew +clewed +clewing +clews +cliche +cliched +cliches +click +clicked +clicker +clickers +clicking +clicks +client +clientele +clienteles +clients +cliff +cliffhanger +cliffhangers +cliffs +climacteric +climactic +climate +climates +climatic +climatically +climatologist +climatologists +climatology +climax +climaxed +climaxes +climaxing +climb +climbable +climbed +climber +climbers +climbing +climbs +clime +climes +clinch +clinched +clincher +clinchers +clinches +clinching +cling +clinger +clingers +clingier +clingiest +clinging +clings +clingy +clinic +clinical +clinically +clinician +clinicians +clinics +clink +clinked +clinker +clinkers +clinking +clinks +cliometric +cliometrician +cliometricians +cliometrics +clip +clipboard +clipboards +clipped +clipper +clippers +clipping +clippings +clips +clipt +clique +cliques +cliquey +cliquier +cliquiest +cliquish +cliquishly +cliquishness +clitoral +clitorides +clitoris +clitorises +cloaca +cloacae +cloacas +cloak +cloaked +cloaking +cloakroom +cloakrooms +cloaks +clobber +clobbered +clobbering +clobbers +cloche +cloches +clock +clocked +clocking +clocks +clockwise +clockwork +clockworks +clod +cloddish +clodhopper +clodhoppers +clods +clog +clogged +clogging +clogs +cloisonne +cloister +cloistered +cloistering +cloisters +cloistral +clomp +clomped +clomping +clomps +clonal +clone +cloned +clones +cloning +clonk +clonked +clonking +clonks +clop +clopped +clopping +clops +close +closed +closefisted +closely +closemouthed +closeness +closeout +closeouts +closer +closes +closest +closet +closeted +closeting +closets +closeup +closeups +closing +closings +closure +closures +clot +cloth +clothe +clothed +clothes +clotheshorse +clotheshorses +clothesline +clotheslines +clothespin +clothespins +clothier +clothiers +clothing +cloths +clots +clotted +clotting +cloture +clotures +cloud +cloudburst +cloudbursts +clouded +cloudier +cloudiest +cloudiness +clouding +cloudless +clouds +cloudy +clout +clouted +clouting +clouts +clove +cloven +clover +cloverleaf +cloverleafs +cloverleaves +clovers +cloves +clown +clowned +clowning +clownish +clownishly +clownishness +clowns +cloy +cloyed +cloying +cloys +club +clubbed +clubbing +clubfeet +clubfoot +clubfooted +clubhouse +clubhouses +clubs +cluck +clucked +clucking +clucks +clue +clued +clueing +clueless +clues +cluing +clump +clumped +clumpier +clumpiest +clumping +clumps +clumpy +clumsier +clumsiest +clumsily +clumsiness +clumsy +clung +clunk +clunked +clunker +clunkers +clunkier +clunkiest +clunking +clunks +clunky +cluster +clustered +clustering +clusters +clutch +clutched +clutches +clutching +clutter +cluttered +cluttering +clutters +cnidarian +cnidarians +coach +coached +coaches +coaching +coachman +coachmen +coadjutor +coadjutors +coagulant +coagulants +coagulate +coagulated +coagulates +coagulating +coagulation +coagulator +coagulators +coal +coaled +coalesce +coalesced +coalescence +coalescent +coalesces +coalescing +coalface +coalfaces +coaling +coalition +coalitionist +coalitionists +coalitions +coals +coarse +coarsely +coarsen +coarsened +coarseness +coarsening +coarsens +coarser +coarsest +coast +coastal +coasted +coaster +coasters +coasting +coastline +coastlines +coasts +coat +coated +coating +coatings +coats +coattail +coattails +coauthor +coauthored +coauthoring +coauthors +coax +coaxed +coaxer +coaxers +coaxes +coaxial +coaxing +coaxingly +cobalt +cobble +cobbled +cobbler +cobblers +cobbles +cobblestone +cobblestones +cobbling +cobra +cobras +cobs +cobweb +cobwebbier +cobwebbiest +cobwebby +cobwebs +coca +cocain +cocaine +cocci +coccus +coccyges +coccyx +coccyxes +cochineal +cochlea +cochleae +cochlear +cochleas +cock +cockade +cockades +cockamamie +cockatoo +cockatoos +cockatrice +cockatrices +cockcrow +cockcrows +cocked +cockerel +cockerels +cockeyed +cockfight +cockfighting +cockfights +cockier +cockiest +cockily +cockiness +cocking +cockle +cockles +cockleshell +cockleshells +cockney +cockneys +cockpit +cockpits +cockroach +cockroaches +cocks +cockscomb +cockscombs +cocksucker +cocksuckers +cocksure +cocktail +cocktails +cocky +coco +cocoa +cocoanut +cocoanuts +cocoas +coconut +coconuts +cocoon +cocooned +cocooning +cocoons +cocos +coda +codas +coddle +coddled +coddles +coddling +code +coded +codeine +codependency +codependent +codependents +coder +coders +codes +codex +codfish +codfishes +codger +codgers +codices +codicil +codicils +codification +codifications +codified +codifier +codifiers +codifies +codify +codifying +coding +codpiece +codpieces +cods +coed +coeds +coeducation +coeducational +coefficient +coefficients +coelenterate +coelenterates +coequal +coequally +coequals +coerce +coerced +coercer +coercers +coerces +coercing +coercion +coercive +coeval +coevally +coevals +coexist +coexisted +coexistence +coexistent +coexisting +coexists +coextensive +coffee +coffeecake +coffeecakes +coffeehouse +coffeehouses +coffeemaker +coffeemakers +coffeepot +coffeepots +coffees +coffer +cofferdam +cofferdams +coffers +coffin +coffined +coffining +coffins +cogency +cogent +cogently +cogitate +cogitated +cogitates +cogitating +cogitation +cogitative +cogitator +cogitators +cognac +cognacs +cognate +cognates +cognition +cognitional +cognitive +cognitively +cognizable +cognizance +cognizant +cognomen +cognomens +cognomina +cognoscente +cognoscenti +cogs +cogwheel +cogwheels +cohabit +cohabitant +cohabitants +cohabitation +cohabited +cohabiting +cohabits +coheir +coheirs +cohere +cohered +coherence +coherency +coherent +coherently +coheres +cohering +cohesion +cohesive +cohesively +cohesiveness +coho +cohort +cohorts +cohos +coif +coifed +coiffed +coiffing +coiffure +coiffured +coiffures +coiffuring +coifing +coifs +coil +coiled +coiling +coils +coin +coinage +coinages +coincide +coincided +coincidence +coincidences +coincident +coincidental +coincidentally +coincides +coinciding +coined +coiner +coiners +coining +coins +coinsurance +coital +coitus +coke +coked +cokes +coking +cola +colander +colanders +colas +cold +coldblooded +colder +coldest +coldly +coldness +colds +coleslaw +coleus +coleuses +colic +colicky +coliseum +coliseums +colitis +collaborate +collaborated +collaborates +collaborating +collaboration +collaborations +collaborative +collaborator +collaborators +collage +collages +collapse +collapsed +collapses +collapsible +collapsing +collar +collarbone +collarbones +collard +collards +collared +collaring +collarless +collars +collate +collated +collateral +collateralize +collateralized +collateralizes +collateralizing +collaterally +collates +collating +collation +collations +collator +collators +colleague +colleagues +collect +collectable +collectables +collected +collectedly +collectible +collectibles +collecting +collection +collections +collective +collectively +collectives +collectivism +collectivist +collectivists +collectivization +collectivize +collectivized +collectivizes +collectivizing +collector +collectors +collects +colleen +colleens +college +colleges +collegiality +collegian +collegians +collegiate +collide +collided +collides +colliding +collie +collier +collieries +colliers +colliery +collies +collision +collisions +collocate +collocated +collocates +collocating +collocation +collocations +colloid +colloidal +colloids +colloquia +colloquial +colloquialism +colloquialisms +colloquially +colloquies +colloquium +colloquiums +colloquy +collude +colluded +colludes +colluding +collusion +collusive +cologne +colognes +colon +colonel +colonelcy +colonels +colones +colonial +colonialism +colonialist +colonialists +colonially +colonials +colonies +colonist +colonists +colonization +colonize +colonized +colonizer +colonizers +colonizes +colonizing +colonnade +colonnaded +colonnades +colons +colony +colophon +colophons +color +colorant +colorants +coloration +coloratura +coloraturas +colorblind +colorblindness +colored +coloreds +colorfast +colorfastness +colorful +colorfully +colorfulness +coloring +colorization +colorize +colorized +colorizes +colorizing +colorless +colorlessly +colorlessness +colors +colossal +colossally +colossi +colossus +colossuses +colostomies +colostomy +colostrum +colour +coloured +colouring +colours +colt +coltish +colts +columbine +columbines +column +columnar +columned +columnist +columnists +columns +coma +comaker +comakers +comas +comatose +comb +combat +combatant +combatants +combated +combating +combative +combativeness +combats +combatted +combatting +combed +comber +combers +combination +combinations +combine +combined +combiner +combiners +combines +combing +combings +combining +combo +combos +combs +combustibility +combustible +combustibles +combustion +combustive +come +comeback +comebacks +comedian +comedians +comedic +comedienne +comediennes +comedies +comedown +comedowns +comedy +comelier +comeliest +comeliness +comely +comer +comers +comes +comestible +comestibles +comet +comets +comeuppance +comeuppances +comfier +comfiest +comfit +comfits +comfort +comfortable +comfortableness +comfortably +comforted +comforter +comforters +comforting +comfortingly +comforts +comfy +comic +comical +comicality +comically +comics +coming +comings +comity +comma +command +commandant +commandants +commanded +commandeer +commandeered +commandeering +commandeers +commander +commanders +commanding +commandment +commandments +commando +commandoes +commandos +commands +commas +commemorate +commemorated +commemorates +commemorating +commemoration +commemorations +commemorative +commemorator +commemorators +commence +commenced +commencement +commencements +commences +commencing +commend +commendable +commendably +commendation +commendations +commendatory +commended +commending +commends +commensurable +commensurate +commensurately +comment +commentaries +commentary +commentate +commentated +commentates +commentating +commentator +commentators +commented +commenting +comments +commerce +commercial +commercialism +commercialization +commercialize +commercialized +commercializes +commercializing +commercially +commercials +commie +commies +commingle +commingled +commingles +commingling +commiserate +commiserated +commiserates +commiserating +commiseration +commiserations +commiserative +commissar +commissariat +commissariats +commissaries +commissars +commissary +commission +commissioned +commissioner +commissioners +commissioning +commissions +commit +commitment +commitments +commits +committal +committals +committed +committee +committeeman +committeemen +committees +committeewoman +committeewomen +committing +commode +commodes +commodious +commodiously +commodities +commodity +commodore +commodores +common +commonalty +commoner +commoners +commonest +commonly +commonness +commonplace +commonplaces +commons +commonsense +commonweal +commonwealth +commonwealths +commotion +commotions +communal +communally +commune +communed +communes +communicability +communicable +communicably +communicant +communicants +communicate +communicated +communicates +communicating +communication +communications +communicative +communicator +communicators +communing +communion +communions +communique +communiques +communism +communist +communistic +communists +communities +community +commutable +commutation +commutations +commutative +commutator +commutators +commute +commuted +commuter +commuters +commutes +commuting +comp +compact +compacted +compacter +compactest +compacting +compactly +compactness +compactor +compactors +compacts +companies +companion +companionable +companionably +companions +companionship +companionway +companionways +company +comparability +comparable +comparably +comparative +comparatively +comparatives +compare +compared +compares +comparing +comparison +comparisons +compartment +compartmental +compartmentalization +compartmentalize +compartmentalized +compartmentalizes +compartmentalizing +compartments +compass +compassed +compasses +compassing +compassion +compassionate +compassionately +compatibility +compatible +compatibles +compatibly +compatriot +compatriots +comped +compeer +compeers +compel +compelled +compelling +compellingly +compels +compendia +compendious +compendium +compendiums +compensate +compensated +compensates +compensating +compensation +compensations +compensatory +compete +competed +competence +competences +competencies +competency +competent +competently +competes +competing +competition +competitions +competitive +competitively +competitiveness +competitor +competitors +compilation +compilations +compile +compiled +compiler +compilers +compiles +compiling +comping +complacence +complacency +complacent +complacently +complain +complainant +complainants +complained +complainer +complainers +complaining +complains +complaint +complaints +complaisance +complaisant +complaisantly +complected +complement +complementary +complemented +complementing +complements +complete +completed +completely +completeness +completer +completes +completest +completing +completion +complex +complexes +complexion +complexional +complexioned +complexions +complexities +complexity +complexly +compliance +compliant +compliantly +complicate +complicated +complicatedly +complicates +complicating +complication +complications +complicit +complicity +complied +complies +compliment +complimentary +complimented +complimenting +compliments +comply +complying +component +components +comport +comported +comporting +comportment +comports +compose +composed +composedly +composer +composers +composes +composing +composite +compositely +composites +composition +compositions +compositor +compositors +compost +composted +composting +composts +composure +compote +compotes +compound +compoundable +compounded +compounding +compounds +comprehend +comprehended +comprehending +comprehends +comprehensibility +comprehensible +comprehensibly +comprehension +comprehensions +comprehensive +comprehensively +comprehensiveness +comprehensives +compress +compressed +compresses +compressible +compressing +compression +compressor +compressors +comprise +comprised +comprises +comprising +compromise +compromised +compromises +compromising +comps +comptroller +comptrollers +compulsion +compulsions +compulsive +compulsively +compulsiveness +compulsories +compulsorily +compulsory +compunction +compunctions +computation +computational +computations +compute +computed +computer +computerization +computerize +computerized +computerizes +computerizing +computers +computes +computing +comrade +comradely +comrades +comradeship +concatenate +concatenated +concatenates +concatenating +concatenation +concatenations +concave +concavely +concaveness +concavities +concavity +conceal +concealable +concealed +concealer +concealers +concealing +concealment +conceals +concede +conceded +concedes +conceding +conceit +conceited +conceitedly +conceitedness +conceits +conceivable +conceivably +conceive +conceived +conceives +conceiving +concentrate +concentrated +concentrates +concentrating +concentration +concentrations +concentric +concentrically +concept +conception +conceptional +conceptions +concepts +conceptual +conceptualization +conceptualizations +conceptualize +conceptualized +conceptualizes +conceptualizing +conceptually +concern +concerned +concerning +concerns +concert +concerted +concertedly +concerti +concertina +concertinaed +concertinaing +concertinas +concerting +concertize +concertized +concertizes +concertizing +concertmaster +concertmasters +concerto +concertos +concerts +concession +concessionaire +concessionaires +concessional +concessionary +concessions +conch +conches +conchs +concierge +concierges +conciliate +conciliated +conciliates +conciliating +conciliation +conciliator +conciliators +conciliatory +concise +concisely +conciseness +conciser +concisest +concision +conclave +conclaves +conclude +concluded +concludes +concluding +conclusion +conclusions +conclusive +conclusively +conclusiveness +concoct +concocted +concocting +concoction +concoctions +concocts +concomitant +concomitantly +concomitants +concord +concordance +concordances +concordant +concordat +concordats +concourse +concourses +concrete +concreted +concretely +concreteness +concretes +concreting +concretion +concretions +concubinage +concubine +concubines +concupiscence +concupiscent +concur +concurred +concurrence +concurrences +concurrent +concurrently +concurring +concurs +concuss +concussed +concusses +concussing +concussion +concussions +concussive +condemn +condemnation +condemnations +condemnatory +condemned +condemner +condemners +condemning +condemns +condensate +condensates +condensation +condensations +condense +condensed +condenser +condensers +condenses +condensing +condescend +condescended +condescending +condescendingly +condescends +condescension +condign +condiment +condiments +condition +conditional +conditionally +conditionals +conditioned +conditioner +conditioners +conditioning +conditions +condo +condoes +condole +condoled +condolence +condolences +condoles +condoling +condom +condominium +condominiums +condoms +condone +condoned +condones +condoning +condor +condors +condos +conduce +conduced +conduces +conducing +conducive +conduct +conductance +conducted +conductibility +conductible +conducting +conduction +conductive +conductivity +conductor +conductors +conductress +conductresses +conducts +conduit +conduits +cone +cones +coney +coneys +confab +confabbed +confabbing +confabs +confabulate +confabulated +confabulates +confabulating +confabulation +confabulations +confection +confectioner +confectioneries +confectioners +confectionery +confections +confederacies +confederacy +confederate +confederated +confederates +confederating +confederation +confederations +confer +conferee +conferees +conference +conferences +conferment +conferments +conferrable +conferral +conferred +conferrer +conferrers +conferring +confers +confess +confessed +confessedly +confesses +confessing +confession +confessional +confessionals +confessions +confessor +confessors +confetti +confidant +confidante +confidantes +confidants +confide +confided +confidence +confidences +confident +confidential +confidentiality +confidentially +confidently +confider +confiders +confides +confiding +configuration +configurations +configure +configured +configures +configuring +confine +confined +confinement +confinements +confines +confining +confirm +confirmation +confirmations +confirmed +confirming +confirms +confiscate +confiscated +confiscates +confiscating +confiscation +confiscations +confiscator +confiscators +confiscatory +conflagration +conflagrations +conflate +conflated +conflates +conflating +conflation +conflations +conflict +conflicted +conflicting +conflicts +confluence +confluences +confluent +conform +conformable +conformance +conformation +conformations +conformed +conformer +conformers +conforming +conformism +conformist +conformists +conformity +conforms +confound +confounded +confounding +confounds +confraternities +confraternity +confrere +confreres +confront +confrontation +confrontational +confrontations +confronted +confronting +confronts +confuse +confused +confusedly +confuses +confusing +confusingly +confusion +confutation +confute +confuted +confutes +confuting +conga +congaed +congaing +congas +congeal +congealed +congealing +congealment +congeals +congenial +congeniality +congenially +congenital +congenitally +conger +congeries +congers +congest +congested +congesting +congestion +congestive +congests +conglomerate +conglomerated +conglomerates +conglomerating +conglomeration +conglomerations +congrats +congratulate +congratulated +congratulates +congratulating +congratulation +congratulations +congratulatory +congregant +congregants +congregate +congregated +congregates +congregating +congregation +congregational +congregationalism +congregationalist +congregationalists +congregations +congress +congresses +congressional +congressman +congressmen +congressperson +congresspersons +congresswoman +congresswomen +congruence +congruent +congruently +congruities +congruity +congruous +conic +conical +conically +conics +conies +conifer +coniferous +conifers +conjectural +conjecture +conjectured +conjectures +conjecturing +conjoin +conjoined +conjoiner +conjoiners +conjoining +conjoins +conjoint +conjointly +conjugal +conjugally +conjugate +conjugated +conjugates +conjugating +conjugation +conjugations +conjunct +conjunction +conjunctions +conjunctiva +conjunctivae +conjunctivas +conjunctive +conjunctives +conjunctivitis +conjuncts +conjuncture +conjunctures +conjuration +conjurations +conjure +conjured +conjurer +conjurers +conjures +conjuring +conjuror +conjurors +conk +conked +conking +conks +conman +conmen +connect +connectable +connected +connecter +connecters +connectible +connecting +connection +connections +connective +connectives +connectivity +connector +connectors +connects +conned +connexion +connexions +conning +conniption +conniptions +connivance +connive +connived +conniver +connivers +connives +conniving +connoisseur +connoisseurs +connotation +connotations +connotative +connote +connoted +connotes +connoting +connubial +conquer +conquerable +conquered +conquering +conqueror +conquerors +conquers +conquest +conquests +conquistador +conquistadores +conquistadors +cons +consanguineous +consanguinity +conscience +conscienceless +consciences +conscientious +conscientiously +conscientiousness +conscious +consciously +consciousness +consciousnesses +conscript +conscripted +conscripting +conscription +conscripts +consecrate +consecrated +consecrates +consecrating +consecration +consecrations +consecutive +consecutively +consensual +consensus +consensuses +consent +consented +consenting +consents +consequence +consequences +consequent +consequential +consequentially +consequently +conservancies +conservancy +conservation +conservationism +conservationist +conservationists +conservatism +conservative +conservatively +conservatives +conservator +conservatories +conservators +conservatory +conserve +conserved +conserves +conserving +consider +considerable +considerably +considerate +considerately +considerateness +consideration +considerations +considered +considering +considers +consign +consigned +consignee +consignees +consigning +consignment +consignments +consignor +consignors +consigns +consist +consisted +consistence +consistences +consistencies +consistency +consistent +consistently +consisting +consistories +consistory +consists +consolable +consolation +consolations +consolatory +console +consoled +consoles +consolidate +consolidated +consolidates +consolidating +consolidation +consolidations +consolidator +consolidators +consoling +consolingly +consomme +consonance +consonances +consonant +consonantly +consonants +consort +consorted +consortia +consorting +consortium +consortiums +consorts +conspectus +conspectuses +conspicuous +conspicuously +conspicuousness +conspiracies +conspiracy +conspirator +conspiratorial +conspiratorially +conspirators +conspire +conspired +conspires +conspiring +constable +constables +constabularies +constabulary +constancy +constant +constantly +constants +constellation +constellations +consternation +constipate +constipated +constipates +constipating +constipation +constituencies +constituency +constituent +constituents +constitute +constituted +constitutes +constituting +constitution +constitutional +constitutionality +constitutionally +constitutionals +constitutions +constitutive +constrain +constrained +constraining +constrains +constraint +constraints +constrict +constricted +constricting +constriction +constrictions +constrictive +constrictor +constrictors +constricts +construable +construct +constructed +constructing +construction +constructional +constructionist +constructionists +constructions +constructive +constructively +constructiveness +constructor +constructors +constructs +construe +construed +construes +construing +consubstantiation +consul +consular +consulate +consulates +consuls +consulship +consult +consultancies +consultancy +consultant +consultants +consultation +consultations +consultative +consulted +consulting +consults +consumable +consumables +consume +consumed +consumer +consumerism +consumerist +consumerists +consumers +consumes +consuming +consummate +consummated +consummately +consummates +consummating +consummation +consummations +consumption +consumptive +consumptives +contact +contacted +contacting +contacts +contagion +contagions +contagious +contagiously +contagiousness +contain +containable +contained +container +containerization +containerize +containerized +containerizes +containerizing +containers +containing +containment +contains +contaminant +contaminants +contaminate +contaminated +contaminates +contaminating +contamination +contaminator +contaminators +contemn +contemned +contemning +contemns +contemplate +contemplated +contemplates +contemplating +contemplation +contemplative +contemplatives +contemporaneity +contemporaneous +contemporaneously +contemporaries +contemporary +contempt +contemptible +contemptibly +contemptuous +contemptuously +contemptuousness +contend +contended +contender +contenders +contending +contends +content +contented +contentedly +contentedness +contenting +contention +contentions +contentious +contentiously +contentiousness +contently +contentment +contents +conterminous +conterminously +contest +contestable +contestant +contestants +contested +contesting +contests +context +contexts +contextual +contextualize +contextualized +contextualizes +contextualizing +contextually +contiguity +contiguous +contiguously +continence +continent +continental +continentals +continents +contingencies +contingency +contingent +contingently +contingents +continua +continual +continually +continuance +continuances +continuation +continuations +continue +continued +continues +continuing +continuity +continuous +continuously +continuum +continuums +contort +contorted +contorting +contortion +contortionist +contortionists +contortions +contorts +contour +contoured +contouring +contours +contraband +contraception +contraceptive +contraceptives +contract +contracted +contractible +contractile +contracting +contraction +contractions +contractor +contractors +contracts +contractual +contractually +contradict +contradicted +contradicting +contradiction +contradictions +contradictory +contradicts +contradistinction +contradistinctions +contrail +contrails +contraindicate +contraindicated +contraindicates +contraindicating +contraindication +contraindications +contralto +contraltos +contraption +contraptions +contrapuntal +contrapuntally +contraries +contrariety +contrarily +contrariness +contrariwise +contrary +contrast +contrasted +contrasting +contrasts +contravene +contravened +contravenes +contravening +contravention +contraventions +contretemps +contribute +contributed +contributes +contributing +contribution +contributions +contributor +contributors +contributory +contrite +contritely +contriteness +contrition +contrivance +contrivances +contrive +contrived +contriver +contrivers +contrives +contriving +control +controllable +controlled +controller +controllers +controlling +controls +controversial +controversially +controversies +controversy +controvert +controverted +controvertible +controverting +controverts +contumacious +contumaciously +contumacy +contumelies +contumelious +contumely +contuse +contused +contuses +contusing +contusion +contusions +conundrum +conundrums +conurbation +conurbations +convalesce +convalesced +convalescence +convalescences +convalescent +convalescents +convalesces +convalescing +convection +convectional +convective +convene +convened +convener +conveners +convenes +convenience +conveniences +convenient +conveniently +convening +convent +conventicle +conventicles +convention +conventional +conventionality +conventionalize +conventionalized +conventionalizes +conventionalizing +conventionally +conventions +convents +converge +converged +convergence +convergences +convergent +converges +converging +conversant +conversation +conversational +conversationalist +conversationalists +conversationally +conversations +converse +conversed +conversely +converses +conversing +conversion +conversions +convert +converted +converter +converters +convertibility +convertible +convertibles +converting +convertor +convertors +converts +convex +convexity +convexly +convey +conveyable +conveyance +conveyances +conveyed +conveyer +conveyers +conveying +conveyor +conveyors +conveys +convict +convicted +convicting +conviction +convictions +convicts +convince +convinced +convinces +convincing +convincingly +convivial +conviviality +convivially +convocation +convocations +convoke +convoked +convokes +convoking +convoluted +convolution +convolutions +convoy +convoyed +convoying +convoys +convulse +convulsed +convulses +convulsing +convulsion +convulsions +convulsive +convulsively +cony +cooed +cooing +cook +cookbook +cookbooks +cooked +cooker +cookeries +cookers +cookery +cookie +cookies +cooking +cookout +cookouts +cooks +cookware +cookwares +cooky +cool +coolant +coolants +cooled +cooler +coolers +coolest +coolie +coolies +cooling +coolly +coolness +cools +coon +coons +coonskin +coonskins +coop +cooped +cooper +cooperage +cooperate +cooperated +cooperates +cooperating +cooperation +cooperative +cooperatively +cooperativeness +cooperatives +cooperator +cooperators +coopered +coopering +coopers +cooping +coops +coordinate +coordinated +coordinately +coordinates +coordinating +coordination +coordinator +coordinators +coos +coot +cootie +cooties +coots +copacetic +copay +cope +coped +copes +copied +copier +copiers +copies +copilot +copilots +coping +copings +copious +copiously +copiousness +copped +copper +copperhead +copperheads +copperplate +coppers +coppery +coppice +coppices +copping +copra +cops +copse +copses +copter +copters +copula +copulae +copulas +copulate +copulated +copulates +copulating +copulation +copulative +copulatives +copy +copybook +copybooks +copycat +copycats +copycatted +copycatting +copying +copyist +copyists +copyright +copyrighted +copyrighting +copyrights +copywriter +copywriters +coquetries +coquetry +coquette +coquetted +coquettes +coquetting +coquettish +coquettishly +coracle +coracles +coral +corals +corbel +corbels +cord +cordage +corded +cordial +cordiality +cordially +cordials +cordillera +cordilleras +cording +cordite +cordless +cordon +cordoned +cordoning +cordons +cordovan +cords +corduroy +corduroys +core +cored +corer +corers +cores +corespondent +corespondents +corgi +corgis +coriander +coring +cork +corked +corker +corkers +corking +corks +corkscrew +corkscrewed +corkscrewing +corkscrews +corm +cormorant +cormorants +corms +corn +cornball +cornballs +cornbread +corncob +corncobs +cornea +corneal +corneas +corned +corner +cornered +cornering +corners +cornerstone +cornerstones +cornet +cornets +cornflakes +cornflower +cornflowers +cornice +cornices +cornier +corniest +cornily +corniness +corning +cornmeal +cornrow +cornrowed +cornrowing +cornrows +corns +cornstalk +cornstalks +cornstarch +cornucopia +cornucopias +corny +corolla +corollaries +corollary +corollas +corona +coronae +coronal +coronals +coronaries +coronary +coronas +coronation +coronations +coroner +coroners +coronet +coronets +corpora +corporal +corporals +corporate +corporately +corporation +corporations +corporeal +corporeality +corporeally +corps +corpse +corpses +corpsman +corpsmen +corpulence +corpulent +corpus +corpuscle +corpuscles +corpuscular +corpuses +corral +corralled +corralling +corrals +correct +correctable +corrected +correcter +correctest +correcting +correction +correctional +corrections +corrective +correctives +correctly +correctness +corrects +correlate +correlated +correlates +correlating +correlation +correlations +correlative +correlatives +correspond +corresponded +correspondence +correspondences +correspondent +correspondents +corresponding +correspondingly +corresponds +corridor +corridors +corroborate +corroborated +corroborates +corroborating +corroboration +corroborations +corroborative +corroborator +corroborators +corroboratory +corrode +corroded +corrodes +corroding +corrosion +corrosive +corrosively +corrosives +corrugate +corrugated +corrugates +corrugating +corrugation +corrugations +corrupt +corrupted +corrupter +corruptest +corruptibility +corruptible +corrupting +corruption +corruptions +corruptly +corruptness +corrupts +corsage +corsages +corsair +corsairs +corset +corseted +corseting +corsets +cortege +corteges +cortex +cortexes +cortical +cortices +cortisone +corundum +coruscate +coruscated +coruscates +coruscating +coruscation +corvette +corvettes +cosier +cosies +cosiest +cosign +cosignatories +cosignatory +cosigned +cosigner +cosigners +cosigning +cosigns +cosily +cosine +cosines +cosiness +cosmetic +cosmetically +cosmetician +cosmeticians +cosmetics +cosmetologist +cosmetologists +cosmetology +cosmic +cosmically +cosmogonies +cosmogonist +cosmogonists +cosmogony +cosmological +cosmologies +cosmologist +cosmologists +cosmology +cosmonaut +cosmonauts +cosmopolitan +cosmopolitanism +cosmopolitans +cosmos +cosmoses +cosponsor +cosponsored +cosponsoring +cosponsors +cosset +cosseted +cosseting +cossets +cost +costar +costarred +costarring +costars +costed +costing +costlier +costliest +costliness +costly +costs +costume +costumed +costumer +costumers +costumes +costuming +cosy +cotangent +cotangents +cote +coterie +coteries +coterminous +cotes +cotillion +cotillions +cots +cottage +cottager +cottagers +cottages +cottar +cottars +cotter +cotters +cotton +cottoned +cottoning +cottonmouth +cottonmouths +cottons +cottonseed +cottonseeds +cottontail +cottontails +cottonwood +cottonwoods +cottony +cotyledon +cotyledons +couch +couched +couches +couching +cougar +cougars +cough +coughed +coughing +coughs +could +coulee +coulees +coulomb +coulombs +council +councillor +councillors +councilman +councilmen +councilor +councilors +councilperson +councilpersons +councils +councilwoman +councilwomen +counsel +counseled +counseling +counselled +counselling +counsellor +counsellors +counselor +counselors +counsels +count +countable +countdown +countdowns +counted +countenance +countenanced +countenances +countenancing +counter +counteract +counteracted +counteracting +counteraction +counteractions +counteractive +counteracts +counterattack +counterattacked +counterattacking +counterattacks +counterbalance +counterbalanced +counterbalances +counterbalancing +counterclaim +counterclaimed +counterclaiming +counterclaims +counterclockwise +counterculture +countered +counterespionage +counterfeit +counterfeited +counterfeiter +counterfeiters +counterfeiting +counterfeits +counterfoil +counterfoils +countering +counterinsurgencies +counterinsurgency +counterintelligence +counterman +countermand +countermanded +countermanding +countermands +countermeasure +countermeasures +countermen +counteroffensive +counteroffensives +counteroffer +counteroffered +counteroffering +counteroffers +counterpane +counterpanes +counterpart +counterparts +counterpoint +counterpoints +counterpoise +counterpoised +counterpoises +counterpoising +counterproductive +counterrevolution +counterrevolutionaries +counterrevolutionary +counterrevolutions +counters +countersank +countersign +countersignature +countersignatures +countersigned +countersigning +countersigns +countersink +countersinking +countersinks +counterspies +counterspy +countersunk +countertenor +countertenors +countervail +countervailed +countervailing +countervails +counterweight +counterweights +countess +countesses +counties +counting +countless +countries +countrified +country +countryman +countrymen +countryside +countrysides +countrywoman +countrywomen +counts +county +coup +coupe +coupes +couple +coupled +couples +couplet +couplets +coupling +couplings +coupon +coupons +coups +courage +courageous +courageously +courageousness +courier +couriered +couriering +couriers +course +coursed +courser +coursers +courses +coursing +court +courted +courteous +courteously +courteousness +courtesan +courtesans +courtesies +courtesy +courthouse +courthouses +courtier +courtiers +courting +courtlier +courtliest +courtliness +courtly +courtroom +courtrooms +courts +courtship +courtships +courtyard +courtyards +couscous +cousin +cousins +couture +couturier +couturiers +cove +coven +covenant +covenanted +covenanting +covenants +covens +cover +coverage +coverall +coveralls +covered +covering +coverings +coverlet +coverlets +covers +covert +covertly +covertness +coverts +coverup +coverups +coves +covet +coveted +coveting +covetous +covetously +covetousness +covets +covey +coveys +coward +cowardice +cowardliness +cowardly +cowards +cowbell +cowbells +cowbird +cowbirds +cowboy +cowboys +cowcatcher +cowcatchers +cowed +cower +cowered +cowering +cowers +cowgirl +cowgirls +cowhand +cowhands +cowherd +cowherds +cowhide +cowhides +cowing +cowl +cowlick +cowlicks +cowling +cowlings +cowls +cowman +cowmen +coworker +coworkers +cowpoke +cowpokes +cowpox +cowpuncher +cowpunchers +cowrie +cowries +cows +cowslip +cowslips +coxcomb +coxcombs +coxswain +coxswains +coyer +coyest +coyly +coyness +coyote +coyotes +coypu +coypus +cozen +cozenage +cozened +cozening +cozens +cozier +cozies +coziest +cozily +coziness +cozy +crab +crabbed +crabber +crabbers +crabbier +crabbiest +crabbily +crabbiness +crabbing +crabby +crabgrass +crablike +crabs +crack +crackdown +crackdowns +cracked +cracker +crackerjack +crackerjacks +crackers +crackhead +crackheads +cracking +crackle +crackled +crackles +crackling +cracklings +crackly +crackpot +crackpots +cracks +crackup +crackups +cradle +cradled +cradles +cradling +craft +crafted +craftier +craftiest +craftily +craftiness +crafting +crafts +craftsman +craftsmanship +craftsmen +craftswoman +craftswomen +crafty +crag +craggier +craggiest +cragginess +craggy +crags +cram +crammed +cramming +cramp +cramped +cramping +crampon +crampons +cramps +crams +cranberries +cranberry +crane +craned +cranes +crania +cranial +craning +cranium +craniums +crank +crankcase +crankcases +cranked +crankier +crankiest +crankily +crankiness +cranking +cranks +crankshaft +crankshafts +cranky +crannied +crannies +cranny +crap +crape +crapes +crapped +crappie +crappier +crappies +crappiest +crapping +crappy +craps +crapshooter +crapshooters +crash +crashed +crashes +crashing +crass +crasser +crassest +crassly +crassness +crate +crated +crater +cratered +cratering +craters +crates +crating +cravat +cravats +crave +craved +craven +cravenly +cravenness +cravens +craves +craving +cravings +craw +crawdad +crawdads +crawfish +crawfishes +crawl +crawled +crawler +crawlers +crawlier +crawlies +crawliest +crawling +crawls +crawlspace +crawlspaces +crawly +craws +crayfish +crayfishes +crayon +crayoned +crayoning +crayons +craze +crazed +crazes +crazier +crazies +craziest +crazily +craziness +crazing +crazy +creak +creaked +creakier +creakiest +creakily +creakiness +creaking +creaks +creaky +cream +creamed +creamer +creameries +creamers +creamery +creamier +creamiest +creamily +creaminess +creaming +creams +creamy +crease +creased +creases +creasing +create +created +creates +creating +creation +creationism +creationist +creationists +creations +creative +creatively +creativeness +creatives +creativity +creator +creators +creature +creatures +creche +creches +credence +credential +credentials +credenza +credenzas +credibility +credible +credibly +credit +creditable +creditably +credited +crediting +creditor +creditors +credits +credo +credos +credulity +credulous +credulously +credulousness +creed +creeds +creek +creeks +creel +creels +creep +creeped +creeper +creepers +creepier +creepiest +creepily +creepiness +creeping +creeps +creepy +cremains +cremate +cremated +cremates +cremating +cremation +cremations +crematoria +crematories +crematorium +crematoriums +crematory +creme +cremes +crenelate +crenelated +crenelates +crenelating +crenelation +crenelations +crenellate +crenellated +crenellates +crenellating +crenellation +crenellations +creole +creoles +creosote +creosoted +creosotes +creosoting +crepe +crepes +crept +crescendi +crescendo +crescendos +crescent +crescents +cress +crest +crested +crestfallen +cresting +crestless +crests +cretaceous +cretin +cretinism +cretinous +cretins +cretonne +crevasse +crevasses +crevice +crevices +crew +crewed +crewel +crewelwork +crewing +crewman +crewmen +crews +crib +cribbage +cribbed +cribber +cribbers +cribbing +cribs +crick +cricked +cricket +cricketer +cricketers +crickets +cricking +cricks +cried +crier +criers +cries +crime +crimes +criminal +criminality +criminally +criminals +criminologist +criminologists +criminology +crimp +crimped +crimping +crimps +crimson +crimsoned +crimsoning +crimsons +cringe +cringed +cringes +cringing +crinkle +crinkled +crinkles +crinklier +crinkliest +crinkling +crinkly +crinoline +crinolines +cripple +crippled +crippler +cripplers +cripples +crippling +crises +crisis +crisp +crisped +crisper +crispest +crispier +crispiest +crispiness +crisping +crisply +crispness +crisps +crispy +crisscross +crisscrossed +crisscrosses +crisscrossing +criteria +criterion +criterions +critic +critical +critically +criticism +criticisms +criticize +criticized +criticizer +criticizers +criticizes +criticizing +critics +critique +critiqued +critiques +critiquing +critter +critters +croak +croaked +croakier +croakiest +croaking +croaks +croaky +crochet +crocheted +crocheter +crocheters +crocheting +crochets +croci +crock +crocked +crockery +crocks +crocodile +crocodiles +crocus +crocuses +croissant +croissants +crone +crones +cronies +crony +cronyism +crook +crooked +crookeder +crookedest +crookedly +crookedness +crooking +crookneck +crooknecks +crooks +croon +crooned +crooner +crooners +crooning +croons +crop +cropland +croplands +cropped +cropper +croppers +cropping +crops +croquet +croquette +croquettes +crosier +crosiers +cross +crossbar +crossbars +crossbeam +crossbeams +crossbones +crossbow +crossbowman +crossbowmen +crossbows +crossbred +crossbreed +crossbreeding +crossbreeds +crosscheck +crosschecked +crosschecking +crosschecks +crosscurrent +crosscurrents +crosscut +crosscuts +crosscutting +crossed +crosser +crosses +crossest +crossfire +crossfires +crosshatch +crosshatched +crosshatches +crosshatching +crossing +crossings +crossly +crossness +crossover +crossovers +crosspatch +crosspatches +crosspiece +crosspieces +crossroad +crossroads +crosstown +crosswalk +crosswalks +crossways +crosswind +crosswinds +crosswise +crossword +crosswords +crotch +crotches +crotchet +crotchets +crotchety +crouch +crouched +crouches +crouching +croup +croupier +croupiers +croupiest +croupy +crouton +croutons +crow +crowbar +crowbars +crowd +crowded +crowding +crowds +crowed +crowfeet +crowfoot +crowfoots +crowing +crown +crowned +crowning +crowns +crows +crozier +croziers +cruces +crucial +crucially +crucible +crucibles +crucified +crucifies +crucifix +crucifixes +crucifixion +crucifixions +cruciform +cruciforms +crucify +crucifying +crud +cruddier +cruddiest +cruddy +crude +crudely +crudeness +cruder +crudest +crudites +crudities +crudity +cruel +crueler +cruelest +crueller +cruellest +cruelly +cruelness +cruelties +cruelty +cruet +cruets +cruise +cruised +cruiser +cruisers +cruises +cruising +cruller +crullers +crumb +crumbed +crumbier +crumbiest +crumbing +crumble +crumbled +crumbles +crumblier +crumbliest +crumbliness +crumbling +crumbly +crumbs +crumby +crummier +crummiest +crumminess +crummy +crumpet +crumpets +crumple +crumpled +crumples +crumpling +crunch +crunched +crunches +crunchier +crunchiest +crunchiness +crunching +crunchy +crupper +cruppers +crusade +crusaded +crusader +crusaders +crusades +crusading +cruse +cruses +crush +crushed +crusher +crushers +crushes +crushing +crust +crustacean +crustaceans +crustal +crusted +crustier +crustiest +crustily +crustiness +crusting +crusts +crusty +crutch +crutches +crux +cruxes +crybabies +crybaby +crying +cryogenic +cryogenics +cryosurgery +crypt +cryptic +cryptically +cryptogram +cryptograms +cryptographer +cryptographers +cryptography +crypts +crystal +crystalline +crystallization +crystallize +crystallized +crystallizes +crystallizing +crystals +cubbyhole +cubbyholes +cube +cubed +cuber +cubers +cubes +cubic +cubical +cubicle +cubicles +cubing +cubism +cubist +cubists +cubit +cubits +cubs +cuckold +cuckolded +cuckolding +cuckoldry +cuckolds +cuckoo +cuckoos +cucumber +cucumbers +cuddle +cuddled +cuddles +cuddlier +cuddliest +cuddling +cuddly +cudgel +cudgeled +cudgeling +cudgelled +cudgelling +cudgels +cuds +cued +cueing +cues +cuff +cuffed +cuffing +cufflink +cufflinks +cuffs +cuing +cuisine +cuisines +culinary +cull +culled +cullender +cullenders +culling +culls +culminate +culminated +culminates +culminating +culmination +culminations +culotte +culottes +culpability +culpable +culpably +culprit +culprits +cult +cultism +cultist +cultists +cultivable +cultivatable +cultivate +cultivated +cultivates +cultivating +cultivation +cultivator +cultivators +cults +cultural +culturally +culture +cultured +cultures +culturing +culvert +culverts +cumber +cumbered +cumbering +cumbers +cumbersome +cumbersomeness +cumbrous +cumin +cummed +cummerbund +cummerbunds +cumming +cumquat +cumquats +cums +cumulative +cumulatively +cumuli +cumulonimbi +cumulonimbus +cumulonimbuses +cumulus +cuneiform +cunnilingus +cunning +cunninger +cunningest +cunningly +cunt +cunts +cupboard +cupboards +cupcake +cupcakes +cupful +cupfuls +cupid +cupidity +cupids +cupola +cupolaed +cupolas +cupped +cupping +cupric +cups +cupsful +curability +curable +curacies +curacy +curare +curate +curated +curates +curating +curative +curatives +curator +curatorial +curators +curb +curbed +curbing +curbs +curbstone +curbstones +curd +curdle +curdled +curdles +curdling +curds +cure +cured +curer +curers +cures +curettage +curfew +curfews +curia +curiae +curie +curies +curing +curio +curios +curiosities +curiosity +curious +curiously +curiousness +curium +curl +curled +curler +curlers +curlew +curlews +curlicue +curlicued +curlicues +curlicuing +curlier +curliest +curliness +curling +curls +curly +curlycue +curlycues +curmudgeon +curmudgeonly +curmudgeons +currant +currants +currencies +currency +current +currently +currents +curricula +curricular +curriculum +curriculums +curried +curries +curry +currycomb +currycombed +currycombing +currycombs +currying +curs +curse +cursed +cursedly +curses +cursing +cursive +cursively +cursor +cursorily +cursoriness +cursors +cursory +curst +curt +curtail +curtailed +curtailing +curtailment +curtailments +curtails +curtain +curtained +curtaining +curtains +curter +curtest +curtly +curtness +curtsey +curtseyed +curtseying +curtseys +curtsied +curtsies +curtsy +curtsying +curvaceous +curvaceousness +curvacious +curvature +curvatures +curve +curved +curves +curvier +curviest +curving +curvy +cushier +cushiest +cushion +cushioned +cushioning +cushions +cushy +cusp +cuspid +cuspidor +cuspidors +cuspids +cusps +cuss +cussed +cusses +cussing +custard +custards +custodial +custodian +custodians +custodianship +custody +custom +customarily +customary +customer +customers +customhouse +customhouses +customization +customize +customized +customizes +customizing +customs +cutaneous +cutaway +cutaways +cutback +cutbacks +cute +cutely +cuteness +cuter +cutesie +cutesier +cutesiest +cutest +cutesy +cuticle +cuticles +cutie +cuties +cutlas +cutlases +cutlass +cutlasses +cutler +cutlers +cutlery +cutlet +cutlets +cutoff +cutoffs +cutout +cutouts +cuts +cutter +cutters +cutthroat +cutthroats +cutting +cuttingly +cuttings +cuttlefish +cuttlefishes +cutup +cutups +cutworm +cutworms +cyan +cyanide +cybernetic +cybernetics +cyberpunk +cyberpunks +cyberspace +cyborg +cyborgs +cyclamen +cyclamens +cycle +cycled +cycles +cyclic +cyclical +cyclically +cycling +cyclist +cyclists +cyclometer +cyclometers +cyclone +cyclones +cyclonic +cyclopaedia +cyclopaedias +cyclopedia +cyclopedias +cyclopes +cyclops +cyclotron +cyclotrons +cyder +cyders +cygnet +cygnets +cylinder +cylinders +cylindrical +cymbal +cymbalist +cymbalists +cymbals +cynic +cynical +cynically +cynicism +cynics +cynosure +cynosures +cypher +cyphered +cyphering +cyphers +cypress +cypresses +cyst +cystic +cysts +cytologist +cytologists +cytology +cytoplasm +cytoplasmic +cytosine +czar +czarina +czarinas +czarist +czarists +czars +dabbed +dabber +dabbers +dabbing +dabble +dabbled +dabbler +dabblers +dabbles +dabbling +dabs +dace +daces +dacha +dachas +dachshund +dachshunds +dactyl +dactylic +dactylics +dactyls +dadaism +dadaist +dadaists +daddies +daddy +dado +dadoes +dados +dads +daemon +daemonic +daemons +daffier +daffiest +daffiness +daffodil +daffodils +daffy +daft +dafter +daftest +daftly +daftness +dagger +daggers +daguerreotype +daguerreotyped +daguerreotypes +daguerreotyping +dahlia +dahlias +dailies +dailiness +daily +daintier +dainties +daintiest +daintily +daintiness +dainty +daiquiri +daiquiris +dairies +dairy +dairying +dairymaid +dairymaids +dairyman +dairymen +dairywoman +dairywomen +dais +daises +daisies +daisy +dale +dales +dalliance +dalliances +dallied +dallier +dalliers +dallies +dally +dallying +dalmatian +dalmatians +damage +damageable +damaged +damages +damaging +damask +damasked +damasking +damasks +dame +dames +dammed +damming +dammit +damn +damnable +damnably +damnation +damndest +damned +damnedest +damning +damns +damp +damped +dampen +dampened +dampener +dampeners +dampening +dampens +damper +dampers +dampest +damping +damply +dampness +damps +dams +damsel +damselflies +damselfly +damsels +damson +damsons +dance +danced +dancer +dancers +dances +dancing +dandelion +dandelions +dander +dandier +dandies +dandiest +dandified +dandifies +dandify +dandifying +dandle +dandled +dandles +dandling +dandruff +dandy +dang +danged +danger +dangerous +dangerously +dangers +danging +dangle +dangled +dangler +danglers +dangles +dangling +dangs +danish +danishes +dank +danker +dankest +dankly +dankness +danseuse +danseuses +dapper +dapperer +dapperest +dapple +dappled +dapples +dappling +dare +dared +daredevil +daredevilry +daredevils +darer +darers +dares +daresay +daring +daringly +dark +darken +darkened +darkener +darkeners +darkening +darkens +darker +darkest +darkly +darkness +darkroom +darkrooms +darling +darlingest +darlings +darn +darned +darneder +darnedest +darner +darners +darning +darns +dart +dartboard +dartboards +darted +darter +darters +darting +darts +dash +dashboard +dashboards +dashed +dasher +dashers +dashes +dashiki +dashikis +dashing +dashingly +dastard +dastardliness +dastardly +dastards +data +databank +databanks +database +databases +date +dated +dateless +dateline +datelined +datelines +datelining +dater +daters +dates +dating +dative +datives +datum +daub +daubed +dauber +daubers +daubing +daubs +daughter +daughterly +daughters +daunt +daunted +daunting +dauntingly +dauntless +dauntlessly +dauntlessness +daunts +dauphin +dauphins +davenport +davenports +davit +davits +dawdle +dawdled +dawdler +dawdlers +dawdles +dawdling +dawn +dawned +dawning +dawns +daybed +daybeds +daybreak +daycare +daydream +daydreamed +daydreamer +daydreamers +daydreaming +daydreams +daydreamt +daylight +daylights +days +daytime +daze +dazed +dazedly +dazes +dazing +dazzle +dazzled +dazzler +dazzlers +dazzles +dazzling +dazzlingly +deacon +deaconess +deaconesses +deacons +deactivate +deactivated +deactivates +deactivating +deactivation +dead +deadbeat +deadbeats +deadbolt +deadbolts +deaden +deadened +deadening +deadens +deader +deadest +deadlier +deadliest +deadline +deadlines +deadliness +deadlock +deadlocked +deadlocking +deadlocks +deadly +deadpan +deadpanned +deadpanning +deadpans +deadweight +deadweights +deadwood +deaf +deafen +deafened +deafening +deafeningly +deafens +deafer +deafest +deafness +deal +dealer +dealers +dealership +dealerships +dealing +dealings +deals +dealt +dean +deaneries +deanery +deans +deanship +dear +dearer +dearest +dearie +dearies +dearly +dearness +dears +dearth +dearths +deary +death +deathbed +deathbeds +deathblow +deathblows +deathless +deathlessly +deathlike +deathly +deaths +deathtrap +deathtraps +deathwatch +deathwatches +debacle +debacles +debar +debark +debarkation +debarked +debarking +debarks +debarment +debarred +debarring +debars +debase +debased +debasement +debasements +debases +debasing +debatable +debate +debated +debater +debaters +debates +debating +debauch +debauched +debauchee +debauchees +debaucheries +debauchery +debauches +debauching +debenture +debentures +debilitate +debilitated +debilitates +debilitating +debilitation +debilities +debility +debit +debited +debiting +debits +debonair +debonaire +debonairly +debonairness +debouch +debouched +debouches +debouching +debrief +debriefed +debriefing +debriefings +debriefs +debris +debs +debt +debtor +debtors +debts +debug +debugged +debugging +debugs +debunk +debunked +debunking +debunks +debut +debutante +debutantes +debuted +debuting +debuts +decade +decadence +decadency +decadent +decadently +decadents +decades +decaf +decaffeinate +decaffeinated +decaffeinates +decaffeinating +decagon +decagons +decal +decals +decamp +decamped +decamping +decampment +decamps +decant +decanted +decanter +decanters +decanting +decants +decapitate +decapitated +decapitates +decapitating +decapitation +decapitations +decapitator +decapitators +decathlon +decathlons +decay +decayed +decaying +decays +decease +deceased +deceases +deceasing +decedent +decedents +deceit +deceitful +deceitfully +deceitfulness +deceits +deceive +deceived +deceiver +deceivers +deceives +deceiving +deceivingly +decelerate +decelerated +decelerates +decelerating +deceleration +decelerator +decelerators +decencies +decency +decennial +decennials +decent +decently +decentralization +decentralize +decentralized +decentralizes +decentralizing +deception +deceptions +deceptive +deceptively +deceptiveness +decibel +decibels +decidable +decide +decided +decidedly +decides +deciding +deciduous +deciliter +deciliters +decimal +decimals +decimate +decimated +decimates +decimating +decimation +decimeter +decimeters +decipher +decipherable +deciphered +deciphering +deciphers +decision +decisions +decisive +decisively +decisiveness +deck +decked +deckhand +deckhands +decking +decks +declaim +declaimed +declaimer +declaimers +declaiming +declaims +declamation +declamations +declamatory +declarable +declaration +declarations +declarative +declaratory +declare +declared +declarer +declarers +declares +declaring +declassification +declassified +declassifies +declassify +declassifying +declension +declensions +declination +decline +declined +decliner +decliners +declines +declining +declivities +declivity +decode +decoded +decoder +decoders +decodes +decoding +decolletage +decolletages +decollete +decolonization +decolonize +decolonized +decolonizes +decolonizing +decommission +decommissioned +decommissioning +decommissions +decompose +decomposed +decomposes +decomposing +decomposition +decompress +decompressed +decompresses +decompressing +decompression +decongestant +decongestants +deconstruction +deconstructions +decontaminate +decontaminated +decontaminates +decontaminating +decontamination +decontrol +decontrolled +decontrolling +decontrols +decor +decorate +decorated +decorates +decorating +decoration +decorations +decorative +decoratively +decorator +decorators +decorous +decorously +decorousness +decors +decorum +decoupage +decoupaged +decoupages +decoupaging +decoy +decoyed +decoying +decoys +decrease +decreased +decreases +decreasing +decreasingly +decree +decreed +decreeing +decrees +decrepit +decrepitude +decrescendi +decrescendo +decrescendos +decried +decries +decriminalization +decriminalize +decriminalized +decriminalizes +decriminalizing +decry +decrying +dedicate +dedicated +dedicates +dedicating +dedication +dedications +dedicator +dedicators +dedicatory +deduce +deduced +deduces +deducible +deducing +deduct +deducted +deductible +deductibles +deducting +deduction +deductions +deductive +deductively +deducts +deed +deeded +deeding +deeds +deejay +deejays +deem +deemed +deeming +deems +deep +deepen +deepened +deepening +deepens +deeper +deepest +deeply +deepness +deeps +deer +deers +deerskin +deescalate +deescalated +deescalates +deescalating +deescalation +deface +defaced +defacement +defacer +defacers +defaces +defacing +defalcate +defalcated +defalcates +defalcating +defalcation +defalcations +defamation +defamatory +defame +defamed +defamer +defamers +defames +defaming +default +defaulted +defaulter +defaulters +defaulting +defaults +defeat +defeated +defeater +defeaters +defeating +defeatism +defeatist +defeatists +defeats +defecate +defecated +defecates +defecating +defecation +defect +defected +defecting +defection +defections +defective +defectively +defectiveness +defectives +defector +defectors +defects +defence +defences +defend +defendant +defendants +defended +defender +defenders +defending +defends +defense +defensed +defenseless +defenselessly +defenselessness +defenses +defensible +defensibly +defensing +defensive +defensively +defensiveness +defer +deference +deferential +deferentially +deferment +deferments +deferral +deferrals +deferred +deferring +defers +deffer +deffest +defiance +defiant +defiantly +deficiencies +deficiency +deficient +deficit +deficits +defied +defies +defile +defiled +defilement +defiler +defilers +defiles +defiling +definable +define +defined +definer +definers +defines +defining +definite +definitely +definiteness +definition +definitions +definitive +definitively +deflate +deflated +deflates +deflating +deflation +deflationary +deflect +deflected +deflecting +deflection +deflections +deflective +deflector +deflectors +deflects +deflower +deflowered +deflowering +deflowers +defog +defogged +defogger +defoggers +defogging +defogs +defoliant +defoliants +defoliate +defoliated +defoliates +defoliating +defoliation +defoliator +defoliators +deforest +deforestation +deforested +deforesting +deforests +deform +deformation +deformations +deformed +deforming +deformities +deformity +deforms +defraud +defrauded +defrauder +defrauders +defrauding +defrauds +defray +defrayal +defrayed +defraying +defrays +defrock +defrocked +defrocking +defrocks +defrost +defrosted +defroster +defrosters +defrosting +defrosts +deft +defter +deftest +deftly +deftness +defunct +defuse +defused +defuses +defusing +defy +defying +degas +degases +degassed +degassing +degeneracy +degenerate +degenerated +degenerates +degenerating +degeneration +degenerative +degradable +degradation +degrade +degraded +degrades +degrading +degree +degrees +dehumanization +dehumanize +dehumanized +dehumanizes +dehumanizing +dehumidified +dehumidifier +dehumidifiers +dehumidifies +dehumidify +dehumidifying +dehydrate +dehydrated +dehydrates +dehydrating +dehydration +dehydrator +dehydrators +dehydrogenate +dehydrogenated +dehydrogenates +dehydrogenating +deice +deiced +deicer +deicers +deices +deicing +deification +deified +deifies +deify +deifying +deign +deigned +deigning +deigns +deism +deist +deistic +deists +deities +deity +deject +dejected +dejectedly +dejecting +dejection +dejects +delay +delayed +delayer +delayers +delaying +delays +delectable +delectably +delectation +delegate +delegated +delegates +delegating +delegation +delegations +delete +deleted +deleterious +deletes +deleting +deletion +deletions +delft +delftware +deli +deliberate +deliberated +deliberately +deliberateness +deliberates +deliberating +deliberation +deliberations +deliberative +delicacies +delicacy +delicate +delicately +delicateness +delicatessen +delicatessens +delicious +deliciously +deliciousness +delight +delighted +delightedly +delightful +delightfully +delighting +delights +delimit +delimitation +delimited +delimiting +delimits +delineate +delineated +delineates +delineating +delineation +delineations +delinquencies +delinquency +delinquent +delinquently +delinquents +deliquesce +deliquesced +deliquescent +deliquesces +deliquescing +deliria +delirious +deliriously +deliriousness +delirium +deliriums +delis +deliver +deliverance +delivered +deliverer +deliverers +deliveries +delivering +delivers +delivery +deliveryman +deliverymen +dell +dells +delouse +deloused +delouses +delousing +delphinia +delphinium +delphiniums +delta +deltas +delude +deluded +deludes +deluding +deluge +deluged +deluges +deluging +delusion +delusional +delusions +delusive +delusively +deluxe +delve +delved +delver +delvers +delves +delving +demagnetization +demagnetize +demagnetized +demagnetizes +demagnetizing +demagog +demagogic +demagogs +demagogue +demagoguery +demagogues +demagogy +demand +demanded +demanding +demands +demarcate +demarcated +demarcates +demarcating +demarcation +demean +demeaned +demeaning +demeanor +demeanour +demeans +demented +dementedly +dementia +demerit +demerits +demesne +demesnes +demigod +demigoddess +demigoddesses +demigods +demijohn +demijohns +demilitarization +demilitarize +demilitarized +demilitarizes +demilitarizing +demimondaine +demimondaines +demimonde +demise +demised +demises +demising +demitasse +demitasses +demo +demobilization +demobilize +demobilized +demobilizes +demobilizing +democracies +democracy +democrat +democratic +democratically +democratization +democratize +democratized +democratizes +democratizing +democrats +demode +demodulate +demodulated +demodulates +demodulating +demodulation +demographer +demographers +demographic +demographically +demographics +demography +demolish +demolished +demolishes +demolishing +demolition +demolitions +demon +demonetization +demonetize +demonetized +demonetizes +demonetizing +demoniac +demoniacal +demoniacally +demonic +demonologies +demonology +demons +demonstrable +demonstrably +demonstrate +demonstrated +demonstrates +demonstrating +demonstration +demonstrations +demonstrative +demonstratively +demonstrativeness +demonstratives +demonstrator +demonstrators +demoralization +demoralize +demoralized +demoralizes +demoralizing +demos +demote +demoted +demotes +demotic +demoting +demotion +demotions +demulcent +demulcents +demur +demure +demurely +demureness +demurer +demurest +demurral +demurrals +demurred +demurrer +demurrers +demurring +demurs +demystification +demystified +demystifies +demystify +demystifying +denationalize +denationalized +denationalizes +denationalizing +denature +denatured +denatures +denaturing +dendrite +dendrites +dengue +deniable +denial +denials +denied +denier +deniers +denies +denigrate +denigrated +denigrates +denigrating +denigration +denim +denims +denizen +denizens +denominate +denominated +denominates +denominating +denomination +denominational +denominations +denominator +denominators +denotation +denotations +denotative +denote +denoted +denotes +denoting +denouement +denouements +denounce +denounced +denouncement +denouncements +denounces +denouncing +dens +dense +densely +denseness +denser +densest +densities +density +dent +dental +dentally +dented +dentifrice +dentifrices +dentin +dentine +denting +dentist +dentistry +dentists +dentition +dents +denture +dentures +denuclearize +denuclearized +denuclearizes +denuclearizing +denudation +denude +denuded +denudes +denuding +denunciation +denunciations +deny +denying +deodorant +deodorants +deodorization +deodorize +deodorized +deodorizer +deodorizers +deodorizes +deodorizing +depart +departed +departing +department +departmental +departmentalization +departmentalize +departmentalized +departmentalizes +departmentalizing +departmentally +departments +departs +departure +departures +depend +dependability +dependable +dependably +dependance +dependant +dependants +depended +dependence +dependencies +dependency +dependent +dependently +dependents +depending +depends +depersonalize +depersonalized +depersonalizes +depersonalizing +depict +depicted +depicting +depiction +depictions +depicts +depilatories +depilatory +deplane +deplaned +deplanes +deplaning +deplete +depleted +depletes +depleting +depletion +deplorable +deplorably +deplore +deplored +deplores +deploring +deploy +deployed +deploying +deployment +deployments +deploys +depolarization +depolarize +depolarized +depolarizes +depolarizing +depoliticize +depoliticized +depoliticizes +depoliticizing +deponent +deponents +depopulate +depopulated +depopulates +depopulating +depopulation +deport +deportation +deportations +deported +deportee +deportees +deporting +deportment +deports +depose +deposed +deposes +deposing +deposit +deposited +depositing +deposition +depositions +depositor +depositories +depositors +depository +deposits +depot +depots +deprave +depraved +depraves +depraving +depravities +depravity +deprecate +deprecated +deprecates +deprecating +deprecation +deprecatory +depreciate +depreciated +depreciates +depreciating +depreciation +depredation +depredations +depress +depressant +depressants +depressed +depresses +depressing +depressingly +depression +depressions +depressive +depressives +depressor +depressors +depressurize +depressurized +depressurizes +depressurizing +deprivation +deprivations +deprive +deprived +deprives +depriving +deprogram +deprogramed +deprograming +deprogrammed +deprogramming +deprograms +depth +depths +deputation +deputations +depute +deputed +deputes +deputies +deputing +deputize +deputized +deputizes +deputizing +deputy +derail +derailed +derailing +derailleur +derailleurs +derailment +derailments +derails +derange +deranged +derangement +deranges +deranging +derbies +derby +deregulate +deregulated +deregulates +deregulating +deregulation +derelict +dereliction +derelicts +deride +derided +derides +deriding +derision +derisive +derisively +derisiveness +derisory +derivation +derivations +derivative +derivatives +derive +derived +derives +deriving +dermal +dermatitis +dermatological +dermatologist +dermatologists +dermatology +dermis +derogate +derogated +derogates +derogating +derogation +derogatorily +derogatory +derrick +derricks +derriere +derrieres +derringer +derringers +dervish +dervishes +desalinate +desalinated +desalinates +desalinating +desalination +desalinization +desalinize +desalinized +desalinizes +desalinizing +desalt +desalted +desalting +desalts +descant +descanted +descanting +descants +descend +descendant +descendants +descended +descendent +descendents +descending +descends +descent +descents +describable +describe +described +describer +describers +describes +describing +descried +descries +description +descriptions +descriptive +descriptively +descriptiveness +descry +descrying +desecrate +desecrated +desecrates +desecrating +desecration +desegregate +desegregated +desegregates +desegregating +desegregation +desensitization +desensitize +desensitized +desensitizes +desensitizing +desert +deserted +deserter +deserters +deserting +desertion +desertions +deserts +deserve +deserved +deservedly +deserves +deserving +deshabille +desiccant +desiccants +desiccate +desiccated +desiccates +desiccating +desiccation +desiccator +desiccators +desiderata +desideratum +design +designate +designated +designates +designating +designation +designations +designed +designer +designers +designing +designs +desirability +desirable +desirableness +desirably +desire +desired +desires +desiring +desirous +desist +desisted +desisting +desists +desk +desks +desktop +desktops +desolate +desolated +desolately +desolateness +desolates +desolating +desolation +despair +despaired +despairing +despairingly +despairs +despatch +despatched +despatches +despatching +desperado +desperadoes +desperados +desperate +desperately +desperateness +desperation +despicable +despicably +despise +despised +despises +despising +despite +despoil +despoiled +despoiler +despoilers +despoiling +despoilment +despoils +despoliation +despondence +despondency +despondent +despondently +despot +despotic +despotically +despotism +despots +dessert +desserts +destabilization +destabilize +destabilized +destabilizes +destabilizing +destination +destinations +destine +destined +destines +destinies +destining +destiny +destitute +destitution +destroy +destroyed +destroyer +destroyers +destroying +destroys +destruct +destructed +destructibility +destructible +destructing +destruction +destructive +destructively +destructiveness +destructs +desuetude +desultorily +desultory +detach +detachable +detached +detaches +detaching +detachment +detachments +detail +detailed +detailing +details +detain +detained +detainee +detainees +detaining +detainment +detains +detect +detectable +detected +detectible +detecting +detection +detective +detectives +detector +detectors +detects +detente +detentes +detention +detentions +deter +detergent +detergents +deteriorate +deteriorated +deteriorates +deteriorating +deterioration +determent +determinable +determinant +determinants +determinate +determination +determinations +determine +determined +determinedly +determiner +determiners +determines +determining +determinism +deterred +deterrence +deterrent +deterrents +deterring +deters +detest +detestable +detestably +detestation +detested +detesting +detests +dethrone +dethroned +dethronement +dethrones +dethroning +detonate +detonated +detonates +detonating +detonation +detonations +detonator +detonators +detour +detoured +detouring +detours +detox +detoxed +detoxes +detoxification +detoxified +detoxifies +detoxify +detoxifying +detoxing +detract +detracted +detracting +detraction +detractor +detractors +detracts +detriment +detrimental +detrimentally +detriments +detritus +deuce +deuces +deuterium +devaluation +devaluations +devalue +devalued +devalues +devaluing +devastate +devastated +devastates +devastating +devastatingly +devastation +devastator +devastators +develop +developed +developer +developers +developing +development +developmental +developmentally +developments +develops +deviance +deviancy +deviant +deviants +deviate +deviated +deviates +deviating +deviation +deviations +device +devices +devil +deviled +deviling +devilish +devilishly +devilishness +devilled +devilling +devilment +devilries +devilry +devils +deviltries +deviltry +devious +deviously +deviousness +devise +devised +devises +devising +devitalize +devitalized +devitalizes +devitalizing +devoid +devolution +devolve +devolved +devolves +devolving +devote +devoted +devotedly +devotee +devotees +devotes +devoting +devotion +devotional +devotionals +devotions +devour +devoured +devouring +devours +devout +devouter +devoutest +devoutly +devoutness +dewberries +dewberry +dewclaw +dewclaws +dewdrop +dewdrops +dewier +dewiest +dewiness +dewlap +dewlaps +dewy +dexterity +dexterous +dexterously +dexterousness +dextrose +dextrous +dhoti +dhotis +dhow +dhows +diabetes +diabetic +diabetics +diabolic +diabolical +diabolically +diacritic +diacritical +diacritics +diadem +diadems +diaereses +diaeresis +diagnose +diagnosed +diagnoses +diagnosing +diagnosis +diagnostic +diagnostically +diagnostician +diagnosticians +diagnostics +diagonal +diagonally +diagonals +diagram +diagramed +diagraming +diagrammatic +diagrammatically +diagrammed +diagramming +diagrams +dial +dialect +dialectal +dialectic +dialectical +dialectics +dialects +dialed +dialing +dialled +dialling +dialog +dialogs +dialogue +dialogues +dials +dialyses +dialysis +diameter +diameters +diametric +diametrical +diametrically +diamond +diamondback +diamondbacks +diamonds +diapason +diapasons +diaper +diapered +diapering +diapers +diaphanous +diaphragm +diaphragmatic +diaphragms +diaries +diarist +diarists +diarrhea +diarrhoea +diary +diaspora +diasporas +diastase +diastole +diastolic +diathermy +diatom +diatomic +diatoms +diatonic +diatribe +diatribes +dibble +dibbled +dibbles +dibbling +dibs +dice +diced +dices +dicey +dichotomies +dichotomous +dichotomy +dicier +diciest +dicing +dick +dicker +dickered +dickering +dickers +dickey +dickeys +dickies +dicks +dicky +dicotyledon +dicotyledonous +dicotyledons +dicta +dictate +dictated +dictates +dictating +dictation +dictations +dictator +dictatorial +dictatorially +dictators +dictatorship +dictatorships +diction +dictionaries +dictionary +dictum +dictums +didactic +didactically +diddle +diddled +diddler +diddlers +diddles +diddling +dido +didoes +didos +didst +died +diehard +diehards +dielectric +dielectrics +diereses +dieresis +dies +diesel +dieseled +dieseling +diesels +diet +dietaries +dietary +dieted +dieter +dieters +dietetic +dietetics +dietician +dieticians +dieting +dietitian +dietitians +diets +differ +differed +difference +differences +different +differential +differentials +differentiate +differentiated +differentiates +differentiating +differentiation +differently +differing +differs +difficult +difficulties +difficultly +difficulty +diffidence +diffident +diffidently +diffraction +diffuse +diffused +diffusely +diffuseness +diffuses +diffusing +diffusion +diffusive +digerati +digest +digested +digestibility +digestible +digesting +digestion +digestions +digestive +digests +digger +diggers +digging +diggings +digit +digital +digitalis +digitally +digitize +digitized +digitizes +digitizing +digits +dignified +dignifies +dignify +dignifying +dignitaries +dignitary +dignities +dignity +digraph +digraphs +digress +digressed +digresses +digressing +digression +digressions +digressive +digs +dike +diked +dikes +diking +dilapidated +dilapidation +dilatation +dilate +dilated +dilates +dilating +dilation +dilator +dilators +dilatory +dilemma +dilemmas +dilettante +dilettantes +dilettanti +dilettantish +dilettantism +diligence +diligent +diligently +dill +dillies +dills +dilly +dillydallied +dillydallies +dillydally +dillydallying +dilute +diluted +dilutes +diluting +dilution +dime +dimension +dimensional +dimensions +dimes +diminish +diminished +diminishes +diminishing +diminuendo +diminuendoes +diminuendos +diminution +diminutions +diminutive +diminutives +dimity +dimly +dimmed +dimmer +dimmers +dimmest +dimming +dimness +dimple +dimpled +dimples +dimpling +dimply +dims +dimwit +dimwits +dimwitted +dinar +dinars +dine +dined +diner +diners +dines +dinette +dinettes +ding +dingbat +dingbats +dingdong +dinged +dinghies +dinghy +dingier +dingiest +dingily +dinginess +dinging +dingle +dingles +dingo +dingoes +dings +dingus +dinguses +dingy +dining +dinkier +dinkies +dinkiest +dinky +dinned +dinner +dinnered +dinnering +dinners +dinnertime +dinnerware +dinning +dinosaur +dinosaurs +dins +dint +diocesan +diocesans +diocese +dioceses +diode +diodes +diorama +dioramas +dioxide +dioxides +dioxin +dioxins +diphtheria +diphthong +diphthongs +diploid +diploids +diploma +diplomacy +diplomas +diplomat +diplomata +diplomatic +diplomatically +diplomatist +diplomatists +diplomats +dipole +dipoles +dipped +dipper +dippers +dippier +dippiest +dipping +dippy +dips +dipsomania +dipsomaniac +dipsomaniacs +dipstick +dipsticks +dipterous +diptych +diptychs +dire +direct +directed +directer +directest +directing +direction +directional +directions +directive +directives +directly +directness +director +directorate +directorates +directorial +directories +directors +directorship +directorships +directory +directs +direful +direly +direr +direst +dirge +dirges +dirigible +dirigibles +dirk +dirks +dirndl +dirndls +dirt +dirtied +dirtier +dirties +dirtiest +dirtily +dirtiness +dirty +dirtying +disabilities +disability +disable +disabled +disablement +disables +disabling +disabuse +disabused +disabuses +disabusing +disadvantage +disadvantaged +disadvantageous +disadvantageously +disadvantages +disadvantaging +disaffect +disaffected +disaffecting +disaffection +disaffects +disaffiliate +disaffiliated +disaffiliates +disaffiliating +disaffiliation +disagree +disagreeable +disagreeableness +disagreeably +disagreed +disagreeing +disagreement +disagreements +disagrees +disallow +disallowed +disallowing +disallows +disappear +disappearance +disappearances +disappeared +disappearing +disappears +disappoint +disappointed +disappointing +disappointingly +disappointment +disappointments +disappoints +disapprobation +disapproval +disapprove +disapproved +disapproves +disapproving +disapprovingly +disarm +disarmament +disarmed +disarming +disarmingly +disarms +disarrange +disarranged +disarrangement +disarranges +disarranging +disarray +disarrayed +disarraying +disarrays +disassemble +disassembled +disassembles +disassembling +disassociate +disassociated +disassociates +disassociating +disassociation +disaster +disasters +disastrous +disastrously +disavow +disavowal +disavowals +disavowed +disavowing +disavows +disband +disbanded +disbanding +disbandment +disbands +disbar +disbarment +disbarred +disbarring +disbars +disbelief +disbelieve +disbelieved +disbeliever +disbelievers +disbelieves +disbelieving +disbelievingly +disbursal +disburse +disbursed +disbursement +disbursements +disburses +disbursing +disc +discard +discarded +discarding +discards +discern +discerned +discernible +discernibly +discerning +discerningly +discernment +discerns +discharge +discharged +discharges +discharging +disciple +disciples +discipleship +disciplinarian +disciplinarians +disciplinary +discipline +disciplined +disciplines +disciplining +disclaim +disclaimed +disclaimer +disclaimers +disclaiming +disclaims +disclose +disclosed +discloses +disclosing +disclosure +disclosures +disco +discoed +discographies +discography +discoing +discolor +discoloration +discolorations +discolored +discoloring +discolors +discolour +discoloured +discolouring +discolours +discombobulate +discombobulated +discombobulates +discombobulating +discombobulation +discomfit +discomfited +discomfiting +discomfits +discomfiture +discomfort +discomforted +discomforting +discomforts +discommode +discommoded +discommodes +discommoding +discompose +discomposed +discomposes +discomposing +discomposure +disconcert +disconcerted +disconcerting +disconcertingly +disconcerts +disconnect +disconnected +disconnectedly +disconnectedness +disconnecting +disconnection +disconnections +disconnects +disconsolate +disconsolately +discontent +discontented +discontentedly +discontenting +discontentment +discontents +discontinuance +discontinuances +discontinuation +discontinuations +discontinue +discontinued +discontinues +discontinuing +discontinuities +discontinuity +discontinuous +discontinuously +discord +discordance +discordant +discordantly +discorded +discording +discords +discos +discotheque +discotheques +discount +discounted +discountenance +discountenanced +discountenances +discountenancing +discounter +discounters +discounting +discounts +discourage +discouraged +discouragement +discouragements +discourages +discouraging +discouragingly +discourse +discoursed +discourses +discoursing +discourteous +discourteously +discourtesies +discourtesy +discover +discovered +discoverer +discoverers +discoveries +discovering +discovers +discovery +discredit +discreditable +discreditably +discredited +discrediting +discredits +discreet +discreeter +discreetest +discreetly +discreetness +discrepancies +discrepancy +discrepant +discrete +discretely +discreteness +discretion +discretionary +discriminate +discriminated +discriminates +discriminating +discrimination +discriminator +discriminators +discriminatory +discs +discursive +discursively +discursiveness +discus +discuses +discuss +discussant +discussants +discussed +discusses +discussing +discussion +discussions +disdain +disdained +disdainful +disdainfully +disdaining +disdains +disease +diseased +diseases +disembark +disembarkation +disembarked +disembarking +disembarks +disembodied +disembodies +disembodiment +disembody +disembodying +disembowel +disemboweled +disemboweling +disembowelled +disembowelling +disembowelment +disembowels +disenchant +disenchanted +disenchanting +disenchantment +disenchants +disencumber +disencumbered +disencumbering +disencumbers +disenfranchise +disenfranchised +disenfranchisement +disenfranchises +disenfranchising +disengage +disengaged +disengagement +disengagements +disengages +disengaging +disentangle +disentangled +disentanglement +disentangles +disentangling +disequilibrium +disestablish +disestablished +disestablishes +disestablishing +disestablishment +disesteem +disesteemed +disesteeming +disesteems +disfavor +disfavored +disfavoring +disfavors +disfavour +disfavours +disfigure +disfigured +disfigurement +disfigurements +disfigures +disfiguring +disfranchise +disfranchised +disfranchisement +disfranchises +disfranchising +disgorge +disgorged +disgorgement +disgorges +disgorging +disgrace +disgraced +disgraceful +disgracefully +disgracefulness +disgraces +disgracing +disgruntle +disgruntled +disgruntlement +disgruntles +disgruntling +disguise +disguised +disguises +disguising +disgust +disgusted +disgustedly +disgusting +disgustingly +disgusts +dish +dishabille +disharmonious +disharmony +dishcloth +dishcloths +dishearten +disheartened +disheartening +dishearteningly +disheartens +dished +dishes +dishevel +disheveled +disheveling +dishevelled +dishevelling +dishevelment +dishevels +dishing +dishonest +dishonestly +dishonesty +dishonor +dishonorable +dishonorably +dishonored +dishonoring +dishonors +dishpan +dishpans +dishrag +dishrags +dishtowel +dishtowels +dishware +dishwasher +dishwashers +dishwater +disillusion +disillusioned +disillusioning +disillusionment +disillusions +disinclination +disincline +disinclined +disinclines +disinclining +disinfect +disinfectant +disinfectants +disinfected +disinfecting +disinfection +disinfects +disinflation +disinformation +disingenuous +disingenuously +disinherit +disinheritance +disinherited +disinheriting +disinherits +disintegrate +disintegrated +disintegrates +disintegrating +disintegration +disinter +disinterest +disinterested +disinterestedly +disinterestedness +disinterests +disinterment +disinterred +disinterring +disinters +disinvestment +disjoint +disjointed +disjointedly +disjointedness +disjointing +disjoints +disjunctive +disk +diskette +diskettes +disks +dislike +disliked +dislikes +disliking +dislocate +dislocated +dislocates +dislocating +dislocation +dislocations +dislodge +dislodged +dislodges +dislodging +disloyal +disloyally +disloyalty +dismal +dismally +dismantle +dismantled +dismantlement +dismantles +dismantling +dismay +dismayed +dismaying +dismays +dismember +dismembered +dismembering +dismemberment +dismembers +dismiss +dismissal +dismissals +dismissed +dismisses +dismissing +dismissive +dismissively +dismount +dismounted +dismounting +dismounts +disobedience +disobedient +disobediently +disobey +disobeyed +disobeying +disobeys +disoblige +disobliged +disobliges +disobliging +disorder +disordered +disordering +disorderliness +disorderly +disorders +disorganization +disorganize +disorganized +disorganizes +disorganizing +disorient +disorientate +disorientated +disorientates +disorientating +disorientation +disoriented +disorienting +disorients +disown +disowned +disowning +disowns +disparage +disparaged +disparagement +disparages +disparaging +disparagingly +disparate +disparately +disparities +disparity +dispassion +dispassionate +dispassionately +dispatch +dispatched +dispatcher +dispatchers +dispatches +dispatching +dispel +dispelled +dispelling +dispels +dispensable +dispensaries +dispensary +dispensation +dispensations +dispense +dispensed +dispenser +dispensers +dispenses +dispensing +dispersal +disperse +dispersed +disperses +dispersing +dispersion +dispirit +dispirited +dispiriting +dispirits +displace +displaced +displacement +displacements +displaces +displacing +display +displayed +displaying +displays +displease +displeased +displeases +displeasing +displeasure +disport +disported +disporting +disports +disposable +disposables +disposal +disposals +dispose +disposed +disposer +disposers +disposes +disposing +disposition +dispositions +dispossess +dispossessed +dispossesses +dispossessing +dispossession +dispraise +dispraised +dispraises +dispraising +disproof +disproofs +disproportion +disproportional +disproportionate +disproportionately +disproportions +disprovable +disprove +disproved +disproven +disproves +disproving +disputable +disputably +disputant +disputants +disputation +disputations +disputatious +disputatiously +dispute +disputed +disputer +disputers +disputes +disputing +disqualification +disqualifications +disqualified +disqualifies +disqualify +disqualifying +disquiet +disquieted +disquieting +disquiets +disquietude +disquisition +disquisitions +disregard +disregarded +disregardful +disregarding +disregards +disrepair +disreputable +disreputably +disrepute +disrespect +disrespected +disrespectful +disrespectfully +disrespecting +disrespects +disrobe +disrobed +disrobes +disrobing +disrupt +disrupted +disrupting +disruption +disruptions +disruptive +disruptively +disrupts +diss +dissatisfaction +dissatisfied +dissatisfies +dissatisfy +dissatisfying +dissect +dissected +dissecting +dissection +dissections +dissector +dissectors +dissects +dissed +dissemblance +dissemble +dissembled +dissembler +dissemblers +dissembles +dissembling +disseminate +disseminated +disseminates +disseminating +dissemination +dissension +dissensions +dissent +dissented +dissenter +dissenters +dissenting +dissents +dissertation +dissertations +disservice +disservices +disses +dissever +dissevered +dissevering +dissevers +dissidence +dissident +dissidents +dissimilar +dissimilarities +dissimilarity +dissimilitude +dissimilitudes +dissimulate +dissimulated +dissimulates +dissimulating +dissimulation +dissimulator +dissimulators +dissing +dissipate +dissipated +dissipates +dissipating +dissipation +dissociate +dissociated +dissociates +dissociating +dissociation +dissoluble +dissolute +dissolutely +dissoluteness +dissolution +dissolve +dissolved +dissolves +dissolving +dissonance +dissonances +dissonant +dissuade +dissuaded +dissuades +dissuading +dissuasion +dissuasive +distaff +distaffs +distal +distally +distance +distanced +distances +distancing +distant +distantly +distaste +distasteful +distastefully +distastefulness +distastes +distemper +distend +distended +distending +distends +distension +distensions +distention +distentions +distil +distill +distillate +distillates +distillation +distillations +distilled +distiller +distilleries +distillers +distillery +distilling +distills +distils +distinct +distincter +distinctest +distinction +distinctions +distinctive +distinctively +distinctiveness +distinctly +distinctness +distinguish +distinguishable +distinguished +distinguishes +distinguishing +distort +distorted +distorting +distortion +distortions +distorts +distract +distracted +distractedly +distracting +distraction +distractions +distracts +distrait +distraught +distress +distressed +distresses +distressful +distressing +distressingly +distribute +distributed +distributes +distributing +distribution +distributions +distributive +distributively +distributor +distributors +district +districts +distrust +distrusted +distrustful +distrustfully +distrusting +distrusts +disturb +disturbance +disturbances +disturbed +disturber +disturbers +disturbing +disturbs +disunion +disunite +disunited +disunites +disuniting +disunity +disuse +disused +disuses +disusing +ditch +ditched +ditches +ditching +dither +dithered +ditherer +ditherers +dithering +dithers +ditsier +ditsiest +ditsy +ditties +ditto +dittoed +dittoes +dittoing +dittos +ditty +ditz +ditzes +ditzier +ditziest +ditzy +diuretic +diuretics +diurnal +diurnally +diva +divalent +divan +divans +divas +dive +dived +diver +diverge +diverged +divergence +divergences +divergent +diverges +diverging +divers +diverse +diversely +diverseness +diversification +diversified +diversifies +diversify +diversifying +diversion +diversionary +diversions +diversities +diversity +divert +diverted +diverticulitis +diverting +diverts +dives +divest +divested +divesting +divestiture +divestitures +divestment +divests +dividable +divide +divided +dividend +dividends +divider +dividers +divides +dividing +divination +divine +divined +divinely +diviner +diviners +divines +divinest +diving +divining +divinities +divinity +divisibility +divisible +division +divisional +divisions +divisive +divisively +divisiveness +divisor +divisors +divorce +divorced +divorcee +divorcees +divorcement +divorcements +divorces +divorcing +divot +divots +divulge +divulged +divulges +divulging +divvied +divvies +divvy +divvying +dixieland +dizzied +dizzier +dizzies +dizziest +dizzily +dizziness +dizzy +dizzying +djellaba +djellabah +djellabahs +djellabas +djinn +djinns +doable +dobbin +dobbins +doberman +dobermans +docent +docents +docile +docilely +docility +dock +docked +docket +docketed +docketing +dockets +docking +docks +dockworker +dockworkers +dockyard +dockyards +docs +doctor +doctoral +doctorate +doctorates +doctored +doctoring +doctors +doctrinaire +doctrinaires +doctrinal +doctrine +doctrines +docudrama +docudramas +document +documentaries +documentary +documentation +documented +documenting +documents +dodder +doddered +doddering +dodders +dodge +dodged +dodger +dodgers +dodges +dodging +dodo +dodoes +dodos +doer +doers +does +doeskin +doeskins +doff +doffed +doffing +doffs +dogcart +dogcarts +dogcatcher +dogcatchers +doge +dogear +dogeared +dogearing +dogears +doges +dogfight +dogfights +dogfish +dogfishes +dogged +doggedly +doggedness +doggerel +doggie +doggier +doggies +doggiest +dogging +doggone +doggoned +doggoneder +doggonedest +doggoner +doggones +doggonest +doggoning +doggy +doghouse +doghouses +dogie +dogies +dogleg +doglegged +doglegging +doglegs +dogma +dogmas +dogmata +dogmatic +dogmatically +dogmatism +dogmatist +dogmatists +dogs +dogtrot +dogtrots +dogtrotted +dogtrotting +dogwood +dogwoods +dogy +doilies +doily +doing +doings +doldrums +dole +doled +doleful +dolefully +dolefulness +doles +doling +doll +dollar +dollars +dolled +dollhouse +dollhouses +dollies +dolling +dollop +dolloped +dolloping +dollops +dolls +dolly +dolmen +dolmens +dolomite +dolor +dolorous +dolorously +dolphin +dolphins +dolt +doltish +doltishly +doltishness +dolts +domain +domains +dome +domed +domes +domestic +domestically +domesticate +domesticated +domesticates +domesticating +domestication +domesticity +domestics +domicile +domiciled +domiciles +domiciliary +domiciling +dominance +dominant +dominantly +dominants +dominate +dominated +dominates +dominating +domination +dominatrices +dominatrix +dominatrixes +domineer +domineered +domineering +domineeringly +domineers +doming +dominion +dominions +domino +dominoes +dominos +dona +donas +donate +donated +donates +donating +donation +donations +done +dong +dongle +dongles +dongs +donkey +donkeys +donned +donning +donnybrook +donnybrooks +donor +donors +dons +donut +donuts +doodad +doodads +doodle +doodlebug +doodlebugs +doodled +doodler +doodlers +doodles +doodling +doohickey +doohickeys +doom +doomed +dooming +dooms +doomsayer +doomsayers +doomsday +door +doorbell +doorbells +doorkeeper +doorkeepers +doorknob +doorknobs +doorman +doormat +doormats +doormen +doorplate +doorplates +doors +doorstep +doorstepped +doorstepping +doorsteps +doorstop +doorstops +doorway +doorways +dooryard +dooryards +dopa +dope +doped +doper +dopers +dopes +dopey +dopier +dopiest +dopiness +doping +dopy +dories +dork +dorkier +dorkiest +dorks +dorky +dorm +dormancy +dormant +dormer +dormers +dormice +dormitories +dormitory +dormouse +dorms +dorsal +dorsally +dory +dosage +dosages +dose +dosed +doses +dosimeter +dosimeters +dosing +dossier +dossiers +dost +dotage +dotard +dotards +dote +doted +doter +doters +dotes +doth +doting +dotingly +dots +dotted +dottier +dottiest +dotting +dotty +double +doubled +doubleheader +doubleheaders +doubles +doublespeak +doublet +doublets +doubling +doubloon +doubloons +doubly +doubt +doubted +doubter +doubters +doubtful +doubtfuller +doubtfullest +doubtfully +doubtfulness +doubting +doubtingly +doubtless +doubtlessly +doubts +douche +douched +douches +douching +dough +doughier +doughiest +doughnut +doughnuts +doughtier +doughtiest +doughty +doughy +dour +dourer +dourest +dourly +dourness +douse +doused +douses +dousing +dove +dovecote +dovecotes +doves +dovetail +dovetailed +dovetailing +dovetails +dovish +dowager +dowagers +dowdier +dowdiest +dowdily +dowdiness +dowdy +dowel +doweled +doweling +dowelled +dowelling +dowels +dower +dowered +dowering +dowers +down +downbeat +downbeats +downcast +downdraft +downdrafts +downed +downer +downers +downfall +downfallen +downfalls +downgrade +downgraded +downgrades +downgrading +downhearted +downheartedly +downheartedness +downhill +downhills +downier +downiest +downing +download +downloaded +downloading +downloads +downplay +downplayed +downplaying +downplays +downpour +downpours +downrange +downright +downriver +downs +downscale +downscaled +downscales +downscaling +downshift +downshifted +downshifting +downshifts +downside +downsides +downsize +downsized +downsizes +downsizing +downspout +downspouts +downstage +downstairs +downstate +downstream +downswing +downswings +downtime +downtown +downtrend +downtrends +downtrodden +downturn +downturns +downward +downwards +downwind +downy +dowries +dowry +dowse +dowsed +dowser +dowsers +dowses +dowsing +doxologies +doxology +doyen +doyenne +doyennes +doyens +doze +dozed +dozen +dozens +dozenth +dozes +dozing +drab +drabber +drabbest +drably +drabness +drabs +drachma +drachmae +drachmai +drachmas +draconian +draft +drafted +draftee +draftees +drafter +drafters +draftier +draftiest +draftily +draftiness +drafting +drafts +draftsman +draftsmanship +draftsmen +draftswoman +draftswomen +drafty +drag +dragged +draggier +draggiest +dragging +draggy +dragnet +dragnets +dragon +dragonflies +dragonfly +dragons +dragoon +dragooned +dragooning +dragoons +drags +drain +drainage +drainboard +drainboards +drained +drainer +drainers +draining +drainpipe +drainpipes +drains +drake +drakes +dram +drama +dramas +dramatic +dramatically +dramatics +dramatist +dramatists +dramatization +dramatizations +dramatize +dramatized +dramatizes +dramatizing +drams +drank +drape +draped +draper +draperies +drapers +drapery +drapes +draping +drastic +drastically +drat +draught +draughted +draughtier +draughtiest +draughting +draughts +draughtsman +draughtsmen +draughty +draw +drawback +drawbacks +drawbridge +drawbridges +drawer +drawers +drawing +drawings +drawl +drawled +drawling +drawls +drawn +draws +drawstring +drawstrings +dray +drays +dread +dreaded +dreadful +dreadfully +dreadfulness +dreading +dreadlocks +dreadnaught +dreadnaughts +dreadnought +dreadnoughts +dreads +dream +dreamboat +dreamboats +dreamed +dreamer +dreamers +dreamier +dreamiest +dreamily +dreaminess +dreaming +dreamland +dreamless +dreamlike +dreams +dreamt +dreamworld +dreamworlds +dreamy +drear +drearier +dreariest +drearily +dreariness +dreary +dredge +dredged +dredger +dredgers +dredges +dredging +dregs +drench +drenched +drenches +drenching +dress +dressage +dressed +dresser +dressers +dresses +dressier +dressiest +dressiness +dressing +dressings +dressmaker +dressmakers +dressmaking +dressy +drest +drew +dribble +dribbled +dribbler +dribblers +dribbles +dribbling +driblet +driblets +dried +drier +driers +dries +driest +drift +drifted +drifter +drifters +drifting +drifts +driftwood +drill +drilled +driller +drillers +drilling +drillmaster +drillmasters +drills +drily +drink +drinkable +drinker +drinkers +drinking +drinks +drip +dripped +drippier +drippiest +dripping +drippings +drippy +drips +dript +drive +drivel +driveled +driveler +drivelers +driveling +drivelled +drivelling +drivels +driven +driver +drivers +drives +driveway +driveways +driving +drizzle +drizzled +drizzles +drizzlier +drizzliest +drizzling +drizzly +drogue +drogues +droll +droller +drolleries +drollery +drollest +drollness +drolly +dromedaries +dromedary +drone +droned +drones +droning +drool +drooled +drooling +drools +droop +drooped +droopier +droopiest +droopiness +drooping +droops +droopy +drop +dropkick +dropkicks +droplet +droplets +dropout +dropouts +dropped +dropper +droppers +dropping +droppings +drops +dropsical +dropsy +dross +drought +droughts +drouth +drouths +drove +drover +drovers +droves +drown +drowned +drowning +drownings +drowns +drowse +drowsed +drowses +drowsier +drowsiest +drowsily +drowsiness +drowsing +drowsy +drub +drubbed +drubber +drubbers +drubbing +drubbings +drubs +drudge +drudged +drudgery +drudges +drudging +drug +drugged +druggie +druggies +drugging +druggist +druggists +druggy +drugs +drugstore +drugstores +druid +druidism +druids +drum +drumbeat +drumbeats +drumlin +drumlins +drummed +drummer +drummers +drumming +drums +drumstick +drumsticks +drunk +drunkard +drunkards +drunken +drunkenly +drunkenness +drunker +drunkest +drunks +drupe +drupes +druthers +dryad +dryads +dryer +dryers +drying +dryly +dryness +drys +drywall +dual +dualism +duality +dubbed +dubber +dubbers +dubbin +dubbing +dubiety +dubious +dubiously +dubiousness +dubs +ducal +ducat +ducats +duchess +duchesses +duchies +duchy +duck +duckbill +duckbills +ducked +duckier +duckies +duckiest +ducking +duckling +ducklings +duckpins +ducks +duckweed +ducky +duct +ductile +ductility +ductless +ducts +dude +duded +dudes +dudgeon +duding +duds +duel +dueled +dueler +duelers +dueling +duelist +duelists +duelled +duelling +duellist +duellists +duels +duenna +duennas +dues +duet +duets +duff +duffer +duffers +duffs +dugout +dugouts +duke +dukedom +dukedoms +dukes +dulcet +dulcimer +dulcimers +dull +dullard +dullards +dulled +duller +dullest +dulling +dullness +dulls +dully +dulness +duly +dumb +dumbbell +dumbbells +dumber +dumbest +dumbfound +dumbfounded +dumbfounding +dumbfounds +dumbly +dumbness +dumbstruck +dumbwaiter +dumbwaiters +dumdum +dumdums +dumfound +dumfounded +dumfounding +dumfounds +dummies +dummy +dump +dumped +dumpier +dumpiest +dumpiness +dumping +dumpling +dumplings +dumps +dumpster +dumpsters +dumpy +dunce +dunces +dunderhead +dunderheads +dune +dunes +dung +dungaree +dungarees +dunged +dungeon +dungeons +dunghill +dunghills +dunging +dungs +dunk +dunked +dunking +dunks +dunned +dunner +dunnest +dunning +dunno +duns +duodecimal +duodena +duodenal +duodenum +duodenums +duos +dupe +duped +duper +dupers +dupes +duping +duple +duplex +duplexes +duplicate +duplicated +duplicates +duplicating +duplication +duplicator +duplicators +duplicitous +duplicity +durability +durable +durably +durance +duration +duress +during +durst +durum +dusk +duskier +duskiest +duskiness +dusky +dust +dusted +duster +dusters +dustier +dustiest +dustiness +dusting +dustless +dustpan +dustpans +dusts +dusty +dutch +duteous +duteously +dutiable +duties +dutiful +dutifully +dutifulness +duty +duvet +duvets +dwarf +dwarfed +dwarfing +dwarfish +dwarfism +dwarfs +dwarves +dweeb +dweebs +dwell +dwelled +dweller +dwellers +dwelling +dwellings +dwells +dwelt +dwindle +dwindled +dwindles +dwindling +dybbuk +dybbukim +dybbuks +dyed +dyeing +dyer +dyers +dyes +dyestuff +dying +dyke +dykes +dynamic +dynamical +dynamically +dynamics +dynamism +dynamite +dynamited +dynamiter +dynamiters +dynamites +dynamiting +dynamo +dynamos +dynastic +dynasties +dynasty +dysentery +dysfunction +dysfunctional +dysfunctions +dyslectic +dyslectics +dyslexia +dyslexic +dyslexics +dyspepsia +dyspeptic +dyspeptics +dysprosium +each +eager +eagerer +eagerest +eagerly +eagerness +eagle +eagles +eaglet +eaglets +earache +earaches +eardrum +eardrums +eared +earful +earfuls +earl +earldom +earldoms +earlier +earliest +earliness +earlobe +earlobes +earls +early +earmark +earmarked +earmarking +earmarks +earmuff +earmuffs +earn +earned +earner +earners +earnest +earnestly +earnestness +earnests +earning +earnings +earns +earphone +earphones +earplug +earplugs +earring +earrings +ears +earshot +earsplitting +earth +earthbound +earthed +earthen +earthenware +earthier +earthiest +earthiness +earthing +earthlier +earthliest +earthling +earthlings +earthly +earthquake +earthquakes +earths +earthshaking +earthward +earthwards +earthwork +earthworks +earthworm +earthworms +earthy +earwax +earwig +earwigs +ease +eased +easel +easels +easement +easements +eases +easier +easiest +easily +easiness +easing +east +eastbound +easterlies +easterly +eastern +easterner +easterners +easternmost +eastward +eastwards +easy +easygoing +eatable +eatables +eaten +eater +eateries +eaters +eatery +eating +eats +eave +eaves +eavesdrop +eavesdropped +eavesdropper +eavesdroppers +eavesdropping +eavesdrops +ebbed +ebbing +ebbs +ebonies +ebony +ebullience +ebullient +ebulliently +ebullition +eccentric +eccentrically +eccentricities +eccentricity +eccentrics +ecclesiastic +ecclesiastical +ecclesiastically +ecclesiastics +echelon +echelons +echinoderm +echinoderms +echo +echoed +echoes +echoic +echoing +echolocation +echos +eclair +eclairs +eclat +eclectic +eclectically +eclecticism +eclectics +eclipse +eclipsed +eclipses +eclipsing +ecliptic +eclogue +eclogues +ecocide +ecologic +ecological +ecologically +ecologist +ecologists +ecology +economic +economical +economically +economics +economies +economist +economists +economize +economized +economizer +economizers +economizes +economizing +economy +ecosystem +ecosystems +ecru +ecstasies +ecstasy +ecstatic +ecstatically +ecumenical +ecumenically +ecumenicism +ecumenism +eczema +eddied +eddies +eddy +eddying +edelweiss +edema +edge +edged +edger +edgers +edges +edgeways +edgewise +edgier +edgiest +edgily +edginess +edging +edgings +edgy +edibility +edible +edibleness +edibles +edict +edicts +edification +edifice +edifices +edified +edifier +edifiers +edifies +edify +edifying +edit +edited +editing +edition +editions +editor +editorial +editorialize +editorialized +editorializes +editorializing +editorially +editorials +editors +editorship +edits +educability +educable +educate +educated +educates +educating +education +educational +educationally +educations +educator +educators +educe +educed +educes +educing +edutainment +eels +eerie +eerier +eeriest +eerily +eeriness +eery +efface +effaced +effacement +effaces +effacing +effect +effected +effecting +effective +effectively +effectiveness +effects +effectual +effectually +effectuate +effectuated +effectuates +effectuating +effeminacy +effeminate +effeminately +effendi +effendis +efferent +effervesce +effervesced +effervescence +effervescent +effervescently +effervesces +effervescing +effete +effetely +effeteness +efficacious +efficaciously +efficacy +efficiencies +efficiency +efficient +efficiently +effigies +effigy +efflorescence +efflorescent +effluence +effluent +effluents +effluvia +effluvium +effluviums +effort +effortless +effortlessly +effortlessness +efforts +effrontery +effulgence +effulgent +effuse +effused +effuses +effusing +effusion +effusions +effusive +effusively +effusiveness +egad +egalitarian +egalitarianism +egalitarians +eggbeater +eggbeaters +eggcup +eggcups +egged +egghead +eggheads +egging +eggnog +eggplant +eggplants +eggs +eggshell +eggshells +egis +eglantine +eglantines +egocentric +egocentrically +egocentricity +egocentrics +egoism +egoist +egoistic +egoistical +egoistically +egoists +egomania +egomaniac +egomaniacs +egos +egotism +egotist +egotistic +egotistical +egotistically +egotists +egregious +egregiously +egregiousness +egress +egresses +egret +egrets +eider +eiderdown +eiderdowns +eiders +eight +eighteen +eighteens +eighteenth +eighteenths +eighth +eighths +eighties +eightieth +eightieths +eights +eighty +einsteinium +either +ejaculate +ejaculated +ejaculates +ejaculating +ejaculation +ejaculations +ejaculatory +eject +ejected +ejecting +ejection +ejections +ejector +ejectors +ejects +eked +ekes +eking +elaborate +elaborated +elaborately +elaborateness +elaborates +elaborating +elaboration +elaborations +elan +eland +elands +elapse +elapsed +elapses +elapsing +elastic +elastically +elasticity +elasticize +elasticized +elasticizes +elasticizing +elastics +elate +elated +elatedly +elates +elating +elation +elbow +elbowed +elbowing +elbowroom +elbows +elder +elderberries +elderberry +elderly +elders +eldest +elect +electable +elected +electing +election +electioneer +electioneered +electioneering +electioneers +elections +elective +electives +elector +electoral +electorate +electorates +electors +electric +electrical +electrically +electrician +electricians +electricity +electrification +electrified +electrifier +electrifiers +electrifies +electrify +electrifying +electrocardiogram +electrocardiograms +electrocardiograph +electrocardiographs +electrocardiography +electrocute +electrocuted +electrocutes +electrocuting +electrocution +electrocutions +electrode +electrodes +electroencephalogram +electroencephalograms +electroencephalograph +electroencephalographic +electroencephalographs +electroencephalography +electrologist +electrologists +electrolysis +electrolyte +electrolytes +electrolytic +electromagnet +electromagnetic +electromagnetically +electromagnetism +electromagnets +electromotive +electron +electronic +electronically +electronics +electrons +electroplate +electroplated +electroplates +electroplating +electroscope +electroscopes +electroscopic +electroshock +electrostatics +electrotype +electrotypes +elects +eleemosynary +elegance +elegant +elegantly +elegiac +elegiacal +elegiacs +elegies +elegy +element +elemental +elementally +elementary +elements +elephant +elephantiasis +elephantine +elephants +elevate +elevated +elevates +elevating +elevation +elevations +elevator +elevators +eleven +elevens +eleventh +elevenths +elfin +elfish +elicit +elicitation +elicited +eliciting +elicits +elide +elided +elides +eliding +eligibility +eligible +eliminate +eliminated +eliminates +eliminating +elimination +eliminations +elision +elisions +elite +elites +elitism +elitist +elitists +elixir +elixirs +elks +ellipse +ellipses +ellipsis +ellipsoid +ellipsoidal +ellipsoids +elliptic +elliptical +elliptically +ells +elms +elocution +elocutionary +elocutionist +elocutionists +elodea +elodeas +elongate +elongated +elongates +elongating +elongation +elongations +elope +eloped +elopement +elopements +elopes +eloping +eloquence +eloquent +eloquently +else +elsewhere +elucidate +elucidated +elucidates +elucidating +elucidation +elucidations +elude +eluded +eludes +eluding +elusive +elusively +elusiveness +elver +elvers +elves +emaciate +emaciated +emaciates +emaciating +emaciation +email +emailed +emailing +emails +emanate +emanated +emanates +emanating +emanation +emanations +emancipate +emancipated +emancipates +emancipating +emancipation +emancipator +emancipators +emasculate +emasculated +emasculates +emasculating +emasculation +embalm +embalmed +embalmer +embalmers +embalming +embalms +embank +embanked +embanking +embankment +embankments +embanks +embargo +embargoed +embargoes +embargoing +embark +embarkation +embarkations +embarked +embarking +embarks +embarrass +embarrassed +embarrasses +embarrassing +embarrassingly +embarrassment +embarrassments +embassies +embassy +embattled +embed +embedded +embedding +embeds +embellish +embellished +embellishes +embellishing +embellishment +embellishments +ember +embers +embezzle +embezzled +embezzlement +embezzler +embezzlers +embezzles +embezzling +embitter +embittered +embittering +embitterment +embitters +emblazon +emblazoned +emblazoning +emblazonment +emblazons +emblem +emblematic +emblems +embodied +embodies +embodiment +embody +embodying +embolden +emboldened +emboldening +emboldens +embolism +embolisms +emboss +embossed +embosser +embossers +embosses +embossing +embouchure +embower +embowered +embowering +embowers +embrace +embraceable +embraced +embraces +embracing +embrasure +embrasures +embrocation +embrocations +embroider +embroidered +embroiderer +embroiderers +embroideries +embroidering +embroiders +embroidery +embroil +embroiled +embroiling +embroilment +embroils +embryo +embryologist +embryologists +embryology +embryonic +embryos +emcee +emceed +emceeing +emcees +emend +emendation +emendations +emended +emending +emends +emerald +emeralds +emerge +emerged +emergence +emergencies +emergency +emergent +emerges +emerging +emerita +emeritus +emery +emetic +emetics +emigrant +emigrants +emigrate +emigrated +emigrates +emigrating +emigration +emigrations +emigre +emigres +eminence +eminences +eminent +eminently +emir +emirate +emirates +emirs +emissaries +emissary +emission +emissions +emit +emits +emitted +emitter +emitters +emitting +emollient +emollients +emolument +emoluments +emote +emoted +emotes +emoticon +emoticons +emoting +emotion +emotional +emotionalism +emotionalize +emotionalized +emotionalizes +emotionalizing +emotionally +emotions +emotive +empanel +empaneled +empaneling +empanelled +empanelling +empanels +empathetic +empathize +empathized +empathizes +empathizing +empathy +emperor +emperors +emphases +emphasis +emphasize +emphasized +emphasizes +emphasizing +emphatic +emphatically +emphysema +empire +empires +empiric +empirical +empirically +empiricism +empiricist +empiricists +emplacement +emplacements +employ +employable +employe +employed +employee +employees +employer +employers +employes +employing +employment +employments +employs +emporia +emporium +emporiums +empower +empowered +empowering +empowerment +empowers +empress +empresses +emptied +emptier +empties +emptiest +emptily +emptiness +empty +emptying +empyrean +emulate +emulated +emulates +emulating +emulation +emulations +emulative +emulator +emulators +emulsification +emulsified +emulsifier +emulsifiers +emulsifies +emulsify +emulsifying +emulsion +emulsions +emus +enable +enabled +enabler +enablers +enables +enabling +enact +enacted +enacting +enactment +enactments +enacts +enamel +enameled +enameler +enamelers +enameling +enamelled +enamelling +enamels +enamelware +enamor +enamored +enamoring +enamors +enamour +enamoured +enamouring +enamours +encamp +encamped +encamping +encampment +encampments +encamps +encapsulate +encapsulated +encapsulates +encapsulating +encapsulation +encapsulations +encase +encased +encasement +encases +encasing +encephalitic +encephalitis +enchain +enchained +enchaining +enchains +enchant +enchanted +enchanter +enchanters +enchanting +enchantingly +enchantment +enchantments +enchantress +enchantresses +enchants +enchilada +enchiladas +encipher +enciphered +enciphering +enciphers +encircle +encircled +encirclement +encircles +encircling +enclave +enclaves +enclose +enclosed +encloses +enclosing +enclosure +enclosures +encode +encoded +encoder +encoders +encodes +encoding +encomia +encomium +encomiums +encompass +encompassed +encompasses +encompassing +encore +encored +encores +encoring +encounter +encountered +encountering +encounters +encourage +encouraged +encouragement +encouragements +encourages +encouraging +encouragingly +encroach +encroached +encroaches +encroaching +encroachment +encroachments +encrust +encrustation +encrustations +encrusted +encrusting +encrusts +encumber +encumbered +encumbering +encumbers +encumbrance +encumbrances +encyclical +encyclicals +encyclopaedia +encyclopaedias +encyclopaedic +encyclopedia +encyclopedias +encyclopedic +encyst +encysted +encysting +encystment +encysts +endanger +endangered +endangering +endangerment +endangers +endear +endeared +endearing +endearingly +endearment +endearments +endears +endeavor +endeavored +endeavoring +endeavors +endeavour +endeavoured +endeavouring +endeavours +ended +endemic +endemically +endemics +ending +endings +endive +endives +endless +endlessly +endlessness +endmost +endocrine +endocrines +endocrinologist +endocrinologists +endocrinology +endogenous +endogenously +endorphin +endorphins +endorse +endorsed +endorsement +endorsements +endorser +endorsers +endorses +endorsing +endoscope +endoscopes +endoscopic +endoscopy +endothermic +endow +endowed +endowing +endowment +endowments +endows +endpoint +endpoints +ends +endue +endued +endues +enduing +endurable +endurance +endure +endured +endures +enduring +endways +endwise +enema +enemas +enemata +enemies +enemy +energetic +energetically +energies +energize +energized +energizer +energizers +energizes +energizing +energy +enervate +enervated +enervates +enervating +enervation +enfeeble +enfeebled +enfeeblement +enfeebles +enfeebling +enfilade +enfiladed +enfilades +enfilading +enfold +enfolded +enfolding +enfolds +enforce +enforceable +enforced +enforcement +enforcer +enforcers +enforces +enforcing +enfranchise +enfranchised +enfranchisement +enfranchises +enfranchising +engage +engaged +engagement +engagements +engages +engaging +engagingly +engender +engendered +engendering +engenders +engine +engineer +engineered +engineering +engineers +engines +engorge +engorged +engorgement +engorges +engorging +engram +engrams +engrave +engraved +engraver +engravers +engraves +engraving +engravings +engross +engrossed +engrosses +engrossing +engrossment +engulf +engulfed +engulfing +engulfment +engulfs +enhance +enhanced +enhancement +enhancements +enhances +enhancing +enigma +enigmas +enigmatic +enigmatically +enjambement +enjambements +enjambment +enjambments +enjoin +enjoined +enjoining +enjoins +enjoy +enjoyable +enjoyably +enjoyed +enjoying +enjoyment +enjoyments +enjoys +enlarge +enlargeable +enlarged +enlargement +enlargements +enlarger +enlargers +enlarges +enlarging +enlighten +enlightened +enlightening +enlightenment +enlightens +enlist +enlisted +enlistee +enlistees +enlisting +enlistment +enlistments +enlists +enliven +enlivened +enlivening +enlivenment +enlivens +enmesh +enmeshed +enmeshes +enmeshing +enmeshment +enmities +enmity +ennoble +ennobled +ennoblement +ennobles +ennobling +ennui +enormities +enormity +enormous +enormously +enormousness +enough +enplane +enplaned +enplanes +enplaning +enquire +enquired +enquires +enquiries +enquiring +enquiry +enrage +enraged +enrages +enraging +enrapture +enraptured +enraptures +enrapturing +enrich +enriched +enriches +enriching +enrichment +enrol +enroll +enrolled +enrolling +enrollment +enrollments +enrolls +enrolment +enrolments +enrols +ensconce +ensconced +ensconces +ensconcing +ensemble +ensembles +enshrine +enshrined +enshrinement +enshrines +enshrining +enshroud +enshrouded +enshrouding +enshrouds +ensign +ensigns +ensilage +enslave +enslaved +enslavement +enslaves +enslaving +ensnare +ensnared +ensnarement +ensnares +ensnaring +ensue +ensued +ensues +ensuing +ensure +ensured +ensurer +ensurers +ensures +ensuring +entail +entailed +entailing +entailment +entails +entangle +entangled +entanglement +entanglements +entangles +entangling +entente +ententes +enter +entered +entering +enteritis +enterprise +enterprises +enterprising +enterprisingly +enters +entertain +entertained +entertainer +entertainers +entertaining +entertainingly +entertainment +entertainments +entertains +enthral +enthrall +enthralled +enthralling +enthrallment +enthralls +enthrals +enthrone +enthroned +enthronement +enthronements +enthrones +enthroning +enthuse +enthused +enthuses +enthusiasm +enthusiasms +enthusiast +enthusiastic +enthusiastically +enthusiasts +enthusing +entice +enticed +enticement +enticements +entices +enticing +enticingly +entire +entirely +entirety +entities +entitle +entitled +entitlement +entitlements +entitles +entitling +entity +entomb +entombed +entombing +entombment +entombs +entomological +entomologist +entomologists +entomology +entourage +entourages +entrails +entrance +entranced +entrancement +entrances +entrancing +entrancingly +entrant +entrants +entrap +entrapment +entrapped +entrapping +entraps +entreat +entreated +entreaties +entreating +entreatingly +entreats +entreaty +entree +entrees +entrench +entrenched +entrenches +entrenching +entrenchment +entrenchments +entrepreneur +entrepreneurial +entrepreneurs +entries +entropy +entrust +entrusted +entrusting +entrusts +entry +entryway +entryways +entwine +entwined +entwines +entwining +enumerable +enumerate +enumerated +enumerates +enumerating +enumeration +enumerations +enumerator +enumerators +enunciate +enunciated +enunciates +enunciating +enunciation +enure +enured +enures +enuresis +enuring +envelop +envelope +enveloped +enveloper +envelopers +envelopes +enveloping +envelopment +envelops +envenom +envenomed +envenoming +envenoms +enviable +enviably +envied +envies +envious +enviously +enviousness +environment +environmental +environmentalism +environmentalist +environmentalists +environmentally +environments +environs +envisage +envisaged +envisages +envisaging +envision +envisioned +envisioning +envisions +envoy +envoys +envy +envying +envyingly +enzymatic +enzyme +enzymes +eolian +eons +epaulet +epaulets +epaulette +epaulettes +epee +epees +ephedrine +ephemera +ephemeral +ephemerally +epic +epicenter +epicenters +epicentre +epicentres +epics +epicure +epicurean +epicureans +epicures +epidemic +epidemically +epidemics +epidemiologist +epidemiologists +epidemiology +epidermal +epidermic +epidermis +epidermises +epiglottides +epiglottis +epiglottises +epigram +epigrammatic +epigrams +epigraph +epigraphs +epigraphy +epilepsy +epileptic +epileptics +epilog +epilogs +epilogue +epilogues +epinephrin +epinephrine +epiphanies +epiphany +episcopacy +episcopal +episcopate +episode +episodes +episodic +episodically +epistle +epistles +epistolary +epitaph +epitaphs +epithelial +epithelium +epithet +epithets +epitome +epitomes +epitomize +epitomized +epitomizes +epitomizing +epoch +epochal +epochs +epoxied +epoxies +epoxy +epoxyed +epoxying +epsilon +epsilons +equability +equable +equably +equal +equaled +equaling +equality +equalization +equalize +equalized +equalizer +equalizers +equalizes +equalizing +equalled +equalling +equally +equals +equanimity +equatable +equate +equated +equates +equating +equation +equations +equator +equatorial +equators +equerries +equerry +equestrian +equestrianism +equestrians +equestrienne +equestriennes +equidistant +equidistantly +equilateral +equilaterals +equilibrium +equine +equines +equinoctial +equinox +equinoxes +equip +equipage +equipages +equipment +equipoise +equipped +equipping +equips +equitable +equitably +equitation +equities +equity +equivalence +equivalences +equivalencies +equivalency +equivalent +equivalently +equivalents +equivocal +equivocally +equivocalness +equivocate +equivocated +equivocates +equivocating +equivocation +equivocations +equivocator +equivocators +eradicable +eradicate +eradicated +eradicates +eradicating +eradication +eradicator +eradicators +eras +erasable +erase +erased +eraser +erasers +erases +erasing +erasure +erasures +erbium +erect +erected +erectile +erecting +erection +erections +erectly +erectness +erector +erectors +erects +erelong +eremite +eremites +ergo +ergonomic +ergonomically +ergonomics +ergosterol +ergot +ergs +ermine +ermines +erode +eroded +erodes +erodible +eroding +erogenous +erosion +erosive +erotic +erotica +erotically +eroticism +errand +errands +errant +errata +erratas +erratic +erratically +erratum +erred +erring +erroneous +erroneously +error +errors +errs +ersatz +ersatzes +erst +erstwhile +eruct +eructation +eructations +eructed +eructing +eructs +erudite +eruditely +erudition +erupt +erupted +erupting +eruption +eruptions +eruptive +erupts +erysipelas +erythrocyte +erythrocytes +escalate +escalated +escalates +escalating +escalation +escalations +escalator +escalators +escallop +escalloped +escalloping +escallops +escalop +escalops +escapade +escapades +escape +escaped +escapee +escapees +escapement +escapements +escapes +escaping +escapism +escapist +escapists +escargot +escargots +escarole +escaroles +escarpment +escarpments +eschew +eschewed +eschewing +eschews +escort +escorted +escorting +escorts +escritoire +escritoires +escrow +escrows +escudo +escudos +escutcheon +escutcheons +esophageal +esophagi +esophagus +esoteric +esoterically +espadrille +espadrilles +espalier +espaliered +espaliering +espaliers +especial +especially +espied +espies +espionage +esplanade +esplanades +espousal +espouse +espoused +espouses +espousing +espresso +espressos +esprit +espy +espying +esquire +esquires +essay +essayed +essayer +essayers +essaying +essayist +essayists +essays +essence +essences +essential +essentially +essentials +establish +established +establishes +establishing +establishment +establishments +estate +estates +esteem +esteemed +esteeming +esteems +ester +esters +esthete +esthetes +esthetic +esthetically +esthetics +estimable +estimate +estimated +estimates +estimating +estimation +estimations +estimator +estimators +estrange +estranged +estrangement +estrangements +estranges +estranging +estrogen +estrous +estrus +estruses +estuaries +estuary +etas +etch +etched +etcher +etchers +etches +etching +etchings +eternal +eternally +eternalness +eternities +eternity +ethane +ethanol +ether +ethereal +ethereally +ethic +ethical +ethically +ethics +ethnic +ethnically +ethnicity +ethnics +ethnocentric +ethnocentrism +ethnological +ethnologist +ethnologists +ethnology +ethological +ethologist +ethologists +ethology +ethos +ethyl +ethylene +etiologic +etiological +etiologies +etiology +etiquette +etude +etudes +etymological +etymologically +etymologies +etymologist +etymologists +etymology +eucalypti +eucalyptus +eucalyptuses +euchre +euchred +euchres +euchring +euclidean +eugenic +eugenically +eugenicist +eugenicists +eugenics +eulogies +eulogist +eulogistic +eulogists +eulogize +eulogized +eulogizer +eulogizers +eulogizes +eulogizing +eulogy +eunuch +eunuchs +euphemism +euphemisms +euphemistic +euphemistically +euphonious +euphoniously +euphony +euphoria +euphoric +euphorically +eureka +euro +europium +euros +euthanasia +euthanize +euthanized +euthanizes +euthanizing +euthenics +evacuate +evacuated +evacuates +evacuating +evacuation +evacuations +evacuee +evacuees +evade +evaded +evader +evaders +evades +evading +evaluate +evaluated +evaluates +evaluating +evaluation +evaluations +evanescence +evanescent +evangelic +evangelical +evangelicalism +evangelically +evangelicals +evangelism +evangelist +evangelistic +evangelists +evangelize +evangelized +evangelizes +evangelizing +evaporate +evaporated +evaporates +evaporating +evaporation +evaporator +evaporators +evasion +evasions +evasive +evasively +evasiveness +even +evened +evener +evenest +evenhanded +evenhandedly +evening +evenings +evenly +evenness +evens +evensong +event +eventful +eventfully +eventfulness +eventide +events +eventual +eventualities +eventuality +eventually +eventuate +eventuated +eventuates +eventuating +ever +everglade +everglades +evergreen +evergreens +everlasting +everlastingly +everlastings +evermore +every +everybody +everyday +everyone +everyplace +everything +everywhere +eves +evict +evicted +evicting +eviction +evictions +evicts +evidence +evidenced +evidences +evidencing +evident +evidently +evil +evildoer +evildoers +evildoing +eviler +evilest +eviller +evillest +evilly +evilness +evils +evince +evinced +evinces +evincing +eviscerate +eviscerated +eviscerates +eviscerating +evisceration +evocation +evocations +evocative +evocatively +evoke +evoked +evokes +evoking +evolution +evolutionary +evolutionist +evolutionists +evolve +evolved +evolves +evolving +ewer +ewers +ewes +exacerbate +exacerbated +exacerbates +exacerbating +exacerbation +exact +exacted +exacter +exactest +exacting +exactingly +exaction +exactitude +exactly +exactness +exacts +exaggerate +exaggerated +exaggeratedly +exaggerates +exaggerating +exaggeration +exaggerations +exaggerator +exaggerators +exalt +exaltation +exalted +exalting +exalts +exam +examination +examinations +examine +examined +examiner +examiners +examines +examining +example +exampled +examples +exampling +exams +exasperate +exasperated +exasperates +exasperating +exasperation +excavate +excavated +excavates +excavating +excavation +excavations +excavator +excavators +exceed +exceeded +exceeding +exceedingly +exceeds +excel +excelled +excellence +excellencies +excellency +excellent +excellently +excelling +excels +excelsior +except +excepted +excepting +exception +exceptionable +exceptional +exceptionally +exceptions +excepts +excerpt +excerpted +excerpting +excerpts +excess +excesses +excessive +excessively +exchange +exchangeable +exchanged +exchanges +exchanging +exchequer +exchequers +excise +excised +excises +excising +excision +excisions +excitability +excitable +excitably +excitation +excite +excited +excitedly +excitement +excitements +exciter +exciters +excites +exciting +excitingly +exclaim +exclaimed +exclaiming +exclaims +exclamation +exclamations +exclamatory +exclude +excluded +excludes +excluding +exclusion +exclusive +exclusively +exclusiveness +exclusives +exclusivity +excommunicate +excommunicated +excommunicates +excommunicating +excommunication +excommunications +excoriate +excoriated +excoriates +excoriating +excoriation +excoriations +excrement +excremental +excrescence +excrescences +excrescent +excreta +excrete +excreted +excretes +excreting +excretion +excretions +excretory +excruciating +excruciatingly +exculpate +exculpated +exculpates +exculpating +exculpation +exculpatory +excursion +excursionist +excursionists +excursions +excursive +excursively +excursiveness +excusable +excusably +excuse +excused +excuses +excusing +exec +execrable +execrably +execrate +execrated +execrates +execrating +execration +execs +execute +executed +executes +executing +execution +executioner +executioners +executions +executive +executives +executor +executors +executrices +executrix +executrixes +exegeses +exegesis +exegetic +exegetical +exemplar +exemplars +exemplary +exemplification +exemplifications +exemplified +exemplifies +exemplify +exemplifying +exempt +exempted +exempting +exemption +exemptions +exempts +exercise +exercised +exerciser +exercisers +exercises +exercising +exert +exerted +exerting +exertion +exertions +exerts +exes +exhalation +exhalations +exhale +exhaled +exhales +exhaling +exhaust +exhausted +exhaustible +exhausting +exhaustion +exhaustive +exhaustively +exhaustiveness +exhausts +exhibit +exhibited +exhibiting +exhibition +exhibitionism +exhibitionist +exhibitionists +exhibitions +exhibitor +exhibitors +exhibits +exhilarate +exhilarated +exhilarates +exhilarating +exhilaration +exhort +exhortation +exhortations +exhorted +exhorting +exhorts +exhumation +exhumations +exhume +exhumed +exhumes +exhuming +exigence +exigences +exigencies +exigency +exigent +exiguity +exiguous +exile +exiled +exiles +exiling +exist +existed +existence +existences +existent +existential +existentialism +existentialist +existentialists +existentially +existing +exists +exit +exited +exiting +exits +exobiology +exodus +exoduses +exogenous +exonerate +exonerated +exonerates +exonerating +exoneration +exorbitance +exorbitant +exorbitantly +exorcise +exorcised +exorcises +exorcising +exorcism +exorcisms +exorcist +exorcists +exorcize +exorcized +exorcizes +exorcizing +exoskeleton +exoskeletons +exosphere +exospheres +exothermic +exotic +exotically +exoticism +exotics +expand +expandable +expanded +expanding +expands +expanse +expanses +expansible +expansion +expansionary +expansionism +expansionist +expansionists +expansions +expansive +expansively +expansiveness +expatiate +expatiated +expatiates +expatiating +expatiation +expatriate +expatriated +expatriates +expatriating +expatriation +expect +expectancy +expectant +expectantly +expectation +expectations +expected +expecting +expectorant +expectorants +expectorate +expectorated +expectorates +expectorating +expectoration +expects +expedience +expediences +expediencies +expediency +expedient +expediently +expedients +expedite +expedited +expediter +expediters +expedites +expediting +expedition +expeditionary +expeditions +expeditious +expeditiously +expeditiousness +expeditor +expeditors +expel +expelled +expelling +expels +expend +expendable +expendables +expended +expending +expenditure +expenditures +expends +expense +expenses +expensive +expensively +expensiveness +experience +experienced +experiences +experiencing +experiment +experimental +experimentally +experimentation +experimented +experimenter +experimenters +experimenting +experiments +expert +expertise +expertly +expertness +experts +expiate +expiated +expiates +expiating +expiation +expiatory +expiration +expire +expired +expires +expiring +expiry +explain +explainable +explained +explaining +explains +explanation +explanations +explanatory +expletive +expletives +explicable +explicate +explicated +explicates +explicating +explication +explications +explicit +explicitly +explicitness +explode +exploded +explodes +exploding +exploit +exploitable +exploitation +exploitative +exploited +exploiter +exploiters +exploiting +exploits +exploration +explorations +exploratory +explore +explored +explorer +explorers +explores +exploring +explosion +explosions +explosive +explosively +explosiveness +explosives +expo +exponent +exponential +exponentially +exponents +export +exportable +exportation +exported +exporter +exporters +exporting +exports +expos +expose +exposed +exposes +exposing +exposition +expositions +expositor +expositors +expository +expostulate +expostulated +expostulates +expostulating +expostulation +expostulations +exposure +exposures +expound +expounded +expounder +expounders +expounding +expounds +express +expressed +expresses +expressible +expressing +expression +expressionism +expressionist +expressionistic +expressionists +expressionless +expressions +expressive +expressively +expressiveness +expressly +expressway +expressways +expropriate +expropriated +expropriates +expropriating +expropriation +expropriations +expropriator +expropriators +expulsion +expulsions +expunge +expunged +expunges +expunging +expurgate +expurgated +expurgates +expurgating +expurgation +expurgations +exquisite +exquisitely +exquisiteness +extant +extemporaneous +extemporaneously +extemporaneousness +extempore +extemporization +extemporize +extemporized +extemporizes +extemporizing +extend +extendable +extended +extender +extenders +extendible +extending +extends +extensible +extension +extensions +extensive +extensively +extensiveness +extent +extents +extenuate +extenuated +extenuates +extenuating +extenuation +exterior +exteriors +exterminate +exterminated +exterminates +exterminating +extermination +exterminations +exterminator +exterminators +external +externalization +externalizations +externalize +externalized +externalizes +externalizing +externally +externals +extinct +extincted +extincting +extinction +extinctions +extincts +extinguish +extinguishable +extinguished +extinguisher +extinguishers +extinguishes +extinguishing +extirpate +extirpated +extirpates +extirpating +extirpation +extol +extoll +extolled +extolling +extolls +extols +extort +extorted +extorting +extortion +extortionate +extortionately +extortioner +extortioners +extortionist +extortionists +extorts +extra +extract +extracted +extracting +extraction +extractions +extractor +extractors +extracts +extracurricular +extraditable +extradite +extradited +extradites +extraditing +extradition +extraditions +extralegal +extramarital +extramural +extraneous +extraneously +extraordinarily +extraordinary +extrapolate +extrapolated +extrapolates +extrapolating +extrapolation +extrapolations +extras +extrasensory +extraterrestrial +extraterrestrials +extraterritorial +extraterritoriality +extravagance +extravagances +extravagant +extravagantly +extravaganza +extravaganzas +extravehicular +extravert +extraverts +extreme +extremely +extremeness +extremer +extremes +extremest +extremism +extremist +extremists +extremities +extremity +extricable +extricate +extricated +extricates +extricating +extrication +extrinsic +extrinsically +extroversion +extrovert +extroverted +extroverts +extrude +extruded +extrudes +extruding +extrusion +extrusions +extrusive +exuberance +exuberant +exuberantly +exudation +exude +exuded +exudes +exuding +exult +exultant +exultantly +exultation +exulted +exulting +exults +exurb +exurban +exurbanite +exurbanites +exurbia +exurbs +eyeball +eyeballed +eyeballing +eyeballs +eyebrow +eyebrows +eyed +eyedropper +eyedroppers +eyeful +eyefuls +eyeglass +eyeglasses +eyeing +eyelash +eyelashes +eyeless +eyelet +eyelets +eyelid +eyelids +eyeliner +eyeliners +eyeopener +eyeopeners +eyeopening +eyepiece +eyepieces +eyes +eyesight +eyesore +eyesores +eyestrain +eyeteeth +eyetooth +eyewash +eyewitness +eyewitnesses +eying +eyrie +eyries +eyry +fable +fabled +fables +fabric +fabricate +fabricated +fabricates +fabricating +fabrication +fabrications +fabricator +fabricators +fabrics +fabulous +fabulously +facade +facades +face +facecloth +facecloths +faced +faceless +facelift +facelifts +faces +facet +faceted +faceting +facetious +facetiously +facetiousness +facets +facetted +facetting +facial +facially +facials +facile +facilely +facilitate +facilitated +facilitates +facilitating +facilitation +facilitator +facilitators +facilities +facility +facing +facings +facsimile +facsimiled +facsimileing +facsimiles +fact +faction +factional +factionalism +factions +factious +factitious +factoid +factoids +factor +factored +factorial +factorials +factories +factoring +factors +factory +factotum +factotums +facts +factual +factually +faculties +faculty +faddish +faddist +faddists +fade +faded +fades +fading +fads +faecal +faeces +faerie +faeries +faery +fagged +fagging +faggot +faggoting +faggots +fagot +fagoting +fagots +fags +faience +fail +failed +failing +failings +faille +fails +failure +failures +fain +fainer +fainest +faint +fainted +fainter +faintest +fainthearted +fainting +faintly +faintness +faints +fair +fairer +fairest +fairground +fairgrounds +fairies +fairing +fairings +fairly +fairness +fairs +fairway +fairways +fairy +fairyland +fairylands +faith +faithful +faithfully +faithfulness +faithfuls +faithless +faithlessly +faithlessness +faiths +fajita +fajitas +fake +faked +faker +fakers +fakes +faking +fakir +fakirs +falcon +falconer +falconers +falconry +falcons +fall +fallacies +fallacious +fallaciously +fallacy +fallen +fallibility +fallible +fallibleness +fallibly +falling +falloff +falloffs +fallout +fallow +fallowed +fallowing +fallows +falls +false +falsehood +falsehoods +falsely +falseness +falser +falsest +falsetto +falsettos +falsie +falsies +falsification +falsifications +falsified +falsifier +falsifiers +falsifies +falsify +falsifying +falsities +falsity +falter +faltered +faltering +falteringly +falters +fame +famed +familial +familiar +familiarity +familiarization +familiarize +familiarized +familiarizes +familiarizing +familiarly +familiars +families +family +famine +famines +famish +famished +famishes +famishing +famous +famously +fanatic +fanatical +fanatically +fanaticism +fanatics +fancied +fancier +fanciers +fancies +fanciest +fanciful +fancifully +fancifulness +fancily +fanciness +fancy +fancying +fancywork +fandango +fandangoes +fandangos +fanfare +fanfares +fang +fanged +fangs +fanlight +fanlights +fanned +fannies +fanning +fanny +fans +fantail +fantails +fantasia +fantasias +fantasied +fantasies +fantasize +fantasized +fantasizes +fantasizing +fantastic +fantastical +fantastically +fantasy +fantasying +fanzine +fanzines +farad +farads +faraway +farce +farces +farcical +farcically +fare +fared +fares +farewell +farewells +farfetched +farina +farinaceous +faring +farm +farmed +farmer +farmers +farmhand +farmhands +farmhouse +farmhouses +farming +farmland +farms +farmstead +farmsteads +farmyard +farmyards +faro +farrago +farragoes +farragos +farrier +farriers +farrow +farrowed +farrowing +farrows +farseeing +farsighted +farsightedness +fart +farted +farther +farthermost +farthest +farthing +farthings +farting +farts +fascia +fasciae +fascias +fascicle +fascicles +fascinate +fascinated +fascinates +fascinating +fascinatingly +fascination +fascinations +fascism +fascist +fascistic +fascists +fashion +fashionable +fashionably +fashioned +fashioner +fashioners +fashioning +fashions +fast +fastback +fastbacks +fastball +fastballs +fasted +fasten +fastened +fastener +fasteners +fastening +fastenings +fastens +faster +fastest +fastidious +fastidiously +fastidiousness +fasting +fastness +fastnesses +fasts +fatal +fatalism +fatalist +fatalistic +fatalistically +fatalists +fatalities +fatality +fatally +fatback +fate +fated +fateful +fatefully +fatefulness +fates +fathead +fatheaded +fatheads +father +fathered +fatherhood +fathering +fatherland +fatherlands +fatherless +fatherly +fathers +fathom +fathomable +fathomed +fathoming +fathomless +fathoms +fatigue +fatigued +fatigues +fatiguing +fating +fatness +fats +fatten +fattened +fattening +fattens +fatter +fattest +fattier +fatties +fattiest +fattiness +fatty +fatuity +fatuous +fatuously +fatuousness +fatwa +fatwas +faucet +faucets +fault +faulted +faultfinder +faultfinders +faultfinding +faultier +faultiest +faultily +faultiness +faulting +faultless +faultlessly +faultlessness +faults +faulty +faun +fauna +faunae +faunas +fauns +fauvism +fauvist +fauvists +favor +favorable +favorably +favored +favoring +favorite +favorites +favoritism +favors +favour +favoured +favouring +favours +fawn +fawned +fawner +fawners +fawnest +fawning +fawns +faxed +faxes +faxing +fayer +fayest +fays +faze +fazed +fazes +fazing +fealty +fear +feared +fearful +fearfully +fearfulness +fearing +fearless +fearlessly +fearlessness +fears +fearsome +feasibility +feasible +feasibly +feast +feasted +feaster +feasters +feasting +feasts +feat +feather +featherbedding +feathered +featherier +featheriest +feathering +featherless +feathers +featherweight +featherweights +feathery +feats +feature +featured +featureless +features +featuring +febrile +fecal +feces +feckless +fecklessly +fecund +fecundate +fecundated +fecundates +fecundating +fecundation +fecundity +federal +federalism +federalist +federalists +federalization +federalize +federalized +federalizes +federalizing +federally +federals +federate +federated +federates +federating +federation +federations +fedora +fedoras +feds +feeble +feebleness +feebler +feeblest +feebly +feed +feedback +feedbag +feedbags +feeder +feeders +feeding +feedings +feedlot +feedlots +feeds +feel +feeler +feelers +feeling +feelingly +feelings +feels +fees +feet +feign +feigned +feigning +feigns +feint +feinted +feinting +feints +feistier +feistiest +feisty +feldspar +felicitate +felicitated +felicitates +felicitating +felicitation +felicitations +felicities +felicitous +felicitously +felicity +feline +felines +fell +fellatio +felled +feller +fellest +felling +fellow +fellowman +fellowmen +fellows +fellowship +fellowships +fells +felon +felonies +felonious +felons +felony +felt +felted +felting +felts +female +femaleness +females +feminine +femininely +feminines +femininity +feminism +feminist +feminists +femora +femoral +femur +femurs +fence +fenced +fencer +fencers +fences +fencing +fend +fended +fender +fenders +fending +fends +fenestration +fennel +fens +feral +ferment +fermentation +fermented +fermenting +ferments +fermium +fern +fernier +ferniest +ferns +ferny +ferocious +ferociously +ferociousness +ferocity +ferret +ferreted +ferreting +ferrets +ferric +ferried +ferries +ferromagnetic +ferrous +ferrule +ferrules +ferry +ferryboat +ferryboats +ferrying +ferryman +ferrymen +fertile +fertility +fertilization +fertilize +fertilized +fertilizer +fertilizers +fertilizes +fertilizing +ferule +ferules +fervency +fervent +fervently +fervid +fervidly +fervor +fervour +fess +fessed +fesses +fessing +fest +festal +fester +festered +festering +festers +festival +festivals +festive +festively +festiveness +festivities +festivity +festoon +festooned +festooning +festoons +fests +feta +fetal +fetch +fetched +fetcher +fetchers +fetches +fetching +fetchingly +fete +feted +fetes +fetich +fetiches +fetid +fetidness +feting +fetish +fetishes +fetishism +fetishist +fetishistic +fetishists +fetlock +fetlocks +fetter +fettered +fettering +fetters +fettle +fettuccine +fetus +fetuses +feud +feudal +feudalism +feudalistic +feuded +feuding +feuds +fever +fevered +feverish +feverishly +feverishness +fevers +fewer +fewest +fewness +fezes +fezzes +fiance +fiancee +fiancees +fiances +fiasco +fiascoes +fiascos +fiat +fiats +fibbed +fibber +fibbers +fibbing +fiber +fiberboard +fiberfill +fiberglass +fibers +fibre +fibres +fibril +fibrillate +fibrillated +fibrillates +fibrillating +fibrillation +fibrils +fibrin +fibroid +fibrosis +fibrous +fibs +fibula +fibulae +fibular +fibulas +fiche +fiches +fichu +fichus +fickle +fickleness +fickler +ficklest +fiction +fictional +fictionalization +fictionalizations +fictionalize +fictionalized +fictionalizes +fictionalizing +fictionally +fictions +fictitious +fictitiously +fictive +ficus +fiddle +fiddled +fiddler +fiddlers +fiddles +fiddlesticks +fiddling +fidelity +fidget +fidgeted +fidgeting +fidgets +fidgety +fiduciaries +fiduciary +fief +fiefdom +fiefdoms +fiefs +field +fielded +fielder +fielders +fielding +fields +fieldwork +fieldworker +fieldworkers +fiend +fiendish +fiendishly +fiends +fierce +fiercely +fierceness +fiercer +fiercest +fierier +fieriest +fieriness +fiery +fiesta +fiestas +fife +fifer +fifers +fifes +fifteen +fifteens +fifteenth +fifteenths +fifth +fifthly +fifths +fifties +fiftieth +fiftieths +fifty +fight +fighter +fighters +fighting +fights +figment +figments +figs +figuration +figurative +figuratively +figure +figured +figurehead +figureheads +figures +figurine +figurines +figuring +filament +filamentous +filaments +filbert +filberts +filch +filched +filches +filching +file +filed +filer +filers +files +filet +fileted +fileting +filets +filial +filibuster +filibustered +filibusterer +filibusterers +filibustering +filibusters +filigree +filigreed +filigreeing +filigrees +filing +filings +fill +filled +filler +fillers +fillet +filleted +filleting +fillets +fillies +filling +fillings +fillip +filliped +filliping +fillips +fills +filly +film +filmed +filmier +filmiest +filminess +filming +filmmaker +filmmakers +films +filmstrip +filmstrips +filmy +filter +filterable +filtered +filterer +filterers +filtering +filters +filth +filthier +filthiest +filthily +filthiness +filthy +filtrable +filtrate +filtrated +filtrates +filtrating +filtration +finagle +finagled +finagler +finaglers +finagles +finagling +final +finale +finales +finalist +finalists +finality +finalization +finalize +finalized +finalizes +finalizing +finally +finals +finance +financed +finances +financial +financially +financier +financiers +financing +finch +finches +find +finder +finders +finding +findings +finds +fine +fined +finely +fineness +finer +finery +fines +finespun +finesse +finessed +finesses +finessing +finest +finger +fingerboard +fingerboards +fingered +fingering +fingerings +fingerling +fingerlings +fingernail +fingernails +fingerprint +fingerprinted +fingerprinting +fingerprints +fingers +fingertip +fingertips +finial +finials +finical +finickier +finickiest +finickiness +finicky +fining +finis +finises +finish +finished +finisher +finishers +finishes +finishing +finite +finitely +fink +finked +finking +finks +finned +finnier +finniest +finny +fins +fiord +fiords +fire +firearm +firearms +fireball +fireballs +firebomb +firebombed +firebombing +firebombs +firebox +fireboxes +firebrand +firebrands +firebreak +firebreaks +firebrick +firebricks +firebug +firebugs +firecracker +firecrackers +fired +firedamp +firefight +firefighter +firefighters +firefighting +firefights +fireflies +firefly +firehouse +firehouses +firelight +fireman +firemen +fireplace +fireplaces +fireplug +fireplugs +firepower +fireproof +fireproofed +fireproofing +fireproofs +firer +firers +fires +fireside +firesides +firestorm +firestorms +firetrap +firetraps +firetruck +firetrucks +firewall +firewalls +firewater +firewood +firework +fireworks +firing +firm +firmament +firmaments +firmed +firmer +firmest +firming +firmly +firmness +firms +firmware +firs +first +firstborn +firstborns +firsthand +firstly +firsts +firth +firths +fiscal +fiscally +fiscals +fish +fishbowl +fishbowls +fishcake +fishcakes +fished +fisher +fisheries +fisherman +fishermen +fishers +fishery +fishes +fishhook +fishhooks +fishier +fishiest +fishily +fishiness +fishing +fishmonger +fishmongers +fishnet +fishnets +fishpond +fishponds +fishtail +fishtailed +fishtailing +fishtails +fishwife +fishwives +fishy +fissile +fission +fissionable +fissure +fissures +fist +fistfight +fistfights +fistful +fistfuls +fisticuffs +fists +fistula +fistulae +fistulas +fistulous +fitful +fitfully +fitfulness +fitly +fitness +fits +fitted +fitter +fitters +fittest +fitting +fittingly +fittings +five +fives +fixable +fixate +fixated +fixates +fixating +fixation +fixations +fixative +fixatives +fixed +fixedly +fixer +fixers +fixes +fixing +fixings +fixity +fixture +fixtures +fizz +fizzed +fizzes +fizzier +fizziest +fizzing +fizzle +fizzled +fizzles +fizzling +fizzy +fjord +fjords +flab +flabbergast +flabbergasted +flabbergasting +flabbergasts +flabbier +flabbiest +flabbily +flabbiness +flabby +flaccid +flaccidity +flaccidly +flack +flacks +flag +flagella +flagellate +flagellated +flagellates +flagellating +flagellation +flagellum +flagellums +flagged +flagging +flagman +flagmen +flagon +flagons +flagpole +flagpoles +flagrance +flagrancy +flagrant +flagrantly +flags +flagship +flagships +flagstaff +flagstaffs +flagstone +flagstones +flail +flailed +flailing +flails +flair +flairs +flak +flake +flaked +flakes +flakier +flakiest +flakiness +flaking +flaky +flambe +flambeed +flambeing +flambes +flamboyance +flamboyancy +flamboyant +flamboyantly +flame +flamed +flamenco +flamencos +flameproof +flameproofed +flameproofing +flameproofs +flames +flamethrower +flamethrowers +flaming +flamingo +flamingoes +flamingos +flammability +flammable +flammables +flan +flange +flanges +flank +flanked +flanker +flankers +flanking +flanks +flannel +flanneled +flannelet +flannelette +flanneling +flannelled +flannelling +flannels +flans +flap +flapjack +flapjacks +flapped +flapper +flappers +flapping +flaps +flare +flared +flares +flareup +flareups +flaring +flash +flashback +flashbacks +flashbulb +flashbulbs +flashcard +flashcards +flashcube +flashcubes +flashed +flasher +flashers +flashes +flashest +flashgun +flashguns +flashier +flashiest +flashily +flashiness +flashing +flashlight +flashlights +flashpoint +flashpoints +flashy +flask +flasks +flat +flatbed +flatbeds +flatboat +flatboats +flatcar +flatcars +flatfeet +flatfish +flatfishes +flatfoot +flatfooted +flatfoots +flatiron +flatirons +flatland +flatly +flatness +flats +flatted +flatten +flattened +flattening +flattens +flatter +flattered +flatterer +flatterers +flattering +flatteringly +flatters +flattery +flattest +flatting +flattish +flattop +flattops +flatulence +flatulent +flatus +flatware +flatworm +flatworms +flaunt +flaunted +flaunting +flauntingly +flaunts +flautist +flautists +flavor +flavored +flavorful +flavoring +flavorings +flavorless +flavors +flavorsome +flavour +flavoured +flavouring +flavours +flaw +flawed +flawing +flawless +flawlessly +flawlessness +flaws +flax +flaxen +flay +flayed +flaying +flays +flea +fleabag +fleabags +fleas +fleck +flecked +flecking +flecks +fled +fledgeling +fledgelings +fledgling +fledglings +flee +fleece +fleeced +fleecer +fleecers +fleeces +fleecier +fleeciest +fleeciness +fleecing +fleecy +fleeing +flees +fleet +fleeted +fleeter +fleetest +fleeting +fleetingly +fleetingness +fleetly +fleetness +fleets +flesh +fleshed +fleshes +fleshier +fleshiest +fleshing +fleshlier +fleshliest +fleshly +fleshpot +fleshpots +fleshy +flew +flex +flexed +flexes +flexibility +flexible +flexibly +flexing +flexitime +flextime +flibbertigibbet +flibbertigibbets +flick +flicked +flicker +flickered +flickering +flickers +flicking +flicks +flied +flier +fliers +flies +fliest +flight +flightier +flightiest +flightiness +flightless +flights +flighty +flimflam +flimflammed +flimflamming +flimflams +flimsier +flimsiest +flimsily +flimsiness +flimsy +flinch +flinched +flinches +flinching +fling +flinging +flings +flint +flintier +flintiest +flintlock +flintlocks +flints +flinty +flip +flippancy +flippant +flippantly +flipped +flipper +flippers +flippest +flipping +flips +flirt +flirtation +flirtations +flirtatious +flirtatiously +flirtatiousness +flirted +flirting +flirts +flit +flits +flitted +flitting +float +floated +floater +floaters +floating +floats +flock +flocked +flocking +flocks +floe +floes +flog +flogged +flogger +floggers +flogging +floggings +flogs +flood +flooded +floodgate +floodgates +flooding +floodlight +floodlighted +floodlighting +floodlights +floodlit +floodplain +floodplains +floods +floodwater +floor +floorboard +floorboards +floored +flooring +floors +floorwalker +floorwalkers +floozie +floozies +floozy +flop +flophouse +flophouses +flopped +floppier +floppies +floppiest +floppily +floppiness +flopping +floppy +flops +flora +florae +floral +floras +florescence +florescent +floret +florets +florid +florider +floridest +floridly +floridness +florin +florins +florist +florists +floss +flossed +flosses +flossier +flossiest +flossing +flossy +flotation +flotations +flotilla +flotillas +flotsam +flounce +flounced +flounces +flouncier +flounciest +flouncing +flouncy +flounder +floundered +floundering +flounders +flour +floured +flouring +flourish +flourished +flourishes +flourishing +flours +floury +flout +flouted +flouter +flouters +flouting +flouts +flow +flowchart +flowcharts +flowed +flower +flowerbed +flowerbeds +flowered +flowerier +floweriest +floweriness +flowering +flowerless +flowerpot +flowerpots +flowers +flowery +flowing +flown +flows +flub +flubbed +flubbing +flubs +fluctuate +fluctuated +fluctuates +fluctuating +fluctuation +fluctuations +flue +fluency +fluent +fluently +flues +fluff +fluffed +fluffier +fluffiest +fluffiness +fluffing +fluffs +fluffy +fluid +fluidity +fluidly +fluids +fluke +flukes +flukey +flukier +flukiest +fluky +flume +flumes +flummox +flummoxed +flummoxes +flummoxing +flung +flunk +flunked +flunkey +flunkeys +flunkies +flunking +flunks +flunky +fluoresce +fluoresced +fluorescence +fluorescent +fluoresces +fluorescing +fluoridate +fluoridated +fluoridates +fluoridating +fluoridation +fluoride +fluorides +fluorine +fluorite +fluorocarbon +fluorocarbons +fluoroscope +fluoroscopes +fluoroscopic +flurried +flurries +flurry +flurrying +flush +flushed +flusher +flushes +flushest +flushing +fluster +flustered +flustering +flusters +flute +fluted +flutes +fluting +flutist +flutists +flutter +fluttered +fluttering +flutters +fluttery +flux +fluxed +fluxes +fluxing +flyable +flyblown +flyby +flybys +flycatcher +flycatchers +flyer +flyers +flying +flyleaf +flyleaves +flypaper +flypapers +flyspeck +flyspecked +flyspecking +flyspecks +flyswatter +flyswatters +flyway +flyways +flyweight +flyweights +flywheel +flywheels +foal +foaled +foaling +foals +foam +foamed +foamier +foamiest +foaminess +foaming +foams +foamy +fobbed +fobbing +fobs +focal +focally +foci +focus +focused +focuses +focusing +focussed +focusses +focussing +fodder +fodders +foes +foetal +foetus +foetuses +fogbound +fogey +fogeys +fogged +foggier +foggiest +foggily +fogginess +fogging +foggy +foghorn +foghorns +fogies +fogs +fogy +fogyish +foible +foibles +foil +foiled +foiling +foils +foist +foisted +foisting +foists +fold +foldaway +folded +folder +folders +folding +foldout +foldouts +folds +foliage +folio +folios +folk +folklore +folkloric +folklorist +folklorists +folks +folksier +folksiest +folksiness +folksinger +folksingers +folksinging +folksy +folktale +folktales +folkway +folkways +follicle +follicles +follies +follow +followed +follower +followers +following +followings +follows +folly +foment +fomentation +fomented +fomenting +foments +fond +fondant +fondants +fonder +fondest +fondle +fondled +fondles +fondling +fondly +fondness +fondu +fondue +fondues +font +fontanel +fontanelle +fontanelles +fontanels +fonts +food +foodie +foodies +foods +foodstuff +foodstuffs +fool +fooled +fooleries +foolery +foolhardier +foolhardiest +foolhardily +foolhardiness +foolhardy +fooling +foolish +foolishly +foolishness +foolproof +fools +foolscap +foot +footage +football +footballer +footballers +footballs +footbridge +footbridges +footed +footfall +footfalls +foothill +foothills +foothold +footholds +footing +footings +footless +footlights +footling +footlings +footlocker +footlockers +footloose +footman +footmen +footnote +footnoted +footnotes +footnoting +footpath +footpaths +footprint +footprints +footrace +footraces +footrest +footrests +foots +footsie +footsies +footsore +footstep +footsteps +footstool +footstools +footwear +footwork +foppery +foppish +foppishness +fops +fora +forage +foraged +forager +foragers +forages +foraging +foray +forayed +foraying +forays +forbad +forbade +forbear +forbearance +forbearing +forbears +forbid +forbidden +forbidding +forbiddingly +forbids +forbore +forborne +force +forced +forceful +forcefully +forcefulness +forceps +forces +forcible +forcibly +forcing +ford +fordable +forded +fording +fords +fore +forearm +forearmed +forearming +forearms +forebear +forebears +forebode +foreboded +forebodes +foreboding +forebodings +forecast +forecasted +forecaster +forecasters +forecasting +forecastle +forecastles +forecasts +foreclose +foreclosed +forecloses +foreclosing +foreclosure +foreclosures +forecourt +forecourts +foredoom +foredoomed +foredooming +foredooms +forefather +forefathers +forefeet +forefinger +forefingers +forefoot +forefront +forefronts +foregather +foregathered +foregathering +foregathers +forego +foregoes +foregoing +foregone +foreground +foregrounded +foregrounding +foregrounds +forehand +forehands +forehead +foreheads +foreign +foreigner +foreigners +foreignness +foreknew +foreknow +foreknowing +foreknowledge +foreknown +foreknows +foreleg +forelegs +forelimb +forelimbs +forelock +forelocks +foreman +foremast +foremasts +foremen +foremost +forename +forenamed +forenames +forenoon +forenoons +forensic +forensically +forensics +foreordain +foreordained +foreordaining +foreordains +forepart +foreparts +foreperson +forepersons +foreplay +forequarter +forequarters +forerunner +forerunners +fores +foresail +foresails +foresaw +foresee +foreseeable +foreseeing +foreseen +foreseer +foreseers +foresees +foreshadow +foreshadowed +foreshadowing +foreshadows +foreshorten +foreshortened +foreshortening +foreshortens +foresight +foresighted +foresightedness +foreskin +foreskins +forest +forestall +forestalled +forestalling +forestalls +forestation +forested +forester +foresters +foresting +forestland +forestry +forests +foreswear +foreswearing +foreswears +foreswore +foresworn +foretaste +foretasted +foretastes +foretasting +foretell +foretelling +foretells +forethought +foretold +forever +forevermore +forewarn +forewarned +forewarning +forewarns +forewent +forewoman +forewomen +foreword +forewords +forfeit +forfeited +forfeiting +forfeits +forfeiture +forgather +forgathered +forgathering +forgathers +forgave +forge +forged +forger +forgeries +forgers +forgery +forges +forget +forgetful +forgetfully +forgetfulness +forgets +forgettable +forgetting +forging +forgings +forgivable +forgive +forgiven +forgiveness +forgiver +forgivers +forgives +forgiving +forgo +forgoer +forgoers +forgoes +forgoing +forgone +forgot +forgotten +fork +forked +forkful +forkfuls +forking +forklift +forklifts +forks +forlorn +forlornly +form +formal +formaldehyde +formalism +formalist +formalists +formalities +formality +formalization +formalize +formalized +formalizes +formalizing +formally +formals +format +formated +formating +formation +formations +formative +formats +formatted +formatting +formed +former +formerly +formfitting +formic +formidable +formidably +forming +formless +formlessly +formlessness +forms +formula +formulae +formulaic +formulas +formulate +formulated +formulates +formulating +formulation +formulations +formulator +formulators +fornicate +fornicated +fornicates +fornicating +fornication +fornicator +fornicators +forsake +forsaken +forsakes +forsaking +forsook +forsooth +forswear +forswearing +forswears +forswore +forsworn +forsythia +forsythias +fort +forte +fortes +forth +forthcoming +forthright +forthrightly +forthrightness +forthwith +forties +fortieth +fortieths +fortification +fortifications +fortified +fortifier +fortifiers +fortifies +fortify +fortifying +fortissimo +fortitude +fortnight +fortnightly +fortnights +fortress +fortresses +forts +fortuitous +fortuitously +fortuitousness +fortuity +fortunate +fortunately +fortune +fortunes +fortuneteller +fortunetellers +fortunetelling +forty +forum +forums +forward +forwarded +forwarder +forwarders +forwardest +forwarding +forwardly +forwardness +forwards +forwent +fossil +fossilization +fossilize +fossilized +fossilizes +fossilizing +fossils +foster +fostered +fostering +fosters +fought +foul +foulard +fouled +fouler +foulest +fouling +foully +foulmouthed +foulness +fouls +found +foundation +foundations +founded +founder +foundered +foundering +founders +founding +foundling +foundlings +foundries +foundry +founds +fount +fountain +fountainhead +fountainheads +fountains +founts +four +fourfold +fourposter +fourposters +fours +fourscore +foursome +foursomes +foursquare +fourteen +fourteens +fourteenth +fourteenths +fourth +fourthly +fourths +fowl +fowled +fowling +fowls +foxed +foxes +foxfire +foxglove +foxgloves +foxhole +foxholes +foxhound +foxhounds +foxier +foxiest +foxily +foxiness +foxing +foxtrot +foxtrots +foxtrotted +foxtrotting +foxy +foyer +foyers +fracas +fracases +fractal +fractals +fraction +fractional +fractionally +fractions +fractious +fractiously +fractiousness +fracture +fractured +fractures +fracturing +fragile +fragility +fragment +fragmentary +fragmentation +fragmented +fragmenting +fragments +fragrance +fragrances +fragrant +fragrantly +frail +frailer +frailest +frailly +frailness +frailties +frailty +frame +framed +framer +framers +frames +framework +frameworks +framing +franc +franchise +franchised +franchisee +franchisees +franchiser +franchisers +franchises +franchising +franchisor +franchisors +francium +francs +frangibility +frangible +frank +franked +franker +frankest +frankfurter +frankfurters +frankincense +franking +frankly +frankness +franks +frantic +frantically +frappe +frappes +frat +fraternal +fraternally +fraternities +fraternity +fraternization +fraternize +fraternized +fraternizer +fraternizers +fraternizes +fraternizing +fratricidal +fratricide +fratricides +frats +fraud +frauds +fraudulence +fraudulent +fraudulently +fraught +fray +frayed +fraying +frays +frazzle +frazzled +frazzles +frazzling +freak +freaked +freakier +freakiest +freaking +freakish +freakishly +freakishness +freakout +freakouts +freaks +freaky +freckle +freckled +freckles +frecklier +freckliest +freckling +freckly +free +freebase +freebased +freebases +freebasing +freebee +freebees +freebie +freebies +freebooter +freebooters +freeborn +freed +freedman +freedmen +freedom +freedoms +freehand +freehold +freeholder +freeholders +freeholds +freeing +freelance +freelanced +freelancer +freelancers +freelances +freelancing +freeload +freeloaded +freeloader +freeloaders +freeloading +freeloads +freely +freeman +freemen +freer +frees +freest +freestanding +freestone +freestones +freestyle +freestyles +freethinker +freethinkers +freethinking +freeware +freeway +freeways +freewheel +freewheeled +freewheeling +freewheels +freewill +freezable +freeze +freezer +freezers +freezes +freezing +freight +freighted +freighter +freighters +freighting +freights +frenetic +frenetically +frenzied +frenziedly +frenzies +frenzy +frequencies +frequency +frequent +frequented +frequenter +frequenters +frequentest +frequenting +frequently +frequents +fresco +frescoes +frescos +fresh +freshen +freshened +freshener +fresheners +freshening +freshens +fresher +freshest +freshet +freshets +freshly +freshman +freshmen +freshness +freshwater +fret +fretful +fretfully +fretfulness +frets +fretsaw +fretsaws +fretted +fretting +fretwork +friable +friar +friaries +friars +friary +fricassee +fricasseed +fricasseeing +fricassees +fricative +fricatives +friction +frictional +fridge +fridges +fried +friedcake +friedcakes +friend +friendless +friendlier +friendlies +friendliest +friendliness +friendly +friends +friendship +friendships +frier +friers +fries +frieze +friezes +frig +frigate +frigates +frigged +frigging +fright +frighted +frighten +frightened +frightening +frighteningly +frightens +frightful +frightfully +frightfulness +frighting +frights +frigid +frigidity +frigidly +frigidness +frigs +frill +frillier +frilliest +frills +frilly +fringe +fringed +fringes +fringing +fripperies +frippery +frisk +frisked +friskier +friskiest +friskily +friskiness +frisking +frisks +frisky +fritter +frittered +frittering +fritters +fritz +frivolities +frivolity +frivolous +frivolously +frivolousness +friz +frizz +frizzed +frizzes +frizzier +frizziest +frizzing +frizzle +frizzled +frizzles +frizzlier +frizzliest +frizzling +frizzly +frizzy +frock +frocks +frog +frogman +frogmen +frogs +frolic +frolicked +frolicker +frolickers +frolicking +frolics +frolicsome +from +frond +fronds +front +frontage +frontages +frontal +frontally +fronted +frontier +frontiers +frontiersman +frontiersmen +fronting +frontispiece +frontispieces +frontrunner +frontrunners +fronts +frontward +frontwards +frosh +frost +frostbit +frostbite +frostbites +frostbiting +frostbitten +frosted +frostier +frostiest +frostily +frostiness +frosting +frostings +frosts +frosty +froth +frothed +frothier +frothiest +frothiness +frothing +froths +frothy +froufrou +froward +frowardness +frown +frowned +frowning +frowns +frowsier +frowsiest +frowsy +frowzier +frowziest +frowzily +frowziness +frowzy +froze +frozen +fructified +fructifies +fructify +fructifying +fructose +frugal +frugality +frugally +fruit +fruitcake +fruitcakes +fruited +fruitful +fruitfully +fruitfulness +fruitier +fruitiest +fruitiness +fruiting +fruition +fruitless +fruitlessly +fruitlessness +fruits +fruity +frump +frumpier +frumpiest +frumpish +frumps +frumpy +frusta +frustrate +frustrated +frustrates +frustrating +frustratingly +frustration +frustrations +frustum +frustums +fryer +fryers +frying +fuchsia +fuchsias +fuck +fucked +fucker +fuckers +fucking +fucks +fuddle +fuddled +fuddles +fuddling +fudge +fudged +fudges +fudging +fuehrer +fuehrers +fuel +fueled +fueling +fuelled +fuelling +fuels +fugal +fugitive +fugitives +fugue +fugues +fuhrer +fuhrers +fulcra +fulcrum +fulcrums +fulfil +fulfill +fulfilled +fulfilling +fulfillment +fulfills +fulfilment +fulfils +full +fullback +fullbacks +fulled +fuller +fullers +fullest +fulling +fullness +fulls +fully +fulminate +fulminated +fulminates +fulminating +fulmination +fulminations +fulness +fulsome +fulsomely +fulsomeness +fumble +fumbled +fumbler +fumblers +fumbles +fumbling +fumblingly +fume +fumed +fumes +fumier +fumiest +fumigant +fumigants +fumigate +fumigated +fumigates +fumigating +fumigation +fumigator +fumigators +fuming +fumy +function +functional +functionally +functionaries +functionary +functioned +functioning +functions +fund +fundamental +fundamentalism +fundamentalist +fundamentalists +fundamentally +fundamentals +funded +funding +fundraiser +fundraisers +funds +funeral +funerals +funerary +funereal +funereally +fungal +fungi +fungible +fungibles +fungicidal +fungicide +fungicides +fungoid +fungous +fungus +funguses +funicular +funiculars +funk +funked +funkier +funkiest +funkiness +funking +funks +funky +funnel +funneled +funneling +funnelled +funnelling +funnels +funner +funnest +funnier +funnies +funniest +funnily +funniness +funny +funnyman +funnymen +furbelow +furbish +furbished +furbishes +furbishing +furies +furious +furiously +furl +furled +furling +furlong +furlongs +furlough +furloughed +furloughing +furloughs +furls +furnace +furnaces +furnish +furnished +furnishes +furnishing +furnishings +furniture +furor +furore +furores +furors +furred +furrier +furriers +furriest +furriness +furring +furrow +furrowed +furrowing +furrows +furry +furs +further +furtherance +furthered +furthering +furthermore +furthermost +furthers +furthest +furtive +furtively +furtiveness +fury +furze +fuse +fused +fusee +fusees +fuselage +fuselages +fuses +fusibility +fusible +fusileer +fusileers +fusilier +fusiliers +fusillade +fusillades +fusing +fusion +fuss +fussbudget +fussbudgets +fussed +fusses +fussier +fussiest +fussily +fussiness +fussing +fusspot +fusspots +fussy +fustian +fustier +fustiest +fustiness +fusty +futile +futilely +futility +futon +futons +future +futures +futurism +futurist +futuristic +futurists +futurities +futurity +futurologist +futurologists +futurology +futz +futzed +futzes +futzing +fuze +fuzed +fuzes +fuzing +fuzz +fuzzed +fuzzes +fuzzier +fuzziest +fuzzily +fuzziness +fuzzing +fuzzy +gabardine +gabardines +gabbed +gabbier +gabbiest +gabbiness +gabbing +gabble +gabbled +gabbles +gabbling +gabby +gaberdine +gaberdines +gabfest +gabfests +gable +gabled +gables +gabs +gadabout +gadabouts +gadded +gadder +gadders +gadding +gadflies +gadfly +gadget +gadgetry +gadgets +gadolinium +gads +gaff +gaffe +gaffed +gaffer +gaffers +gaffes +gaffing +gaffs +gaga +gage +gaged +gages +gagged +gagging +gaggle +gaggles +gaging +gags +gaiety +gaily +gain +gained +gainer +gainers +gainful +gainfully +gaining +gains +gainsaid +gainsay +gainsayer +gainsayers +gainsaying +gainsays +gait +gaiter +gaiters +gaits +gala +galactic +galas +galaxies +galaxy +gale +galena +gales +gall +gallant +gallanter +gallantest +gallantly +gallantry +gallants +gallbladder +gallbladders +galled +galleon +galleons +galleria +gallerias +galleries +gallery +galley +galleys +gallimaufries +gallimaufry +galling +gallium +gallivant +gallivanted +gallivanting +gallivants +gallon +gallons +gallop +galloped +galloping +gallops +gallows +gallowses +galls +gallstone +gallstones +galoot +galoots +galore +galosh +galoshe +galoshes +gals +galumph +galumphed +galumphing +galumphs +galvanic +galvanise +galvanised +galvanises +galvanising +galvanism +galvanization +galvanize +galvanized +galvanizes +galvanizing +galvanometer +galvanometers +gambit +gambits +gamble +gambled +gambler +gamblers +gambles +gambling +gambol +gamboled +gamboling +gambolled +gambolling +gambols +game +gamecock +gamecocks +gamed +gamekeeper +gamekeepers +gamely +gameness +gamer +games +gamesmanship +gamest +gamester +gamesters +gamete +gametes +gametic +gamey +gamier +gamiest +gamin +gamine +gamines +gaminess +gaming +gamins +gamma +gammas +gammon +gamut +gamuts +gamy +gander +ganders +gang +gangbusters +ganged +ganging +gangland +ganglia +ganglier +gangliest +gangling +ganglion +ganglionic +ganglions +gangly +gangplank +gangplanks +gangrene +gangrened +gangrenes +gangrening +gangrenous +gangs +gangster +gangsters +gangway +gangways +gannet +gannets +gantlet +gantlets +gantries +gantry +gaol +gaoled +gaoler +gaolers +gaoling +gaols +gape +gaped +gapes +gaping +gaps +garage +garaged +garages +garaging +garb +garbage +garbanzo +garbanzos +garbed +garbing +garble +garbled +garbles +garbling +garbs +garcon +garcons +garden +gardened +gardener +gardeners +gardenia +gardenias +gardening +gardens +garfish +garfishes +gargantuan +gargle +gargled +gargles +gargling +gargoyle +gargoyles +garish +garishly +garishness +garland +garlanded +garlanding +garlands +garlic +garlicky +garment +garments +garner +garnered +garnering +garners +garnet +garnets +garnish +garnished +garnishee +garnisheed +garnisheeing +garnishees +garnishes +garnishing +garnishment +garnishments +garote +garoted +garotes +garoting +garotte +garotted +garottes +garotting +garret +garrets +garrison +garrisoned +garrisoning +garrisons +garrote +garroted +garroter +garroters +garrotes +garroting +garrotte +garrotted +garrottes +garrotting +garrulity +garrulous +garrulously +garrulousness +gars +garter +garters +gasbag +gasbags +gaseous +gases +gash +gashed +gashes +gashing +gasket +gaskets +gaslight +gaslights +gasohol +gasolene +gasoline +gasp +gasped +gasping +gasps +gassed +gasses +gassier +gassiest +gassing +gassy +gastric +gastritis +gastroenteritis +gastrointestinal +gastronomic +gastronomical +gastronomically +gastronomy +gastropod +gastropods +gasworks +gate +gatecrash +gatecrashed +gatecrasher +gatecrashers +gatecrashes +gatecrashing +gated +gatehouse +gatehouses +gatekeeper +gatekeepers +gatepost +gateposts +gates +gateway +gateways +gather +gathered +gatherer +gatherers +gathering +gatherings +gathers +gating +gator +gators +gauche +gauchely +gaucheness +gaucher +gaucherie +gauchest +gaucho +gauchos +gaudier +gaudiest +gaudily +gaudiness +gaudy +gauge +gauged +gauges +gauging +gaunt +gaunter +gauntest +gauntlet +gauntlets +gauntness +gauze +gauzier +gauziest +gauziness +gauzy +gave +gavel +gavels +gavotte +gavottes +gawk +gawked +gawkier +gawkiest +gawkily +gawkiness +gawking +gawks +gawky +gayer +gayest +gayety +gayly +gayness +gays +gaze +gazebo +gazeboes +gazebos +gazed +gazelle +gazelles +gazer +gazers +gazes +gazette +gazetted +gazetteer +gazetteers +gazettes +gazetting +gazing +gazpacho +gear +gearbox +gearboxes +geared +gearing +gears +gearshift +gearshifts +gearwheel +gearwheels +gecko +geckoes +geckos +geed +geegaw +geegaws +geeing +geek +geekier +geekiest +geeks +geeky +gees +geese +geez +geezer +geezers +geisha +geishas +gelatin +gelatine +gelatinous +gelcap +gelcaps +geld +gelded +gelding +geldings +gelds +gelid +gelignite +gelled +gelling +gels +gelt +gemmology +gemological +gemologist +gemologists +gemology +gems +gemstone +gemstones +gendarme +gendarmes +gender +genders +gene +genealogical +genealogically +genealogies +genealogist +genealogists +genealogy +genera +general +generalissimo +generalissimos +generalist +generalists +generalities +generality +generalization +generalizations +generalize +generalized +generalizes +generalizing +generally +generals +generalship +generate +generated +generates +generating +generation +generational +generations +generative +generator +generators +generic +generically +generics +generosities +generosity +generous +generously +generousness +genes +geneses +genesis +genetic +genetically +geneticist +geneticists +genetics +genial +geniality +genially +genie +genies +genii +genital +genitalia +genitally +genitals +genitive +genitives +genitourinary +genius +geniuses +genocidal +genocide +genome +genomes +genre +genres +gent +genteel +genteelly +genteelness +gentian +gentians +gentile +gentiles +gentility +gentle +gentled +gentlefolk +gentlefolks +gentleman +gentlemanly +gentlemen +gentleness +gentler +gentles +gentlest +gentlewoman +gentlewomen +gentling +gently +gentries +gentrification +gentrified +gentrifies +gentrify +gentrifying +gentry +gents +genuflect +genuflected +genuflecting +genuflection +genuflections +genuflects +genuine +genuinely +genuineness +genus +genuses +geocentric +geocentrically +geochemistry +geode +geodes +geodesic +geodesics +geodesy +geodetic +geographer +geographers +geographic +geographical +geographically +geographies +geography +geologic +geological +geologically +geologies +geologist +geologists +geology +geomagnetic +geomagnetism +geometric +geometrical +geometrically +geometries +geometry +geophysical +geophysicist +geophysicists +geophysics +geopolitical +geopolitics +geostationary +geosynchronous +geosyncline +geosynclines +geothermal +geothermic +geranium +geraniums +gerbil +gerbils +geriatric +geriatrics +germ +germane +germanium +germicidal +germicide +germicides +germinal +germinate +germinated +germinates +germinating +germination +germs +gerontological +gerontologist +gerontologists +gerontology +gerrymander +gerrymandered +gerrymandering +gerrymanders +gerund +gerunds +gestapo +gestapos +gestate +gestated +gestates +gestating +gestation +gestational +gesticulate +gesticulated +gesticulates +gesticulating +gesticulation +gesticulations +gestural +gesture +gestured +gestures +gesturing +gesundheit +getaway +getaways +gets +getting +getup +gewgaw +gewgaws +geyser +geysered +geysering +geysers +ghastlier +ghastliest +ghastliness +ghastly +ghat +ghats +gherkin +gherkins +ghetto +ghettoes +ghettoize +ghettoized +ghettoizes +ghettoizing +ghettos +ghost +ghosted +ghosting +ghostlier +ghostliest +ghostliness +ghostly +ghosts +ghostwrite +ghostwriter +ghostwriters +ghostwrites +ghostwriting +ghostwritten +ghostwrote +ghoul +ghoulish +ghoulishly +ghoulishness +ghouls +giant +giantess +giantesses +giants +gibber +gibbered +gibbering +gibberish +gibbers +gibbet +gibbeted +gibbeting +gibbets +gibbon +gibbons +gibbous +gibe +gibed +gibes +gibing +giblet +giblets +giddier +giddiest +giddily +giddiness +giddy +gift +gifted +gifting +gifts +gigabyte +gigabytes +gigahertz +gigantic +gigantically +gigged +gigging +giggle +giggled +giggler +gigglers +giggles +gigglier +giggliest +giggling +giggly +gigolo +gigolos +gigs +gild +gilded +gilder +gilders +gilding +gilds +gill +gills +gilt +gilts +gimbals +gimcrack +gimcrackery +gimcracks +gimlet +gimleted +gimleting +gimlets +gimme +gimmes +gimmick +gimmickry +gimmicks +gimmicky +gimp +gimped +gimpier +gimpiest +gimping +gimps +gimpy +ginger +gingerbread +gingerly +gingersnap +gingersnaps +gingery +gingham +gingivitis +gingko +gingkoes +gingkos +ginkgo +ginkgoes +ginkgos +ginned +ginning +gins +ginseng +gipsies +gipsy +giraffe +giraffes +gird +girded +girder +girders +girding +girdle +girdled +girdles +girdling +girds +girl +girlfriend +girlfriends +girlhood +girlhoods +girlish +girlishly +girlishness +girls +girly +girt +girted +girth +girths +girting +girts +gismo +gismos +gist +give +giveaway +giveaways +giveback +givebacks +given +givens +giver +givers +gives +giving +gizmo +gizmos +gizzard +gizzards +glace +glaceed +glaceing +glaces +glacial +glacially +glaciate +glaciated +glaciates +glaciating +glaciation +glaciations +glacier +glaciers +glad +gladden +gladdened +gladdening +gladdens +gladder +gladdest +glade +glades +gladiator +gladiatorial +gladiators +gladiola +gladiolas +gladioli +gladiolus +gladioluses +gladly +gladness +glads +gladsome +glamor +glamorization +glamorize +glamorized +glamorizes +glamorizing +glamorous +glamorously +glamour +glamourize +glamourized +glamourizes +glamourizing +glamourous +glance +glanced +glances +glancing +gland +glandes +glands +glandular +glans +glare +glared +glares +glaring +glaringly +glasnost +glass +glassblower +glassblowers +glassblowing +glassed +glasses +glassful +glassfuls +glassier +glassiest +glassily +glassiness +glassing +glassware +glassy +glaucoma +glaze +glazed +glazes +glazier +glaziers +glazing +gleam +gleamed +gleaming +gleams +glean +gleaned +gleaner +gleaners +gleaning +gleanings +gleans +glee +gleeful +gleefully +gleefulness +glen +glens +glib +glibber +glibbest +glibly +glibness +glide +glided +glider +gliders +glides +gliding +glimmer +glimmered +glimmering +glimmerings +glimmers +glimpse +glimpsed +glimpses +glimpsing +glint +glinted +glinting +glints +glissandi +glissando +glissandos +glisten +glistened +glistening +glistens +glister +glistered +glistering +glisters +glitch +glitches +glitter +glittered +glittering +glitters +glittery +glitz +glitzier +glitziest +glitzy +gloaming +gloamings +gloat +gloated +gloating +gloatingly +gloats +glob +global +globalism +globalist +globalists +globalization +globalize +globalized +globalizes +globalizing +globally +globe +globes +globetrotter +globetrotters +globs +globular +globule +globules +globulin +glockenspiel +glockenspiels +gloom +gloomier +gloomiest +gloomily +gloominess +gloomy +glop +gloppier +gloppiest +gloppy +gloried +glories +glorification +glorified +glorifies +glorify +glorifying +glorious +gloriously +glory +glorying +gloss +glossaries +glossary +glossed +glosses +glossier +glossies +glossiest +glossily +glossiness +glossing +glossolalia +glossy +glottal +glottides +glottis +glottises +glove +gloved +gloves +gloving +glow +glowed +glower +glowered +glowering +glowers +glowing +glowingly +glows +glowworm +glowworms +glucose +glue +glued +glueing +glues +gluey +gluier +gluiest +gluing +glum +glumly +glummer +glummest +glumness +glut +gluten +glutenous +glutinous +glutinously +gluts +glutted +glutting +glutton +gluttonous +gluttonously +gluttons +gluttony +glycerin +glycerine +glycerol +glycogen +gnarl +gnarled +gnarling +gnarls +gnash +gnashed +gnashes +gnashing +gnat +gnats +gnaw +gnawed +gnawing +gnawn +gnaws +gneiss +gnome +gnomes +gnomic +gnomish +gnus +goad +goaded +goading +goads +goal +goalie +goalies +goalkeeper +goalkeepers +goalkeeping +goalpost +goalposts +goals +goaltender +goaltenders +goat +goatee +goatees +goatherd +goatherds +goats +goatskin +goatskins +gobbed +gobbet +gobbets +gobbing +gobble +gobbled +gobbledegook +gobbledygook +gobbler +gobblers +gobbles +gobbling +goblet +goblets +goblin +goblins +gobs +godchild +godchildren +goddammit +goddamn +goddamned +goddaughter +goddaughters +goddess +goddesses +godfather +godfathers +godforsaken +godhead +godhood +godless +godlessness +godlier +godliest +godlike +godliness +godly +godmother +godmothers +godparent +godparents +gods +godsend +godsends +godson +godsons +goer +goers +goes +gofer +gofers +goggle +goggled +goggles +goggling +going +goings +goiter +goiters +goitre +goitres +gold +goldbrick +goldbricked +goldbricker +goldbrickers +goldbricking +goldbricks +golden +goldener +goldenest +goldenrod +goldfinch +goldfinches +goldfish +goldfishes +goldmine +goldmines +golds +goldsmith +goldsmiths +golf +golfed +golfer +golfers +golfing +golfs +gollies +golly +gonad +gonadal +gonads +gondola +gondolas +gondolier +gondoliers +gone +goner +goners +gong +gonged +gonging +gongs +gonna +gonorrhea +gonorrheal +gonorrhoea +goober +goobers +good +goodby +goodbye +goodbyes +goodbys +goodhearted +goodie +goodies +goodish +goodlier +goodliest +goodly +goodness +goods +goodwill +goody +gooey +goof +goofball +goofballs +goofed +goofier +goofiest +goofiness +goofing +goofs +goofy +gooier +gooiest +gook +gooks +goon +goons +goop +goose +gooseberries +gooseberry +goosebumps +goosed +gooseflesh +gooses +goosing +gopher +gophers +gore +gored +gores +gorge +gorged +gorgeous +gorgeously +gorgeousness +gorges +gorging +gorgon +gorgons +gorier +goriest +gorilla +gorillas +gorily +goriness +goring +gormandize +gormandized +gormandizer +gormandizers +gormandizes +gormandizing +gorp +gorse +gory +gosh +goshawk +goshawks +gosling +goslings +gospel +gospels +gossamer +gossip +gossiped +gossiper +gossipers +gossiping +gossipped +gossipping +gossips +gossipy +gotcha +gotta +gotten +gouge +gouged +gouger +gougers +gouges +gouging +goulash +goulashes +gourd +gourde +gourdes +gourds +gourmand +gourmands +gourmet +gourmets +gout +goutier +goutiest +gouty +govern +governable +governance +governed +governess +governesses +governing +government +governmental +governments +governor +governors +governorship +governs +gown +gowned +gowning +gowns +grab +grabbed +grabber +grabbers +grabbier +grabbiest +grabbing +grabby +grabs +grace +graced +graceful +gracefully +gracefulness +graceless +gracelessly +gracelessness +graces +gracing +gracious +graciously +graciousness +grackle +grackles +grad +gradate +gradated +gradates +gradating +gradation +gradations +grade +graded +grader +graders +grades +gradient +gradients +grading +grads +gradual +gradualism +gradually +gradualness +graduate +graduated +graduates +graduating +graduation +graduations +graffiti +graffito +graft +grafted +grafter +grafters +grafting +grafts +graham +grain +grained +grainier +grainiest +graininess +grains +grainy +gram +grammar +grammarian +grammarians +grammars +grammatical +grammatically +gramme +grammes +gramophone +gramophones +grampus +grampuses +grams +granaries +granary +grand +grandam +grandams +grandaunt +grandaunts +grandchild +grandchildren +granddad +granddaddies +granddaddy +granddads +granddaughter +granddaughters +grandee +grandees +grander +grandest +grandeur +grandfather +grandfathered +grandfathering +grandfatherly +grandfathers +grandiloquence +grandiloquent +grandiose +grandiosely +grandiosity +grandly +grandma +grandmas +grandmother +grandmotherly +grandmothers +grandnephew +grandnephews +grandness +grandniece +grandnieces +grandpa +grandparent +grandparents +grandpas +grands +grandson +grandsons +grandstand +grandstanded +grandstanding +grandstands +granduncle +granduncles +grange +granges +granite +granitic +grannie +grannies +granny +granola +grant +granted +grantee +grantees +granter +granters +granting +grantor +grantors +grants +grantsmanship +granular +granularity +granulate +granulated +granulates +granulating +granulation +granule +granules +grape +grapefruit +grapefruits +grapes +grapeshot +grapevine +grapevines +graph +graphed +graphic +graphical +graphically +graphics +graphing +graphite +graphologist +graphologists +graphology +graphs +grapnel +grapnels +grapple +grappled +grapples +grappling +grasp +graspable +grasped +grasping +grasps +grass +grassed +grasses +grasshopper +grasshoppers +grassier +grassiest +grassing +grassland +grassy +grate +grated +grateful +gratefully +gratefulness +grater +graters +grates +gratification +gratifications +gratified +gratifies +gratify +gratifying +grating +gratingly +gratings +gratis +gratitude +gratuities +gratuitous +gratuitously +gratuitousness +gratuity +gravamen +gravamens +gravamina +grave +graved +gravedigger +gravediggers +gravel +graveled +graveling +gravelled +gravelling +gravelly +gravels +gravely +graven +graveness +graver +graves +graveside +gravesides +gravest +gravestone +gravestones +graveyard +graveyards +gravid +gravies +gravimeter +gravimeters +graving +gravitate +gravitated +gravitates +gravitating +gravitation +gravitational +gravity +gravy +gray +graybeard +graybeards +grayed +grayer +grayest +graying +grayish +grayness +grays +graze +grazed +grazer +grazers +grazes +grazing +grease +greased +greasepaint +greases +greasier +greasiest +greasily +greasiness +greasing +greasy +great +greatcoat +greatcoats +greater +greatest +greathearted +greatly +greatness +greats +grebe +grebes +greed +greedier +greediest +greedily +greediness +greedy +green +greenback +greenbacks +greenbelt +greenbelts +greened +greener +greenery +greenest +greengage +greengages +greengrocer +greengrocers +greenhorn +greenhorns +greenhouse +greenhouses +greening +greenish +greenly +greenmail +greenness +greenroom +greenrooms +greens +greensward +greenwood +greet +greeted +greeter +greeters +greeting +greetings +greets +gregarious +gregariously +gregariousness +gremlin +gremlins +grenade +grenades +grenadier +grenadiers +grenadine +grew +grey +greyed +greyer +greyest +greyhound +greyhounds +greying +greys +grid +griddle +griddlecake +griddlecakes +griddles +gridiron +gridirons +gridlock +gridlocked +gridlocks +grids +grief +griefs +grievance +grievances +grieve +grieved +griever +grievers +grieves +grieving +grievous +grievously +grievousness +griffin +griffins +griffon +griffons +grill +grille +grilled +grilles +grilling +grills +grim +grimace +grimaced +grimaces +grimacing +grime +grimed +grimes +grimier +grimiest +griminess +griming +grimly +grimmer +grimmest +grimness +grimy +grin +grind +grinder +grinders +grinding +grinds +grindstone +grindstones +gringo +gringos +grinned +grinning +grins +grip +gripe +griped +griper +gripers +gripes +griping +grippe +gripped +gripper +grippers +gripping +grips +gript +grislier +grisliest +grisliness +grisly +grist +gristle +gristlier +gristliest +gristly +gristmill +gristmills +grit +grits +gritted +gritter +gritters +grittier +grittiest +grittiness +gritting +gritty +grizzled +grizzlier +grizzlies +grizzliest +grizzly +groan +groaned +groaning +groans +groat +groats +grocer +groceries +grocers +grocery +grog +groggier +groggiest +groggily +grogginess +groggy +groin +groins +grommet +grommets +groom +groomed +groomer +groomers +grooming +grooms +groomsman +groomsmen +groove +grooved +grooves +groovier +grooviest +grooving +groovy +grope +groped +groper +gropers +gropes +groping +grosbeak +grosbeaks +grosgrain +gross +grossed +grosser +grosses +grossest +grossing +grossly +grossness +grotesque +grotesquely +grotesqueness +grotesques +grotto +grottoes +grottos +grouch +grouched +grouches +grouchier +grouchiest +grouchily +grouchiness +grouching +grouchy +ground +groundbreaking +groundbreakings +grounded +grounder +grounders +groundhog +groundhogs +grounding +groundings +groundless +groundlessly +groundnut +groundnuts +grounds +groundswell +groundswells +groundwater +groundwork +group +grouped +grouper +groupers +groupie +groupies +grouping +groupings +groups +groupware +grouse +groused +grouser +grousers +grouses +grousing +grout +grouted +grouting +grouts +grove +grovel +groveled +groveler +grovelers +groveling +grovelled +groveller +grovellers +grovelling +grovels +groves +grow +grower +growers +growing +growl +growled +growler +growlers +growling +growls +grown +grownup +grownups +grows +growth +growths +grub +grubbed +grubber +grubbers +grubbier +grubbiest +grubbily +grubbiness +grubbing +grubby +grubs +grubstake +grudge +grudged +grudges +grudging +grudgingly +gruel +grueling +gruelling +gruesome +gruesomely +gruesomeness +gruesomer +gruesomest +gruff +gruffer +gruffest +gruffly +gruffness +grumble +grumbled +grumbler +grumblers +grumbles +grumbling +grump +grumpier +grumpiest +grumpily +grumpiness +grumps +grumpy +grunge +grungier +grungiest +grungy +grunion +grunions +grunt +grunted +grunting +grunts +gryphon +gryphons +guacamole +guanine +guano +guarani +guaranies +guaranis +guarantee +guaranteed +guaranteeing +guarantees +guarantied +guaranties +guarantor +guarantors +guaranty +guarantying +guard +guarded +guardedly +guarder +guarders +guardhouse +guardhouses +guardian +guardians +guardianship +guarding +guardrail +guardrails +guardroom +guardrooms +guards +guardsman +guardsmen +guava +guavas +gubernatorial +guerilla +guerillas +guerrilla +guerrillas +guess +guessed +guesser +guessers +guesses +guessing +guesstimate +guesstimated +guesstimates +guesstimating +guesswork +guest +guested +guesting +guests +guff +guffaw +guffawed +guffawing +guffaws +guidance +guide +guidebook +guidebooks +guided +guideline +guidelines +guidepost +guideposts +guider +guiders +guides +guiding +guild +guilder +guilders +guildhall +guildhalls +guilds +guile +guileful +guileless +guilelessly +guilelessness +guillotine +guillotined +guillotines +guillotining +guilt +guilted +guiltier +guiltiest +guiltily +guiltiness +guilting +guiltless +guilts +guilty +guinea +guineas +guise +guises +guitar +guitarist +guitarists +guitars +gulag +gulags +gulch +gulches +gulden +guldens +gulf +gulfs +gull +gulled +gullet +gullets +gulley +gulleys +gullibility +gullible +gullies +gulling +gulls +gully +gulp +gulped +gulper +gulpers +gulping +gulps +gumbo +gumboil +gumboils +gumbos +gumdrop +gumdrops +gummed +gummier +gummiest +gumming +gummy +gumption +gums +gumshoe +gumshoed +gumshoeing +gumshoes +gunboat +gunboats +gunfight +gunfighter +gunfighters +gunfights +gunfire +gunk +gunkier +gunkiest +gunky +gunman +gunmen +gunmetal +gunned +gunnel +gunnels +gunner +gunners +gunnery +gunning +gunny +gunnysack +gunnysacks +gunpoint +gunpowder +gunrunner +gunrunners +gunrunning +guns +gunship +gunships +gunshot +gunshots +gunslinger +gunslingers +gunsmith +gunsmiths +gunwale +gunwales +guppies +guppy +gurgle +gurgled +gurgles +gurgling +gurney +gurneys +guru +gurus +gush +gushed +gusher +gushers +gushes +gushier +gushiest +gushing +gushy +gusset +gusseted +gusseting +gussets +gussied +gussies +gussy +gussying +gust +gustatory +gusted +gustier +gustiest +gustily +gusting +gusto +gusts +gusty +gutless +gutlessness +guts +gutsier +gutsiest +gutsy +gutted +gutter +guttered +guttering +gutters +guttersnipe +guttersnipes +guttier +guttiest +gutting +guttural +gutturals +gutty +guyed +guying +guys +guzzle +guzzled +guzzler +guzzlers +guzzles +guzzling +gymkhana +gymkhanas +gymnasia +gymnasium +gymnasiums +gymnast +gymnastic +gymnastically +gymnastics +gymnasts +gymnosperm +gymnosperms +gyms +gynaecology +gynecologic +gynecological +gynecologist +gynecologists +gynecology +gypped +gypper +gyppers +gypping +gyps +gypsies +gypster +gypsters +gypsum +gypsy +gyrate +gyrated +gyrates +gyrating +gyration +gyrations +gyrator +gyrators +gyrfalcon +gyrfalcons +gyro +gyros +gyroscope +gyroscopes +gyroscopic +gyve +gyved +gyves +gyving +haberdasher +haberdasheries +haberdashers +haberdashery +habiliment +habiliments +habit +habitability +habitable +habitat +habitation +habitations +habitats +habits +habitual +habitually +habitualness +habituate +habituated +habituates +habituating +habituation +habitue +habitues +hacienda +haciendas +hack +hacked +hacker +hackers +hacking +hackle +hackles +hackney +hackneyed +hackneying +hackneys +hacks +hacksaw +hacksaws +hackwork +haddock +haddocks +hadj +hadjes +hadji +hadjis +hadst +haemoglobin +haemophilia +haemorrhage +haemorrhaged +haemorrhages +haemorrhaging +haemorrhoids +hafnium +haft +hafts +haggard +haggardly +haggardness +haggis +haggises +haggish +haggle +haggled +haggler +hagglers +haggles +haggling +hagiographer +hagiographers +hagiographies +hagiography +hags +hahnium +haiku +hail +hailed +hailing +hails +hailstone +hailstones +hailstorm +hailstorms +hair +hairball +hairballs +hairbreadth +hairbreadths +hairbrush +hairbrushes +haircloth +haircut +haircuts +hairdo +hairdos +hairdresser +hairdressers +hairdressing +hairdryer +hairdryers +haired +hairier +hairiest +hairiness +hairless +hairlike +hairline +hairlines +hairnet +hairnets +hairpiece +hairpieces +hairpin +hairpins +hairs +hairsbreadth +hairsbreadths +hairsplitter +hairsplitters +hairsplitting +hairspring +hairsprings +hairstyle +hairstyles +hairstylist +hairstylists +hairy +hajj +hajjes +hajji +hajjis +hake +hakes +halal +halberd +halberds +halcyon +hale +haled +haler +hales +halest +half +halfback +halfbacks +halfhearted +halfheartedly +halfheartedness +halfpence +halfpennies +halfpenny +halftime +halftimes +halftone +halftones +halfway +halfwit +halfwits +halibut +halibuts +haling +halite +halitosis +hall +halleluiah +halleluiahs +hallelujah +hallelujahs +halliard +halliards +hallmark +hallmarked +hallmarking +hallmarks +hallo +halloo +hallooed +hallooing +halloos +hallos +hallow +hallowed +hallowing +hallows +halls +hallucinate +hallucinated +hallucinates +hallucinating +hallucination +hallucinations +hallucinatory +hallucinogen +hallucinogenic +hallucinogenics +hallucinogens +hallway +hallways +halo +haloed +haloes +halogen +halogens +haloing +halos +halt +halted +halter +haltered +haltering +halters +halting +haltingly +halts +halve +halved +halves +halving +halyard +halyards +hamburg +hamburger +hamburgers +hamburgs +hamlet +hamlets +hammed +hammer +hammered +hammerer +hammerers +hammerhead +hammerheads +hammering +hammerlock +hammerlocks +hammers +hammertoe +hammertoes +hammier +hammiest +hamming +hammock +hammocks +hammy +hamper +hampered +hampering +hampers +hams +hamster +hamsters +hamstring +hamstringing +hamstrings +hamstrung +hand +handbag +handbags +handball +handballs +handbarrow +handbarrows +handbill +handbills +handbook +handbooks +handcar +handcars +handcart +handcarts +handclasp +handclasps +handcraft +handcrafted +handcrafting +handcrafts +handcuff +handcuffed +handcuffing +handcuffs +handed +handful +handfuls +handgun +handguns +handhold +handholds +handicap +handicapped +handicapper +handicappers +handicapping +handicaps +handicraft +handicrafts +handier +handiest +handily +handiness +handing +handiwork +handkerchief +handkerchiefs +handkerchieves +handle +handlebar +handlebars +handled +handler +handlers +handles +handling +handmade +handmaid +handmaiden +handmaidens +handmaids +handout +handouts +handpick +handpicked +handpicking +handpicks +handrail +handrails +hands +handsaw +handsaws +handset +handsets +handsful +handshake +handshakes +handsome +handsomely +handsomeness +handsomer +handsomest +handspring +handsprings +handstand +handstands +handwork +handwoven +handwriting +handwritten +handy +handyman +handymen +hang +hangar +hangars +hangdog +hanged +hanger +hangers +hanging +hangings +hangman +hangmen +hangnail +hangnails +hangout +hangouts +hangover +hangovers +hangs +hangup +hangups +hank +hanker +hankered +hankering +hankerings +hankers +hankie +hankies +hanks +hanky +hansom +hansoms +haphazard +haphazardly +haphazardness +hapless +haplessly +haplessness +haploid +haploids +haply +happen +happened +happening +happenings +happens +happenstance +happenstances +happier +happiest +happily +happiness +happy +harangue +harangued +harangues +haranguing +harass +harassed +harasser +harassers +harasses +harassing +harassment +harbinger +harbingers +harbor +harbored +harboring +harbors +harbour +harboured +harbouring +harbours +hard +hardback +hardbacks +hardball +hardboard +hardbound +hardcore +hardcover +hardcovers +harden +hardened +hardener +hardeners +hardening +hardens +harder +hardest +hardhat +hardhats +hardheaded +hardheadedly +hardheadedness +hardhearted +hardheartedly +hardheartedness +hardier +hardiest +hardihood +hardily +hardiness +hardline +hardliner +hardliners +hardly +hardness +hardscrabble +hardship +hardships +hardstand +hardstands +hardtack +hardtop +hardtops +hardware +hardwood +hardwoods +hardworking +hardy +hare +harebell +harebells +harebrained +hared +harelip +harelipped +harelips +harem +harems +hares +haring +hark +harked +harken +harkened +harkening +harkens +harking +harks +harlequin +harlequins +harlot +harlotry +harlots +harm +harmed +harmful +harmfully +harmfulness +harming +harmless +harmlessly +harmlessness +harmonic +harmonica +harmonically +harmonicas +harmonics +harmonies +harmonious +harmoniously +harmoniousness +harmonium +harmoniums +harmonization +harmonize +harmonized +harmonizer +harmonizers +harmonizes +harmonizing +harmony +harms +harness +harnessed +harnesses +harnessing +harp +harped +harpies +harping +harpist +harpists +harpoon +harpooned +harpooner +harpooners +harpooning +harpoons +harps +harpsichord +harpsichordist +harpsichordists +harpsichords +harpy +harridan +harridans +harried +harrier +harriers +harries +harrow +harrowed +harrowing +harrows +harry +harrying +harsh +harsher +harshest +harshly +harshness +hart +harts +harvest +harvested +harvester +harvesters +harvesting +harvests +hash +hashed +hasheesh +hashes +hashing +hashish +hasp +hasps +hassle +hassled +hassles +hassling +hassock +hassocks +hast +haste +hasted +hasten +hastened +hastening +hastens +hastes +hastier +hastiest +hastily +hastiness +hasting +hasty +hatbox +hatboxes +hatch +hatchback +hatchbacks +hatcheck +hatchecks +hatched +hatcheries +hatchery +hatches +hatchet +hatchets +hatching +hatchway +hatchways +hate +hated +hateful +hatefully +hatefulness +hatemonger +hatemongers +hater +haters +hates +hath +hating +hatred +hatreds +hats +hatted +hatter +hatters +hatting +hauberk +hauberks +haughtier +haughtiest +haughtily +haughtiness +haughty +haul +haulage +hauled +hauler +haulers +hauling +hauls +haunch +haunches +haunt +haunted +haunter +haunters +haunting +hauntingly +haunts +hauteur +have +haven +havens +haversack +haversacks +haves +having +havoc +hawed +hawing +hawk +hawked +hawker +hawkers +hawking +hawkish +hawkishness +hawks +haws +hawser +hawsers +hawthorn +hawthorns +haycock +haycocks +hayed +haying +hayloft +haylofts +haymow +haymows +hayrick +hayricks +hayride +hayrides +hays +hayseed +hayseeds +haystack +haystacks +haywire +hazard +hazarded +hazarding +hazardous +hazardously +hazards +haze +hazed +hazel +hazelnut +hazelnuts +hazels +hazer +hazers +hazes +hazier +haziest +hazily +haziness +hazing +hazings +hazy +head +headache +headaches +headband +headbands +headboard +headboards +headdress +headdresses +headed +header +headers +headfirst +headgear +headhunt +headhunted +headhunter +headhunters +headhunting +headhunts +headier +headiest +headily +headiness +heading +headings +headlamp +headlamps +headland +headlands +headless +headlight +headlights +headline +headlined +headliner +headliners +headlines +headlining +headlock +headlocks +headlong +headman +headmaster +headmasters +headmen +headmistress +headmistresses +headphone +headphones +headpiece +headpieces +headpin +headpins +headquarter +headquartered +headquartering +headquarters +headrest +headrests +headroom +heads +headset +headsets +headship +headships +headshrinker +headshrinkers +headsman +headsmen +headstall +headstalls +headstand +headstands +headstone +headstones +headstrong +headwaiter +headwaiters +headwaters +headway +headwind +headwinds +headword +headwords +heady +heal +healed +healer +healers +healing +heals +health +healthcare +healthful +healthfully +healthfulness +healthier +healthiest +healthily +healthiness +healthy +heap +heaped +heaping +heaps +hear +heard +hearer +hearers +hearing +hearings +hearken +hearkened +hearkening +hearkens +hears +hearsay +hearse +hearses +heart +heartache +heartaches +heartbeat +heartbeats +heartbreak +heartbreaking +heartbreaks +heartbroken +heartburn +hearten +heartened +heartening +heartens +heartfelt +hearth +hearths +hearthstone +hearthstones +heartier +hearties +heartiest +heartily +heartiness +heartland +heartlands +heartless +heartlessly +heartlessness +heartrending +heartrendingly +hearts +heartsick +heartsickness +heartstrings +heartthrob +heartthrobs +heartwarming +heartwood +hearty +heat +heated +heatedly +heater +heaters +heath +heathen +heathendom +heathenish +heathenism +heathens +heather +heaths +heating +heatproof +heatproofed +heatproofing +heatproofs +heats +heatstroke +heave +heaved +heaven +heavenlier +heavenliest +heavenly +heavens +heavenward +heavenwards +heaver +heavers +heaves +heavier +heavies +heaviest +heavily +heaviness +heaving +heavy +heavyhearted +heavyset +heavyweight +heavyweights +heck +heckle +heckled +heckler +hecklers +heckles +heckling +hectare +hectares +hectic +hectically +hectogram +hectograms +hectometer +hectometers +hector +hectored +hectoring +hectors +hedge +hedged +hedgehog +hedgehogs +hedgehop +hedgehopped +hedgehopping +hedgehops +hedger +hedgerow +hedgerows +hedgers +hedges +hedging +hedonism +hedonist +hedonistic +hedonists +heed +heeded +heedful +heedfully +heeding +heedless +heedlessly +heedlessness +heeds +heehaw +heehawed +heehawing +heehaws +heel +heeled +heeling +heelless +heels +heft +hefted +heftier +heftiest +heftily +heftiness +hefting +hefts +hefty +hegemony +hegira +hegiras +heifer +heifers +height +heighten +heightened +heightening +heightens +heights +heinous +heinously +heinousness +heir +heiress +heiresses +heirloom +heirlooms +heirs +heist +heisted +heisting +heists +held +helical +helices +helicopter +helicoptered +helicoptering +helicopters +heliocentric +heliotrope +heliotropes +heliport +heliports +helium +helix +helixes +hell +hellbent +hellcat +hellcats +hellebore +hellhole +hellholes +hellion +hellions +hellish +hellishly +hellishness +hello +hellos +helluva +helm +helmet +helmeted +helmets +helms +helmsman +helmsmen +helot +helots +help +helped +helper +helpers +helpful +helpfully +helpfulness +helping +helpings +helpless +helplessly +helplessness +helpmate +helpmates +helpmeet +helpmeets +helps +helve +helves +hematite +hematologic +hematological +hematologist +hematologists +hematology +heme +hemisphere +hemispheres +hemispheric +hemispherical +hemline +hemlines +hemlock +hemlocks +hemmed +hemmer +hemmers +hemming +hemoglobin +hemophilia +hemophiliac +hemophiliacs +hemorrhage +hemorrhaged +hemorrhages +hemorrhagic +hemorrhaging +hemorrhoid +hemorrhoids +hemostat +hemostats +hemp +hempen +hems +hemstitch +hemstitched +hemstitches +hemstitching +hence +henceforth +henceforward +henchman +henchmen +henna +hennaed +hennaing +hennas +henpeck +henpecked +henpecking +henpecks +hens +heparin +hepatic +hepatitis +hepper +heppest +heptagon +heptagonal +heptagons +heptathlon +heptathlons +herald +heralded +heraldic +heralding +heraldry +heralds +herb +herbaceous +herbage +herbal +herbalist +herbalists +herbicidal +herbicide +herbicides +herbivore +herbivores +herbivorous +herbs +herculean +herd +herded +herder +herders +herding +herds +herdsman +herdsmen +here +hereabout +hereabouts +hereafter +hereafters +hereby +hereditary +heredity +herein +hereof +hereon +heresies +heresy +heretic +heretical +heretics +hereto +heretofore +hereunto +hereupon +herewith +heritable +heritage +heritages +hermaphrodite +hermaphrodites +hermaphroditic +hermetic +hermetical +hermetically +hermit +hermitage +hermitages +hermits +hernia +herniae +hernial +hernias +herniate +herniated +herniates +herniating +herniation +hero +heroes +heroic +heroically +heroics +heroin +heroine +heroines +heroism +heron +herons +heros +herpes +herpetologist +herpetologists +herpetology +herring +herringbone +herrings +hers +herself +hertz +hertzes +hesitance +hesitancy +hesitant +hesitantly +hesitate +hesitated +hesitates +hesitating +hesitatingly +hesitation +hesitations +hetero +heterodox +heterodoxy +heterogeneity +heterogeneous +heterogeneously +heteros +heterosexual +heterosexuality +heterosexuals +heuristic +heuristically +heuristics +hewed +hewer +hewers +hewing +hewn +hews +hexadecimal +hexagon +hexagonal +hexagons +hexagram +hexagrams +hexameter +hexameters +hexed +hexes +hexing +heyday +heydays +hiatus +hiatuses +hibachi +hibachis +hibernate +hibernated +hibernates +hibernating +hibernation +hibernator +hibernators +hibiscus +hibiscuses +hiccough +hiccoughed +hiccoughing +hiccoughs +hiccup +hiccuped +hiccuping +hiccupped +hiccupping +hiccups +hick +hickey +hickeys +hickies +hickories +hickory +hicks +hidden +hide +hideaway +hideaways +hidebound +hided +hideous +hideously +hideousness +hideout +hideouts +hider +hiders +hides +hiding +hied +hieing +hierarchic +hierarchical +hierarchically +hierarchies +hierarchy +hieroglyph +hieroglyphic +hieroglyphics +hieroglyphs +hies +high +highball +highballs +highborn +highboy +highboys +highbrow +highbrows +highchair +highchairs +higher +highest +highfalutin +highfaluting +highhanded +highhandedly +highhandedness +highjack +highjacked +highjacking +highjacks +highland +highlander +highlanders +highlands +highlight +highlighted +highlighter +highlighters +highlighting +highlights +highly +highness +highrise +highrises +highroad +highroads +highs +hightail +hightailed +hightailing +hightails +highway +highwayman +highwaymen +highways +hijack +hijacked +hijacker +hijackers +hijacking +hijackings +hijacks +hike +hiked +hiker +hikers +hikes +hiking +hilarious +hilariously +hilariousness +hilarity +hill +hillbillies +hillbilly +hillier +hilliest +hilliness +hillock +hillocks +hills +hillside +hillsides +hilltop +hilltops +hilly +hilt +hilts +hims +himself +hind +hinder +hindered +hindering +hinders +hindmost +hindquarter +hindquarters +hindrance +hindrances +hinds +hindsight +hinge +hinged +hinges +hinging +hint +hinted +hinter +hinterland +hinterlands +hinters +hinting +hints +hipbone +hipbones +hipness +hipped +hipper +hippest +hippie +hippies +hipping +hippo +hippodrome +hippodromes +hippopotami +hippopotamus +hippopotamuses +hippos +hippy +hips +hipster +hipsters +hire +hired +hireling +hirelings +hires +hiring +hirsute +hirsuteness +hiss +hissed +hisses +hissing +hist +histamine +histamines +histogram +histograms +histologist +histologists +histology +historian +historians +historic +historical +historically +historicity +histories +historiographer +historiographers +historiography +history +histrionic +histrionically +histrionics +hitch +hitched +hitcher +hitchers +hitches +hitchhike +hitchhiked +hitchhiker +hitchhikers +hitchhikes +hitchhiking +hitching +hither +hitherto +hits +hitter +hitters +hitting +hive +hived +hives +hiving +hoagie +hoagies +hoagy +hoard +hoarded +hoarder +hoarders +hoarding +hoardings +hoards +hoarfrost +hoarier +hoariest +hoariness +hoarse +hoarsely +hoarseness +hoarser +hoarsest +hoary +hoax +hoaxed +hoaxer +hoaxers +hoaxes +hoaxing +hobbies +hobble +hobbled +hobbler +hobblers +hobbles +hobbling +hobby +hobbyhorse +hobbyhorses +hobbyist +hobbyists +hobgoblin +hobgoblins +hobnail +hobnailed +hobnailing +hobnails +hobnob +hobnobbed +hobnobbing +hobnobs +hobo +hoboes +hobos +hobs +hock +hocked +hockey +hocking +hocks +hockshop +hockshops +hodgepodge +hodgepodges +hods +hoecake +hoecakes +hoed +hoedown +hoedowns +hoeing +hoer +hoers +hoes +hogan +hogans +hogback +hogbacks +hogged +hogging +hoggish +hoggishly +hogs +hogshead +hogsheads +hogtie +hogtied +hogtieing +hogties +hogtying +hogwash +hoist +hoisted +hoisting +hoists +hoke +hoked +hokes +hokey +hokier +hokiest +hoking +hokum +hold +holder +holders +holding +holdings +holdout +holdouts +holdover +holdovers +holds +holdup +holdups +hole +holed +holes +holey +holiday +holidayed +holidaying +holidays +holier +holiest +holiness +holing +holistic +holistically +holler +hollered +hollering +hollers +hollies +hollow +hollowed +hollower +hollowest +hollowing +hollowly +hollowness +hollows +holly +hollyhock +hollyhocks +holmium +holocaust +holocausts +hologram +holograms +holograph +holographic +holographs +holography +holster +holstered +holstering +holsters +holy +homage +homages +hombre +hombres +homburg +homburgs +home +homebodies +homebody +homeboy +homeboys +homecoming +homecomings +homed +homegrown +homeland +homelands +homeless +homelessness +homelier +homeliest +homelike +homeliness +homely +homemade +homemaker +homemakers +homemaking +homeopath +homeopathic +homeopaths +homeopathy +homeostasis +homeostatic +homeowner +homeowners +homepage +homepages +homer +homered +homering +homeroom +homerooms +homers +homes +homeschooling +homesick +homesickness +homespun +homestead +homesteaded +homesteader +homesteaders +homesteading +homesteads +homestretch +homestretches +hometown +hometowns +homeward +homewards +homework +homey +homeyness +homeys +homicidal +homicide +homicides +homier +homiest +homiletic +homilies +homily +hominess +homing +hominid +hominids +hominy +homo +homogeneity +homogeneous +homogeneously +homogenization +homogenize +homogenized +homogenizes +homogenizing +homograph +homographs +homologous +homonym +homonyms +homophobia +homophobic +homophone +homophones +homos +homosexual +homosexuality +homosexuals +homy +honcho +honchos +hone +honed +honer +honers +hones +honest +honester +honestest +honestly +honesty +honey +honeybee +honeybees +honeycomb +honeycombed +honeycombing +honeycombs +honeydew +honeydews +honeyed +honeying +honeylocust +honeylocusts +honeymoon +honeymooned +honeymooner +honeymooners +honeymooning +honeymoons +honeys +honeysuckle +honeysuckles +honied +honing +honk +honked +honker +honkers +honkie +honkies +honking +honks +honky +honor +honorable +honorableness +honorably +honoraria +honorarily +honorarium +honorariums +honorary +honored +honoree +honorees +honorer +honorers +honorific +honorifics +honoring +honors +honour +honourable +honoured +honouring +honours +hons +hooch +hood +hooded +hooding +hoodlum +hoodlums +hoodoo +hoodooed +hoodooing +hoodoos +hoods +hoodwink +hoodwinked +hoodwinking +hoodwinks +hooey +hoof +hoofed +hoofing +hoofs +hook +hooka +hookah +hookahs +hookas +hooked +hooker +hookers +hookey +hooking +hooks +hookup +hookups +hookworm +hookworms +hooky +hooligan +hooliganism +hooligans +hoop +hooped +hooping +hoopla +hoops +hooray +hoorayed +hooraying +hoorays +hoosegow +hoosegows +hoot +hootch +hooted +hootenannies +hootenanny +hooter +hooters +hooting +hoots +hooves +hope +hoped +hopeful +hopefully +hopefulness +hopefuls +hopeless +hopelessly +hopelessness +hopes +hoping +hopped +hopper +hoppers +hopping +hops +hopscotch +hopscotched +hopscotches +hopscotching +hora +horas +horde +horded +hordes +hording +horehound +horehounds +horizon +horizons +horizontal +horizontally +horizontals +hormonal +hormone +hormones +horn +hornblende +horned +hornet +hornets +hornier +horniest +hornless +hornlike +hornpipe +hornpipes +horns +horny +horologic +horological +horologist +horologists +horology +horoscope +horoscopes +horrendous +horrendously +horrible +horribleness +horribly +horrid +horrider +horridest +horridly +horrific +horrifically +horrified +horrifies +horrify +horrifying +horror +horrors +horse +horseback +horsed +horseflesh +horseflies +horsefly +horsehair +horsehide +horselaugh +horselaughs +horseless +horseman +horsemanship +horsemen +horseplay +horsepower +horseradish +horseradishes +horses +horseshoe +horseshoed +horseshoeing +horseshoes +horsetail +horsetails +horsewhip +horsewhipped +horsewhipping +horsewhips +horsewoman +horsewomen +horsey +horsier +horsiest +horsing +horsy +hortatory +horticultural +horticulture +horticulturist +horticulturists +hosanna +hosannas +hose +hosed +hoses +hosier +hosiers +hosiery +hosing +hospice +hospices +hospitable +hospitably +hospital +hospitality +hospitalization +hospitalizations +hospitalize +hospitalized +hospitalizes +hospitalizing +hospitals +host +hostage +hostages +hosted +hostel +hosteled +hosteler +hostelers +hosteling +hostelled +hostelling +hostelries +hostelry +hostels +hostess +hostessed +hostesses +hostessing +hostile +hostilely +hostiles +hostilities +hostility +hosting +hostler +hostlers +hosts +hotbed +hotbeds +hotblooded +hotbox +hotboxes +hotcake +hotcakes +hotdog +hotdogged +hotdogging +hotdogs +hotel +hotelier +hoteliers +hotels +hotfoot +hotfooted +hotfooting +hotfoots +hothead +hotheaded +hotheadedly +hotheadedness +hotheads +hothouse +hothouses +hotline +hotlines +hotly +hotness +hotplate +hotplates +hots +hotshot +hotshots +hotspot +hotspots +hotter +hottest +hound +hounded +hounding +hounds +hour +hourglass +hourglasses +houri +houris +hourly +hours +house +houseboat +houseboats +housebound +houseboy +houseboys +housebreak +housebreaker +housebreakers +housebreaking +housebreaks +housebroke +housebroken +houseclean +housecleaned +housecleaning +housecleans +housecoat +housecoats +housed +houseflies +housefly +houseful +housefuls +household +householder +householders +households +househusband +househusbands +housekeeper +housekeepers +housekeeping +houselights +housemaid +housemaids +houseman +housemen +housemother +housemothers +houseparent +houseparents +houseplant +houseplants +houses +housetop +housetops +housewares +housewarming +housewarmings +housewife +housewifely +housewives +housework +housing +housings +hove +hovel +hovels +hover +hovercraft +hovercrafts +hovered +hovering +hovers +howbeit +howdah +howdahs +howdy +however +howitzer +howitzers +howl +howled +howler +howlers +howling +howls +hows +howsoever +hoyden +hoydenish +hoydens +huarache +huaraches +hubbies +hubbub +hubbubs +hubby +hubcap +hubcaps +hubris +hubs +huckleberries +huckleberry +huckster +huckstered +huckstering +hucksterism +hucksters +huddle +huddled +huddles +huddling +hued +hues +huff +huffed +huffier +huffiest +huffily +huffiness +huffing +huffs +huffy +huge +hugely +hugeness +huger +hugest +hugged +hugging +hugs +hula +hulas +hulk +hulking +hulks +hull +hullabaloo +hullabaloos +hulled +huller +hullers +hulling +hullo +hullos +hulls +human +humane +humanely +humaneness +humaner +humanest +humanism +humanist +humanistic +humanists +humanitarian +humanitarianism +humanitarians +humanities +humanity +humanization +humanize +humanized +humanizer +humanizers +humanizes +humanizing +humankind +humanly +humanness +humanoid +humanoids +humans +humble +humbled +humbleness +humbler +humblers +humbles +humblest +humbling +humbly +humbug +humbugged +humbugging +humbugs +humdinger +humdingers +humdrum +humeral +humeri +humerus +humid +humider +humidest +humidification +humidified +humidifier +humidifiers +humidifies +humidify +humidifying +humidity +humidly +humidor +humidors +humiliate +humiliated +humiliates +humiliating +humiliatingly +humiliation +humiliations +humility +hummed +hummer +hummers +humming +hummingbird +hummingbirds +hummock +hummocks +hummocky +hummus +humongous +humor +humored +humoring +humorist +humorists +humorless +humorlessly +humorlessness +humorous +humorously +humorousness +humors +humour +humoured +humouring +humours +hump +humpback +humpbacked +humpbacks +humped +humph +humphed +humphing +humphs +humping +humps +hums +humungous +humus +hunch +hunchback +hunchbacked +hunchbacks +hunched +hunches +hunching +hundred +hundredfold +hundreds +hundredth +hundredths +hundredweight +hundredweights +hung +hunger +hungered +hungering +hungers +hungover +hungrier +hungriest +hungrily +hungriness +hungry +hunk +hunker +hunkered +hunkering +hunkers +hunkier +hunkiest +hunks +hunky +hunt +hunted +hunter +hunters +hunting +huntress +huntresses +hunts +huntsman +huntsmen +hurdle +hurdled +hurdler +hurdlers +hurdles +hurdling +hurl +hurled +hurler +hurlers +hurling +hurls +hurrah +hurrahed +hurrahing +hurrahs +hurray +hurrayed +hurraying +hurrays +hurricane +hurricanes +hurried +hurriedly +hurries +hurry +hurrying +hurt +hurtful +hurtfully +hurtfulness +hurting +hurtle +hurtled +hurtles +hurtling +hurts +husband +husbanded +husbanding +husbandman +husbandmen +husbandry +husbands +hush +hushed +hushes +hushing +husk +husked +husker +huskers +huskier +huskies +huskiest +huskily +huskiness +husking +husks +husky +hussar +hussars +hussies +hussy +hustings +hustle +hustled +hustler +hustlers +hustles +hustling +hutch +hutches +huts +hutzpa +hutzpah +huzza +huzzaed +huzzah +huzzahed +huzzahing +huzzahs +huzzaing +huzzas +hyacinth +hyacinths +hyaena +hyaenas +hybrid +hybridism +hybridization +hybridize +hybridized +hybridizes +hybridizing +hybrids +hydra +hydrae +hydrangea +hydrangeas +hydrant +hydrants +hydras +hydrate +hydrated +hydrates +hydrating +hydration +hydraulic +hydraulically +hydraulics +hydro +hydrocarbon +hydrocarbons +hydrocephalus +hydrocephaly +hydrodynamic +hydrodynamics +hydroelectric +hydroelectrically +hydroelectricity +hydrofoil +hydrofoils +hydrogen +hydrogenate +hydrogenated +hydrogenates +hydrogenating +hydrogenation +hydrogenous +hydrologist +hydrologists +hydrology +hydrolysis +hydrolyze +hydrolyzed +hydrolyzes +hydrolyzing +hydrometer +hydrometers +hydrometry +hydrophobia +hydrophobic +hydrophone +hydrophones +hydroplane +hydroplaned +hydroplanes +hydroplaning +hydroponic +hydroponically +hydroponics +hydrosphere +hydrotherapy +hydrous +hydroxide +hydroxides +hyena +hyenas +hygiene +hygienic +hygienically +hygienist +hygienists +hygrometer +hygrometers +hying +hymen +hymeneal +hymens +hymn +hymnal +hymnals +hymnbook +hymnbooks +hymned +hymning +hymns +hype +hyped +hyper +hyperactive +hyperactivity +hyperbola +hyperbolae +hyperbolas +hyperbole +hyperbolic +hypercritical +hypercritically +hyperglycemia +hyperlink +hyperlinks +hypermedia +hypersensitive +hypersensitiveness +hypersensitivities +hypersensitivity +hypertension +hypertensive +hypertensives +hypertext +hyperthyroid +hyperthyroidism +hypertrophied +hypertrophies +hypertrophy +hypertrophying +hyperventilate +hyperventilated +hyperventilates +hyperventilating +hyperventilation +hypes +hyphen +hyphenate +hyphenated +hyphenates +hyphenating +hyphenation +hyphened +hyphening +hyphens +hyping +hypnosis +hypnotherapy +hypnotic +hypnotically +hypnotics +hypnotism +hypnotist +hypnotists +hypnotize +hypnotized +hypnotizes +hypnotizing +hypo +hypoallergenic +hypochondria +hypochondriac +hypochondriacs +hypocrisies +hypocrisy +hypocrite +hypocrites +hypocritical +hypocritically +hypodermic +hypodermics +hypoglycemia +hypoglycemic +hypoglycemics +hypos +hypotenuse +hypotenuses +hypothalami +hypothalamus +hypothermia +hypotheses +hypothesis +hypothesize +hypothesized +hypothesizes +hypothesizing +hypothetical +hypothetically +hypothyroid +hypothyroidism +hyssop +hysterectomies +hysterectomy +hysteria +hysteric +hysterical +hysterically +hysterics +iamb +iambi +iambic +iambics +iambs +iambus +iambuses +ibex +ibexes +ibices +ibidem +ibis +ibises +ibuprofen +iceberg +icebergs +iceboat +iceboats +icebound +icebox +iceboxes +icebreaker +icebreakers +icecap +icecaps +iced +iceman +icemen +ices +ichthyologist +ichthyologists +ichthyology +icicle +icicles +icier +iciest +icily +iciness +icing +icings +ickier +ickiest +icky +icon +iconic +iconoclasm +iconoclast +iconoclastic +iconoclasts +iconography +icons +ictus +idea +ideal +idealism +idealist +idealistic +idealistically +idealists +idealization +idealize +idealized +idealizes +idealizing +ideally +ideals +ideas +idem +identical +identically +identifiable +identification +identified +identifies +identify +identifying +identities +identity +ideogram +ideograms +ideograph +ideographs +ideological +ideologically +ideologies +ideologist +ideologists +ideologue +ideologues +ideology +ides +idiocies +idiocy +idiom +idiomatic +idiomatically +idioms +idiopathic +idiosyncrasies +idiosyncrasy +idiosyncratic +idiosyncratically +idiot +idiotic +idiotically +idiots +idle +idled +idleness +idler +idlers +idles +idlest +idling +idly +idol +idolater +idolaters +idolatress +idolatresses +idolatrous +idolatry +idolization +idolize +idolized +idolizes +idolizing +idols +idyl +idyll +idyllic +idyllically +idylls +idyls +iffier +iffiest +iffiness +iffy +igloo +igloos +igneous +ignitable +ignite +ignited +ignites +ignitible +igniting +ignition +ignitions +ignoble +ignobler +ignoblest +ignobly +ignominies +ignominious +ignominiously +ignominy +ignoramus +ignoramuses +ignorance +ignorant +ignorantly +ignore +ignored +ignores +ignoring +iguana +iguanas +ikon +ikons +ilea +ileitis +ileum +ilia +ilium +ilks +illegal +illegalities +illegality +illegally +illegals +illegibility +illegible +illegibly +illegitimacy +illegitimate +illegitimately +illiberal +illiberality +illiberally +illicit +illicitly +illicitness +illimitable +illiteracy +illiterate +illiterately +illiterates +illness +illnesses +illogical +illogicality +illogically +ills +illuminable +illuminate +illuminated +illuminates +illuminating +illuminatingly +illumination +illuminations +illumine +illumined +illumines +illumining +illusion +illusionist +illusionists +illusions +illusive +illusory +illustrate +illustrated +illustrates +illustrating +illustration +illustrations +illustrative +illustratively +illustrator +illustrators +illustrious +illustriously +illustriousness +image +imaged +imagery +images +imaginable +imaginably +imaginary +imagination +imaginations +imaginative +imaginatively +imagine +imagined +imagines +imaging +imagining +imago +imagoes +imam +imams +imbalance +imbalances +imbecile +imbeciles +imbecilic +imbecilities +imbecility +imbed +imbedded +imbedding +imbeds +imbibe +imbibed +imbiber +imbibers +imbibes +imbibing +imbrication +imbroglio +imbroglios +imbue +imbued +imbues +imbuing +imitable +imitate +imitated +imitates +imitating +imitation +imitations +imitative +imitatively +imitativeness +imitator +imitators +immaculate +immaculately +immaculateness +immanence +immanency +immanent +immanently +immaterial +immateriality +immaterially +immaterialness +immature +immaturely +immaturity +immeasurable +immeasurably +immediacies +immediacy +immediate +immediately +immediateness +immemorial +immemorially +immense +immensely +immensities +immensity +immerse +immersed +immerses +immersible +immersing +immersion +immersions +immigrant +immigrants +immigrate +immigrated +immigrates +immigrating +immigration +imminence +imminent +imminently +immobile +immobility +immobilization +immobilize +immobilized +immobilizes +immobilizing +immoderate +immoderately +immodest +immodestly +immodesty +immolate +immolated +immolates +immolating +immolation +immoral +immoralities +immorality +immorally +immortal +immortality +immortalize +immortalized +immortalizes +immortalizing +immortally +immortals +immovability +immovable +immovably +immune +immunity +immunization +immunizations +immunize +immunized +immunizes +immunizing +immunodeficiency +immunodeficient +immunologic +immunological +immunologist +immunologists +immunology +immure +immured +immures +immuring +immutability +immutable +immutably +impact +impacted +impacting +impacts +impair +impaired +impairing +impairment +impairments +impairs +impala +impalas +impale +impaled +impalement +impales +impaling +impalpable +impalpably +impanel +impaneled +impaneling +impanelled +impanelling +impanels +impart +imparted +impartial +impartiality +impartially +imparting +imparts +impassable +impassably +impasse +impasses +impassibility +impassible +impassibly +impassioned +impassive +impassively +impassiveness +impassivity +impasto +impatience +impatiences +impatiens +impatient +impatiently +impeach +impeachable +impeached +impeacher +impeachers +impeaches +impeaching +impeachment +impeachments +impeccability +impeccable +impeccably +impecunious +impecuniously +impecuniousness +impedance +impede +impeded +impedes +impediment +impedimenta +impediments +impeding +impel +impelled +impeller +impellers +impelling +impels +impend +impended +impending +impends +impenetrability +impenetrable +impenetrably +impenitence +impenitent +impenitently +imperative +imperatively +imperatives +imperceptibility +imperceptible +imperceptibly +imperceptive +imperfect +imperfection +imperfections +imperfectly +imperfectness +imperfects +imperial +imperialism +imperialist +imperialistic +imperialistically +imperialists +imperially +imperials +imperil +imperiled +imperiling +imperilled +imperilling +imperilment +imperils +imperious +imperiously +imperiousness +imperishable +imperishably +impermanence +impermanent +impermanently +impermeability +impermeable +impermeably +impermissible +impersonal +impersonally +impersonate +impersonated +impersonates +impersonating +impersonation +impersonations +impersonator +impersonators +impertinence +impertinent +impertinently +imperturbability +imperturbable +imperturbably +impervious +imperviously +impetigo +impetuosity +impetuous +impetuously +impetuousness +impetus +impetuses +impieties +impiety +impinge +impinged +impingement +impinges +impinging +impious +impiously +impiousness +impish +impishly +impishness +implacability +implacable +implacably +implant +implantable +implantation +implanted +implanting +implants +implausibilities +implausibility +implausible +implausibly +implement +implementation +implementations +implemented +implementing +implements +implicate +implicated +implicates +implicating +implication +implications +implicit +implicitly +implicitness +implied +implies +implode +imploded +implodes +imploding +implore +implored +implores +imploring +imploringly +implosion +implosions +implosive +imply +implying +impolite +impolitely +impoliteness +impolitenesses +impolitic +imponderable +imponderables +import +importable +importance +important +importantly +importation +importations +imported +importer +importers +importing +imports +importunate +importunately +importune +importuned +importunes +importuning +importunity +impose +imposed +imposer +imposers +imposes +imposing +imposingly +imposition +impositions +impossibilities +impossibility +impossible +impossibly +impost +imposter +imposters +impostor +impostors +imposts +imposture +impostures +impotence +impotency +impotent +impotently +impound +impounded +impounding +impounds +impoverish +impoverished +impoverishes +impoverishing +impoverishment +impracticable +impracticably +impractical +impracticality +impractically +imprecate +imprecated +imprecates +imprecating +imprecation +imprecations +imprecise +imprecisely +impreciseness +imprecision +impregnability +impregnable +impregnably +impregnate +impregnated +impregnates +impregnating +impregnation +impresario +impresarios +impress +impressed +impresses +impressibility +impressible +impressing +impression +impressionability +impressionable +impressionism +impressionist +impressionistic +impressionists +impressions +impressive +impressively +impressiveness +imprimatur +imprimaturs +imprint +imprinted +imprinter +imprinters +imprinting +imprints +imprison +imprisoned +imprisoning +imprisonment +imprisonments +imprisons +improbabilities +improbability +improbable +improbably +impromptu +impromptus +improper +improperly +improprieties +impropriety +improvable +improve +improved +improvement +improvements +improves +improvidence +improvident +improvidently +improving +improvisation +improvisational +improvisations +improvise +improvised +improviser +improvisers +improvises +improvising +improvisor +improvisors +imprudence +imprudent +imprudently +imps +impudence +impudent +impudently +impugn +impugned +impugner +impugners +impugning +impugns +impulse +impulsed +impulses +impulsing +impulsion +impulsive +impulsively +impulsiveness +impunity +impure +impurely +impurer +impurest +impurities +impurity +imputable +imputation +imputations +impute +imputed +imputes +imputing +inabilities +inability +inaccessibility +inaccessible +inaccessibly +inaccuracies +inaccuracy +inaccurate +inaccurately +inaction +inactivate +inactivated +inactivates +inactivating +inactivation +inactive +inactively +inactivity +inadequacies +inadequacy +inadequate +inadequately +inadmissibility +inadmissible +inadvertence +inadvertent +inadvertently +inadvisability +inadvisable +inalienability +inalienable +inalienably +inamorata +inamoratas +inane +inanely +inaner +inanest +inanimate +inanimately +inanimateness +inanities +inanity +inapplicable +inappreciable +inappreciably +inapproachable +inappropriate +inappropriately +inappropriateness +inapt +inaptly +inaptness +inarguable +inarticulate +inarticulately +inarticulateness +inartistic +inattention +inattentive +inattentively +inattentiveness +inaudibility +inaudible +inaudibly +inaugural +inaugurals +inaugurate +inaugurated +inaugurates +inaugurating +inauguration +inaugurations +inauspicious +inauspiciously +inauthentic +inboard +inboards +inborn +inbound +inbounded +inbounding +inbounds +inbred +inbreed +inbreeding +inbreeds +incalculable +incalculably +incandescence +incandescent +incandescently +incantation +incantations +incapability +incapable +incapably +incapacitate +incapacitated +incapacitates +incapacitating +incapacity +incarcerate +incarcerated +incarcerates +incarcerating +incarceration +incarcerations +incarnadine +incarnadined +incarnadines +incarnadining +incarnate +incarnated +incarnates +incarnating +incarnation +incarnations +incautious +incendiaries +incendiary +incense +incensed +incenses +incensing +incentive +incentives +inception +inceptions +incertitude +incessant +incessantly +incest +incestuous +incestuously +incestuousness +inch +inched +inches +inching +inchoate +inchworm +inchworms +incidence +incidences +incident +incidental +incidentally +incidentals +incidents +incinerate +incinerated +incinerates +incinerating +incineration +incinerator +incinerators +incipience +incipient +incipiently +incise +incised +incises +incising +incision +incisions +incisive +incisively +incisiveness +incisor +incisors +incite +incited +incitement +incitements +inciter +inciters +incites +inciting +incivilities +incivility +inclemency +inclement +inclination +inclinations +incline +inclined +inclines +inclining +inclose +inclosed +incloses +inclosing +inclosure +inclosures +include +included +includes +including +inclusion +inclusions +inclusive +inclusively +inclusiveness +incognito +incognitos +incoherence +incoherent +incoherently +incombustible +income +incomes +incoming +incommensurate +incommensurately +incommode +incommoded +incommodes +incommoding +incommodious +incommunicable +incommunicado +incomparable +incomparably +incompatibilities +incompatibility +incompatible +incompatibles +incompatibly +incompetence +incompetency +incompetent +incompetently +incompetents +incomplete +incompletely +incompleteness +incompletes +incomprehensibility +incomprehensible +incomprehensibly +incomprehension +inconceivability +inconceivable +inconceivably +inconclusive +inconclusively +inconclusiveness +incongruities +incongruity +incongruous +incongruously +incongruousness +inconsequential +inconsequentially +inconsiderable +inconsiderate +inconsiderately +inconsiderateness +inconsideration +inconsistencies +inconsistency +inconsistent +inconsistently +inconsolable +inconsolably +inconspicuous +inconspicuously +inconspicuousness +inconstancy +inconstant +inconstantly +incontestability +incontestable +incontestably +incontinence +incontinent +incontrovertible +incontrovertibly +inconvenience +inconvenienced +inconveniences +inconveniencing +inconvenient +inconveniently +incorporate +incorporated +incorporates +incorporating +incorporation +incorporeal +incorrect +incorrectly +incorrectness +incorrigibility +incorrigible +incorrigibly +incorruptibility +incorruptible +incorruptibly +increase +increased +increases +increasing +increasingly +incredibility +incredible +incredibly +incredulity +incredulous +incredulously +increment +incremental +increments +incriminate +incriminated +incriminates +incriminating +incrimination +incriminatory +incrust +incrustation +incrustations +incrusted +incrusting +incrusts +incubate +incubated +incubates +incubating +incubation +incubator +incubators +incubi +incubus +incubuses +inculcate +inculcated +inculcates +inculcating +inculcation +inculpable +inculpate +inculpated +inculpates +inculpating +incumbencies +incumbency +incumbent +incumbents +incumber +incumbered +incumbering +incumbers +incunabula +incunabulum +incur +incurable +incurables +incurably +incurious +incurred +incurring +incurs +incursion +incursions +indebted +indebtedness +indecencies +indecency +indecent +indecently +indecipherable +indecision +indecisive +indecisively +indecisiveness +indecorous +indecorously +indeed +indefatigable +indefatigably +indefeasible +indefeasibly +indefensible +indefensibly +indefinable +indefinably +indefinite +indefinitely +indefiniteness +indelible +indelibly +indelicacies +indelicacy +indelicate +indelicately +indemnification +indemnifications +indemnified +indemnifies +indemnify +indemnifying +indemnities +indemnity +indemonstrable +indent +indentation +indentations +indented +indenting +indention +indents +indenture +indentured +indentures +indenturing +independence +independent +independently +independents +indescribable +indescribably +indestructibility +indestructible +indestructibly +indeterminable +indeterminably +indeterminacy +indeterminate +indeterminately +index +indexation +indexations +indexed +indexer +indexers +indexes +indexing +indicate +indicated +indicates +indicating +indication +indications +indicative +indicatively +indicatives +indicator +indicators +indices +indict +indictable +indicted +indicting +indictment +indictments +indicts +indifference +indifferent +indifferently +indigence +indigenous +indigent +indigently +indigents +indigestible +indigestion +indignant +indignantly +indignation +indignities +indignity +indigo +indirect +indirected +indirecting +indirection +indirectly +indirectness +indirects +indiscernible +indiscreet +indiscreetly +indiscretion +indiscretions +indiscriminate +indiscriminately +indispensability +indispensable +indispensables +indispensably +indisposed +indisposition +indispositions +indisputable +indisputably +indissoluble +indissolubly +indistinct +indistinctly +indistinctness +indistinguishable +indistinguishably +indite +indited +indites +inditing +indium +individual +individualism +individualist +individualistic +individualistically +individualists +individuality +individualization +individualize +individualized +individualizes +individualizing +individually +individuals +individuate +individuated +individuates +individuating +individuation +indivisibility +indivisible +indivisibly +indoctrinate +indoctrinated +indoctrinates +indoctrinating +indoctrination +indolence +indolent +indolently +indomitable +indomitably +indoor +indoors +indorse +indorsed +indorses +indorsing +indubitable +indubitably +induce +induced +inducement +inducements +inducer +inducers +induces +inducing +induct +inductance +inducted +inductee +inductees +inducting +induction +inductions +inductive +inducts +indue +indued +indues +induing +indulge +indulged +indulgence +indulgences +indulgent +indulgently +indulges +indulging +industrial +industrialism +industrialist +industrialists +industrialization +industrialize +industrialized +industrializes +industrializing +industrially +industries +industrious +industriously +industriousness +industry +indwell +indwelled +indwelling +indwells +indwelt +inebriate +inebriated +inebriates +inebriating +inebriation +inedible +ineducable +ineffability +ineffable +ineffably +ineffective +ineffectively +ineffectiveness +ineffectual +ineffectually +inefficacy +inefficiencies +inefficiency +inefficient +inefficiently +inelastic +inelegance +inelegant +inelegantly +ineligibility +ineligible +ineligibles +ineligibly +ineluctable +ineluctably +inept +inepter +ineptest +ineptitude +ineptly +ineptness +inequalities +inequality +inequitable +inequitably +inequities +inequity +ineradicable +inerrant +inert +inertia +inertial +inertly +inertness +inescapable +inescapably +inessential +inessentials +inestimable +inestimably +inevitability +inevitable +inevitables +inevitably +inexact +inexactly +inexactness +inexcusable +inexcusably +inexhaustible +inexhaustibly +inexorable +inexorably +inexpedience +inexpediency +inexpedient +inexpensive +inexpensively +inexpensiveness +inexperience +inexperienced +inexpert +inexpertly +inexpiable +inexplicable +inexplicably +inexpressible +inexpressibly +inexpressive +inextinguishable +inextricable +inextricably +infallibility +infallible +infallibly +infamies +infamous +infamously +infamy +infancy +infant +infanticide +infanticides +infantile +infantries +infantry +infantryman +infantrymen +infants +infarct +infarction +infarcts +infatuate +infatuated +infatuates +infatuating +infatuation +infatuations +infect +infected +infecting +infection +infections +infectious +infectiously +infectiousness +infects +infelicities +infelicitous +infelicity +infer +inference +inferences +inferential +inferior +inferiority +inferiors +infernal +infernally +inferno +infernos +inferred +inferring +infers +infertile +infertility +infest +infestation +infestations +infested +infesting +infests +infidel +infidelities +infidelity +infidels +infield +infielder +infielders +infields +infighter +infighters +infighting +infiltrate +infiltrated +infiltrates +infiltrating +infiltration +infiltrator +infiltrators +infinite +infinitely +infinitesimal +infinitesimally +infinitesimals +infinities +infinitival +infinitive +infinitives +infinitude +infinity +infirm +infirmaries +infirmary +infirmities +infirmity +inflame +inflamed +inflames +inflaming +inflammability +inflammable +inflammation +inflammations +inflammatory +inflatable +inflatables +inflate +inflated +inflates +inflating +inflation +inflationary +inflect +inflected +inflecting +inflection +inflectional +inflections +inflects +inflexibility +inflexible +inflexibly +inflexion +inflexions +inflict +inflicted +inflicting +infliction +inflictive +inflicts +inflight +inflorescence +inflorescent +inflow +inflows +influence +influenced +influences +influencing +influential +influentially +influenza +influx +influxes +info +infold +infolded +infolding +infolds +infomercial +infomercials +inform +informal +informality +informally +informant +informants +information +informational +informative +informatively +informativeness +informed +informer +informers +informing +informs +infotainment +infra +infraction +infractions +infrared +infrasonic +infrastructure +infrastructures +infrequence +infrequency +infrequent +infrequently +infringe +infringed +infringement +infringements +infringes +infringing +infuriate +infuriated +infuriates +infuriating +infuriatingly +infuse +infused +infuser +infusers +infuses +infusing +infusion +infusions +ingenious +ingeniously +ingeniousness +ingenue +ingenues +ingenuity +ingenuous +ingenuously +ingenuousness +ingest +ingested +ingesting +ingestion +ingests +inglenook +inglenooks +inglorious +ingloriously +ingot +ingots +ingrain +ingrained +ingraining +ingrains +ingrate +ingrates +ingratiate +ingratiated +ingratiates +ingratiating +ingratiatingly +ingratiation +ingratitude +ingredient +ingredients +ingress +ingresses +ingrowing +ingrown +inguinal +inhabit +inhabitable +inhabitant +inhabitants +inhabited +inhabiting +inhabits +inhalant +inhalants +inhalation +inhalations +inhalator +inhalators +inhale +inhaled +inhaler +inhalers +inhales +inhaling +inharmonious +inhere +inhered +inherent +inherently +inheres +inhering +inherit +inheritable +inheritance +inheritances +inherited +inheriting +inheritor +inheritors +inherits +inhibit +inhibited +inhibiting +inhibition +inhibitions +inhibitor +inhibitors +inhibitory +inhibits +inhospitable +inhospitably +inhuman +inhumane +inhumanely +inhumanities +inhumanity +inhumanly +inimical +inimically +inimitable +inimitably +iniquities +iniquitous +iniquitously +iniquity +initial +initialed +initialing +initialize +initialized +initializes +initializing +initialled +initialling +initially +initials +initiate +initiated +initiates +initiating +initiation +initiations +initiative +initiatives +initiator +initiators +initiatory +inject +injected +injecting +injection +injections +injector +injectors +injects +injudicious +injudiciously +injudiciousness +injunction +injunctions +injure +injured +injurer +injurers +injures +injuries +injuring +injurious +injury +injustice +injustices +inkblot +inkblots +inked +inkier +inkiest +inkiness +inking +inkling +inklings +inks +inkstand +inkstands +inkwell +inkwells +inky +inlaid +inland +inlay +inlaying +inlays +inlet +inlets +inmate +inmates +inmost +innards +innate +innately +innateness +inner +innermost +innersole +innersoles +innerspring +innervate +innervated +innervates +innervating +innervation +inning +innings +innkeeper +innkeepers +innocence +innocent +innocently +innocents +innocuous +innocuously +innocuousness +innovate +innovated +innovates +innovating +innovation +innovations +innovative +innovator +innovators +inns +innuendo +innuendoes +innuendos +innumerable +innumerably +innumeracy +innumerate +inoculate +inoculated +inoculates +inoculating +inoculation +inoculations +inoffensive +inoffensively +inoffensiveness +inoperable +inoperative +inopportune +inopportunely +inordinate +inordinately +inorganic +inorganically +inpatient +inpatients +input +inputs +inputted +inputting +inquest +inquests +inquietude +inquire +inquired +inquirer +inquirers +inquires +inquiries +inquiring +inquiringly +inquiry +inquisition +inquisitional +inquisitions +inquisitive +inquisitively +inquisitiveness +inquisitor +inquisitorial +inquisitors +inroad +inroads +inrush +inrushes +insalubrious +insane +insanely +insaner +insanest +insanitary +insanity +insatiability +insatiable +insatiably +inscribe +inscribed +inscriber +inscribers +inscribes +inscribing +inscription +inscriptions +inscrutability +inscrutable +inscrutableness +inscrutably +inseam +inseams +insect +insecticidal +insecticide +insecticides +insectivore +insectivores +insectivorous +insects +insecure +insecurely +insecurities +insecurity +inseminate +inseminated +inseminates +inseminating +insemination +insensate +insensibility +insensible +insensibly +insensitive +insensitively +insensitivity +insentience +insentient +inseparability +inseparable +inseparables +inseparably +insert +inserted +inserting +insertion +insertions +inserts +inset +insets +insetted +insetting +inshore +inside +insider +insiders +insides +insidious +insidiously +insidiousness +insight +insightful +insights +insigne +insignia +insignias +insignificance +insignificant +insignificantly +insincere +insincerely +insincerity +insinuate +insinuated +insinuates +insinuating +insinuation +insinuations +insinuative +insinuator +insinuators +insipid +insipidity +insipidly +insist +insisted +insistence +insistent +insistently +insisting +insistingly +insists +insobriety +insofar +insole +insolence +insolent +insolently +insoles +insolubility +insoluble +insolubly +insolvable +insolvency +insolvent +insolvents +insomnia +insomniac +insomniacs +insomuch +insouciance +insouciant +inspect +inspected +inspecting +inspection +inspections +inspector +inspectorate +inspectorates +inspectors +inspects +inspiration +inspirational +inspirations +inspire +inspired +inspires +inspiring +inspirit +inspirited +inspiriting +inspirits +instability +instal +install +installation +installations +installed +installer +installers +installing +installment +installments +installs +instalment +instalments +instals +instance +instanced +instances +instancing +instant +instantaneous +instantaneously +instanter +instantiate +instantiated +instantiates +instantiating +instantly +instants +instate +instated +instates +instating +instead +instep +insteps +instigate +instigated +instigates +instigating +instigation +instigator +instigators +instil +instill +instillation +instilled +instilling +instills +instils +instinct +instinctive +instinctively +instincts +instinctual +institute +instituted +instituter +instituters +institutes +instituting +institution +institutional +institutionalization +institutionalize +institutionalized +institutionalizes +institutionalizing +institutionally +institutions +institutor +institutors +instruct +instructed +instructing +instruction +instructional +instructions +instructive +instructively +instructor +instructors +instructs +instrument +instrumental +instrumentalist +instrumentalists +instrumentality +instrumentally +instrumentals +instrumentation +instrumented +instrumenting +instruments +insubordinate +insubordination +insubstantial +insubstantially +insufferable +insufferably +insufficiency +insufficient +insufficiently +insular +insularity +insulate +insulated +insulates +insulating +insulation +insulator +insulators +insulin +insult +insulted +insulting +insultingly +insults +insuperable +insuperably +insupportable +insurable +insurance +insurances +insure +insured +insureds +insurer +insurers +insures +insurgence +insurgences +insurgencies +insurgency +insurgent +insurgents +insuring +insurmountable +insurmountably +insurrection +insurrectionist +insurrectionists +insurrections +insusceptible +intact +intagli +intaglio +intaglios +intake +intakes +intangibility +intangible +intangibles +intangibly +integer +integers +integral +integrally +integrals +integrate +integrated +integrates +integrating +integration +integrative +integrity +integument +integuments +intellect +intellects +intellectual +intellectualism +intellectualize +intellectualized +intellectualizes +intellectualizing +intellectually +intellectuals +intelligence +intelligent +intelligently +intelligentsia +intelligibility +intelligible +intelligibly +intemperance +intemperate +intemperately +intend +intended +intendeds +intending +intends +intense +intensely +intenser +intensest +intensification +intensified +intensifier +intensifiers +intensifies +intensify +intensifying +intensities +intensity +intensive +intensively +intensiveness +intensives +intent +intention +intentional +intentionally +intentions +intently +intentness +intents +inter +interact +interacted +interacting +interaction +interactions +interactive +interactively +interacts +interbred +interbreed +interbreeding +interbreeds +intercede +interceded +intercedes +interceding +intercept +intercepted +intercepting +interception +interceptions +interceptor +interceptors +intercepts +intercession +intercessions +intercessor +intercessors +intercessory +interchange +interchangeable +interchangeably +interchanged +interchanges +interchanging +intercollegiate +intercom +intercommunicate +intercommunicated +intercommunicates +intercommunicating +intercommunication +intercoms +interconnect +interconnected +interconnecting +interconnection +interconnections +interconnects +intercontinental +intercourse +intercultural +interdenominational +interdepartmental +interdependence +interdependent +interdependently +interdict +interdicted +interdicting +interdiction +interdicts +interdisciplinary +interest +interested +interesting +interestingly +interests +interface +interfaced +interfaces +interfacing +interfaith +interfere +interfered +interference +interferes +interfering +interferon +interfile +interfiled +interfiles +interfiling +intergalactic +intergovernmental +interim +interior +interiors +interject +interjected +interjecting +interjection +interjections +interjects +interlace +interlaced +interlaces +interlacing +interlard +interlarded +interlarding +interlards +interleave +interleaved +interleaves +interleaving +interleukin +interline +interlinear +interlined +interlines +interlining +interlinings +interlink +interlinked +interlinking +interlinks +interlock +interlocked +interlocking +interlocks +interlocutor +interlocutors +interlocutory +interlope +interloped +interloper +interlopers +interlopes +interloping +interlude +interludes +intermarriage +intermarriages +intermarried +intermarries +intermarry +intermarrying +intermediaries +intermediary +intermediate +intermediately +intermediates +interment +interments +intermezzi +intermezzo +intermezzos +interminable +interminably +intermingle +intermingled +intermingles +intermingling +intermission +intermissions +intermittent +intermittently +intermix +intermixed +intermixes +intermixing +intern +internal +internalization +internalize +internalized +internalizes +internalizing +internally +international +internationalise +internationalised +internationalises +internationalising +internationalism +internationalist +internationalists +internationalize +internationalized +internationalizes +internationalizing +internationally +internationals +interne +internecine +interned +internee +internees +internes +interning +internist +internists +internment +interns +internship +internships +interoffice +interpersonal +interplanetary +interplay +interpolate +interpolated +interpolates +interpolating +interpolation +interpolations +interpose +interposed +interposes +interposing +interposition +interpret +interpretation +interpretations +interpretative +interpreted +interpreter +interpreters +interpreting +interpretive +interprets +interracial +interred +interregna +interregnum +interregnums +interrelate +interrelated +interrelates +interrelating +interrelation +interrelations +interrelationship +interrelationships +interring +interrogate +interrogated +interrogates +interrogating +interrogation +interrogations +interrogative +interrogatively +interrogatives +interrogator +interrogatories +interrogators +interrogatory +interrupt +interrupted +interrupter +interrupters +interrupting +interruption +interruptions +interrupts +inters +interscholastic +intersect +intersected +intersecting +intersection +intersections +intersects +intersession +intersessions +intersperse +interspersed +intersperses +interspersing +interspersion +interstate +interstates +interstellar +interstice +interstices +interstitial +intertwine +intertwined +intertwines +intertwining +interurban +interval +intervals +intervene +intervened +intervenes +intervening +intervention +interventionism +interventionist +interventionists +interventions +interview +interviewed +interviewee +interviewees +interviewer +interviewers +interviewing +interviews +intervocalic +interweave +interweaved +interweaves +interweaving +interwove +interwoven +intestacy +intestate +intestinal +intestine +intestines +intimacies +intimacy +intimate +intimated +intimately +intimates +intimating +intimation +intimations +intimidate +intimidated +intimidates +intimidating +intimidatingly +intimidation +into +intolerable +intolerably +intolerance +intolerant +intolerantly +intonation +intonations +intone +intoned +intoner +intoners +intones +intoning +intoxicant +intoxicants +intoxicate +intoxicated +intoxicates +intoxicating +intoxication +intractability +intractable +intractably +intramural +intramuscular +intransigence +intransigent +intransigently +intransigents +intransitive +intransitively +intransitives +intrastate +intrauterine +intravenous +intravenouses +intravenously +intrench +intrenched +intrenches +intrenching +intrepid +intrepidity +intrepidly +intricacies +intricacy +intricate +intricately +intrigue +intrigued +intriguer +intriguers +intrigues +intriguing +intriguingly +intrinsic +intrinsically +intro +introduce +introduced +introduces +introducing +introduction +introductions +introductory +introit +introits +intros +introspect +introspected +introspecting +introspection +introspective +introspectively +introspects +introversion +introvert +introverted +introverts +intrude +intruded +intruder +intruders +intrudes +intruding +intrusion +intrusions +intrusive +intrusively +intrusiveness +intrust +intrusted +intrusting +intrusts +intuit +intuited +intuiting +intuition +intuitions +intuitive +intuitively +intuitiveness +intuits +inundate +inundated +inundates +inundating +inundation +inundations +inure +inured +inures +inuring +invade +invaded +invader +invaders +invades +invading +invalid +invalidate +invalidated +invalidates +invalidating +invalidation +invalided +invaliding +invalidism +invalidity +invalidly +invalids +invaluable +invaluably +invariability +invariable +invariables +invariably +invasion +invasions +invasive +invective +inveigh +inveighed +inveighing +inveighs +inveigle +inveigled +inveigler +inveiglers +inveigles +inveigling +invent +invented +inventing +invention +inventions +inventive +inventively +inventiveness +inventor +inventoried +inventories +inventors +inventory +inventorying +invents +inverse +inversely +inverses +inversion +inversions +invert +invertebrate +invertebrates +inverted +inverting +inverts +invest +invested +investigate +investigated +investigates +investigating +investigation +investigations +investigative +investigator +investigators +investigatory +investing +investiture +investitures +investment +investments +investor +investors +invests +inveteracy +inveterate +invidious +invidiously +invidiousness +invigorate +invigorated +invigorates +invigorating +invigoratingly +invigoration +invincibility +invincible +invincibly +inviolability +inviolable +inviolably +inviolate +invisibility +invisible +invisibly +invitation +invitational +invitationals +invitations +invite +invited +invitee +invitees +invites +inviting +invitingly +invocation +invocations +invoice +invoiced +invoices +invoicing +invoke +invoked +invokes +invoking +involuntarily +involuntariness +involuntary +involution +involve +involved +involvement +involvements +involves +involving +invulnerability +invulnerable +invulnerably +inward +inwardly +inwards +iodide +iodides +iodine +iodize +iodized +iodizes +iodizing +ionic +ionization +ionize +ionized +ionizer +ionizers +ionizes +ionizing +ionosphere +ionospheres +ionospheric +ions +iota +iotas +ipecac +ipecacs +irascibility +irascible +irascibly +irate +irately +irateness +ireful +irenic +irides +iridescence +iridescent +iridescently +iridium +iris +irises +irked +irking +irks +irksome +irksomely +irksomeness +iron +ironclad +ironclads +ironed +ironic +ironical +ironically +ironies +ironing +irons +ironstone +ironware +ironwood +ironwoods +ironwork +irony +irradiate +irradiated +irradiates +irradiating +irradiation +irrational +irrationality +irrationally +irrationals +irreclaimable +irreconcilability +irreconcilable +irreconcilably +irrecoverable +irrecoverably +irredeemable +irredeemably +irreducible +irreducibly +irrefutable +irrefutably +irregardless +irregular +irregularities +irregularity +irregularly +irregulars +irrelevance +irrelevances +irrelevancies +irrelevancy +irrelevant +irrelevantly +irreligious +irremediable +irremediably +irremovable +irreparable +irreparably +irreplaceable +irrepressible +irrepressibly +irreproachable +irreproachably +irresistible +irresistibly +irresolute +irresolutely +irresoluteness +irresolution +irrespective +irresponsibility +irresponsible +irresponsibly +irretrievable +irretrievably +irreverence +irreverent +irreverently +irreversible +irreversibly +irrevocable +irrevocably +irrigable +irrigate +irrigated +irrigates +irrigating +irrigation +irritability +irritable +irritably +irritant +irritants +irritate +irritated +irritates +irritating +irritatingly +irritation +irritations +irrupt +irrupted +irrupting +irruption +irruptions +irruptive +irrupts +isinglass +island +islander +islanders +islands +isle +isles +islet +islets +isms +isobar +isobaric +isobars +isolate +isolated +isolates +isolating +isolation +isolationism +isolationist +isolationists +isomer +isomeric +isomerism +isomers +isometric +isometrically +isometrics +isosceles +isotherm +isotherms +isotope +isotopes +isotopic +issuance +issue +issued +issuer +issuers +issues +issuing +isthmi +isthmian +isthmus +isthmuses +italic +italicization +italicize +italicized +italicizes +italicizing +italics +itch +itched +itches +itchier +itchiest +itchiness +itching +itchy +item +itemization +itemize +itemized +itemizes +itemizing +items +iterate +iterated +iterates +iterating +iteration +iterations +iterative +itinerant +itinerants +itineraries +itinerary +itself +ivied +ivies +ivories +ivory +jabbed +jabber +jabbered +jabberer +jabberers +jabbering +jabbers +jabbing +jabot +jabots +jabs +jacaranda +jacarandas +jack +jackal +jackals +jackass +jackasses +jackboot +jackboots +jackdaw +jackdaws +jacked +jacket +jacketed +jackets +jackhammer +jackhammers +jacking +jackknife +jackknifed +jackknifes +jackknifing +jackknives +jackpot +jackpots +jackrabbit +jackrabbits +jacks +jackstraw +jackstraws +jacquard +jade +jaded +jadedly +jadedness +jadeite +jades +jading +jagged +jaggeder +jaggedest +jaggedly +jaggedness +jags +jaguar +jaguars +jail +jailbird +jailbirds +jailbreak +jailbreaks +jailed +jailer +jailers +jailing +jailor +jailors +jails +jalapeno +jalapenos +jalopies +jalopy +jalousie +jalousies +jamb +jambalaya +jamboree +jamborees +jambs +jammed +jamming +jams +jangle +jangled +jangler +janglers +jangles +jangling +janitor +janitorial +janitors +japan +japanned +japanning +japans +jape +japed +japes +japing +jardiniere +jardinieres +jarful +jarfuls +jargon +jarred +jarring +jarringly +jars +jasmine +jasmines +jasper +jato +jatos +jaundice +jaundiced +jaundices +jaundicing +jaunt +jaunted +jauntier +jauntiest +jauntily +jauntiness +jaunting +jaunts +jaunty +java +javelin +javelins +jawbone +jawboned +jawbones +jawboning +jawbreaker +jawbreakers +jawed +jawing +jaws +jaybird +jaybirds +jays +jaywalk +jaywalked +jaywalker +jaywalkers +jaywalking +jaywalks +jazz +jazzed +jazzes +jazzier +jazziest +jazzing +jazzy +jealous +jealousies +jealously +jealousy +jean +jeans +jeep +jeeps +jeer +jeered +jeering +jeeringly +jeers +jeez +jehad +jehads +jejuna +jejune +jejunum +jejunums +jell +jelled +jellied +jellies +jelling +jello +jells +jelly +jellybean +jellybeans +jellyfish +jellyfishes +jellying +jellylike +jellyroll +jellyrolls +jennet +jennets +jennies +jenny +jeopardize +jeopardized +jeopardizes +jeopardizing +jeopardy +jeremiad +jeremiads +jerk +jerked +jerkier +jerkiest +jerkily +jerkin +jerkiness +jerking +jerkins +jerks +jerkwater +jerky +jerrybuilt +jersey +jerseys +jessamine +jessamines +jest +jested +jester +jesters +jesting +jestingly +jests +jetliner +jetliners +jetport +jetports +jets +jetsam +jetted +jetties +jetting +jettison +jettisoned +jettisoning +jettisons +jetty +jewed +jewel +jeweled +jeweler +jewelers +jeweling +jewelled +jeweller +jewelleries +jewellers +jewellery +jewelling +jewelries +jewelry +jewels +jewing +jews +jibbed +jibbing +jibe +jibed +jibes +jibing +jibs +jiff +jiffies +jiffs +jiffy +jigged +jigger +jiggered +jiggering +jiggers +jigging +jiggle +jiggled +jiggles +jigglier +jiggliest +jiggling +jiggly +jigs +jigsaw +jigsawed +jigsawing +jigsawn +jigsaws +jihad +jihads +jilt +jilted +jilting +jilts +jimmied +jimmies +jimmy +jimmying +jimsonweed +jingle +jingled +jingles +jinglier +jingliest +jingling +jingly +jingoism +jingoist +jingoistic +jingoists +jinn +jinni +jinnis +jinns +jinricksha +jinrickshas +jinrikisha +jinrikishas +jinriksha +jinrikshas +jinx +jinxed +jinxes +jinxing +jitney +jitneys +jitterbug +jitterbugged +jitterbugger +jitterbuggers +jitterbugging +jitterbugs +jitterier +jitteriest +jitters +jittery +jiujitsu +jive +jived +jives +jiving +jobbed +jobber +jobbers +jobbing +jobholder +jobholders +jobless +joblessness +jobs +jock +jockey +jockeyed +jockeying +jockeys +jocks +jockstrap +jockstraps +jocose +jocosely +jocoseness +jocosity +jocular +jocularity +jocularly +jocund +jocundity +jocundly +jodhpurs +jogged +jogger +joggers +jogging +joggle +joggled +joggles +joggling +jogs +john +johnnies +johnny +johnnycake +johnnycakes +johns +join +joined +joiner +joiners +joinery +joining +joins +joint +jointed +jointing +jointly +joints +joist +joists +joke +joked +joker +jokers +jokes +jokey +jokier +jokiest +joking +jokingly +joky +jollied +jollier +jollies +jolliest +jollification +jollifications +jollily +jolliness +jollity +jolly +jollying +jolt +jolted +jolter +jolters +jolting +jolts +jonquil +jonquils +josh +joshed +josher +joshers +joshes +joshing +jostle +jostled +jostles +jostling +jots +jotted +jotter +jotters +jotting +jottings +joule +joules +jounce +jounced +jounces +jouncier +jounciest +jouncing +jouncy +journal +journalese +journalism +journalist +journalistic +journalists +journals +journey +journeyed +journeyer +journeyers +journeying +journeyman +journeymen +journeys +joust +jousted +jouster +jousters +jousting +jousts +jovial +joviality +jovially +jowl +jowlier +jowliest +jowls +jowly +joyed +joyful +joyfuller +joyfullest +joyfully +joyfulness +joying +joyless +joylessly +joylessness +joyous +joyously +joyousness +joyridden +joyride +joyrider +joyriders +joyrides +joyriding +joyrode +joys +joystick +joysticks +jubilant +jubilantly +jubilation +jubilee +jubilees +judge +judged +judgement +judgements +judges +judgeship +judging +judgment +judgmental +judgmentally +judgments +judicatories +judicatory +judicature +judicial +judicially +judiciaries +judiciary +judicious +judiciously +judiciousness +judo +jugful +jugfuls +jugged +juggernaut +juggernauts +jugging +juggle +juggled +juggler +jugglers +jugglery +juggles +juggling +jugs +jugular +jugulars +juice +juiced +juicer +juicers +juices +juicier +juiciest +juicily +juiciness +juicing +juicy +jujitsu +jujube +jujubes +jujutsu +jukebox +jukeboxes +julep +juleps +julienne +julienned +juliennes +julienning +jumble +jumbled +jumbles +jumbling +jumbo +jumbos +jump +jumped +jumper +jumpers +jumpier +jumpiest +jumpily +jumpiness +jumping +jumps +jumpsuit +jumpsuits +jumpy +junco +juncoes +juncos +junction +junctions +juncture +junctures +jungle +jungles +junior +juniors +juniper +junipers +junk +junked +junker +junkers +junket +junketed +junketeer +junketeers +junketer +junketers +junketing +junkets +junkie +junkier +junkies +junkiest +junking +junks +junky +junkyard +junkyards +junta +juntas +juridic +juridical +juridically +juries +jurisdiction +jurisdictional +jurisprudence +jurist +juristic +jurists +juror +jurors +jury +juryman +jurymen +jurywoman +jurywomen +just +juster +justest +justice +justices +justifiable +justifiably +justification +justifications +justified +justifies +justify +justifying +justly +justness +jute +juts +jutted +jutting +juvenile +juveniles +juxtapose +juxtaposed +juxtaposes +juxtaposing +juxtaposition +juxtapositions +kabob +kabobs +kabuki +kaddish +kaddishes +kaffeeklatch +kaffeeklatches +kaffeeklatsch +kaffeeklatsches +kaftan +kaftans +kaiser +kaisers +kale +kaleidoscope +kaleidoscopes +kaleidoscopic +kaleidoscopically +kamikaze +kamikazes +kangaroo +kangaroos +kaolin +kapok +kappa +kappas +kaput +karakul +karaoke +karaokes +karat +karate +karats +karma +karmic +kart +karts +katydid +katydids +kayak +kayaked +kayaking +kayaks +kayo +kayoed +kayoing +kayos +kazoo +kazoos +kebab +kebabs +kebob +kebobs +keel +keeled +keelhaul +keelhauled +keelhauling +keelhauls +keeling +keels +keen +keened +keener +keenest +keening +keenly +keenness +keens +keep +keeper +keepers +keeping +keeps +keepsake +keepsakes +kegs +kelp +kelvin +kelvins +kenned +kennel +kenneled +kenneling +kennelled +kennelling +kennels +kenning +keno +kens +kent +kepi +kepis +kept +keratin +kerb +kerbs +kerchief +kerchiefs +kerchieves +kernel +kernels +kerosene +kerosine +kestrel +kestrels +ketch +ketches +ketchup +kettle +kettledrum +kettledrums +kettles +keyboard +keyboarded +keyboarder +keyboarders +keyboarding +keyboardist +keyboardists +keyboards +keyed +keyhole +keyholes +keying +keynote +keynoted +keynoter +keynoters +keynotes +keynoting +keypad +keypads +keypunch +keypunched +keypuncher +keypunchers +keypunches +keypunching +keys +keystone +keystones +keystroke +keystrokes +keyword +keywords +khaki +khakis +khan +khans +kibble +kibbled +kibbles +kibbling +kibbutz +kibbutzim +kibitz +kibitzed +kibitzer +kibitzers +kibitzes +kibitzing +kibosh +kick +kickback +kickbacks +kickball +kicked +kicker +kickers +kickier +kickiest +kicking +kickoff +kickoffs +kicks +kickstand +kickstands +kicky +kidded +kidder +kidders +kiddie +kiddies +kidding +kiddish +kiddo +kiddoes +kiddos +kiddy +kidnap +kidnaped +kidnaper +kidnapers +kidnaping +kidnapped +kidnapper +kidnappers +kidnapping +kidnappings +kidnaps +kidney +kidneys +kids +kidskin +kielbasa +kielbasas +kielbasi +kielbasy +kill +killdeer +killdeers +killed +killer +killers +killing +killings +killjoy +killjoys +kills +kiln +kilned +kilning +kilns +kilo +kilobyte +kilobytes +kilocycle +kilocycles +kilogram +kilograms +kilohertz +kilohertzes +kiloliter +kiloliters +kilometer +kilometers +kilometre +kilometres +kilos +kiloton +kilotons +kilowatt +kilowatts +kilt +kilter +kilts +kimono +kimonos +kind +kinda +kinder +kindergarten +kindergartener +kindergarteners +kindergartens +kindergartner +kindergartners +kindest +kindhearted +kindheartedly +kindheartedness +kindle +kindled +kindles +kindlier +kindliest +kindliness +kindling +kindly +kindness +kindnesses +kindred +kinds +kine +kinematic +kinematics +kinetic +kinetically +kinetics +kinfolk +kinfolks +king +kingdom +kingdoms +kingfisher +kingfishers +kinglier +kingliest +kingly +kingpin +kingpins +kings +kingship +kink +kinked +kinkier +kinkiest +kinkily +kinkiness +kinking +kinks +kinky +kinsfolk +kinsfolks +kinship +kinsman +kinsmen +kinswoman +kinswomen +kiosk +kiosks +kipped +kipper +kippered +kippering +kippers +kipping +kips +kirk +kirks +kirsch +kismet +kiss +kissable +kissed +kisser +kissers +kisses +kissing +kissoff +kissoffs +kitbag +kitbags +kitchen +kitchenette +kitchenettes +kitchens +kitchenware +kite +kited +kites +kith +kiting +kits +kitsch +kitschier +kitschiest +kitschy +kitten +kittenish +kittens +kitties +kitty +kiwi +kiwifruit +kiwifruits +kiwis +kleptomania +kleptomaniac +kleptomaniacs +klutz +klutzes +klutzier +klutziest +klutziness +klutzy +knack +knacks +knackwurst +knackwursts +knapsack +knapsacks +knave +knavery +knaves +knavish +knavishly +knead +kneaded +kneader +kneaders +kneading +kneads +knee +kneecap +kneecapped +kneecapping +kneecaps +kneed +kneeing +kneel +kneeled +kneeling +kneels +knees +knell +knelled +knelling +knells +knelt +knew +knickerbockers +knickers +knickknack +knickknacks +knife +knifed +knifes +knifing +knight +knighted +knighthood +knighthoods +knighting +knightlier +knightliest +knightliness +knightly +knights +knish +knishes +knit +knits +knitted +knitter +knitters +knitting +knitwear +knives +knob +knobbier +knobbiest +knobby +knobs +knock +knockdown +knockdowns +knocked +knocker +knockers +knocking +knockoff +knockoffs +knockout +knockouts +knocks +knockwurst +knockwursts +knoll +knolls +knot +knothole +knotholes +knots +knotted +knottier +knottiest +knotting +knotty +know +knowable +knowing +knowingly +knowledge +knowledgeable +knowledgeably +known +knows +knuckle +knuckled +knucklehead +knuckleheads +knuckles +knuckling +knurl +knurled +knurling +knurls +koala +koalas +kohlrabi +kohlrabies +kola +kolas +kook +kookaburra +kookaburras +kookie +kookier +kookiest +kookiness +kooks +kooky +kopeck +kopecks +kopek +kopeks +kosher +koshered +koshering +koshers +kowtow +kowtowed +kowtowing +kowtows +kraal +kraals +kraut +krauts +krill +krona +krone +kroner +kronor +kronur +krypton +kuchen +kuchens +kudos +kudzu +kudzus +kumquat +kumquats +kvetch +kvetched +kvetcher +kvetchers +kvetches +kvetching +label +labeled +labeling +labelled +labelling +labels +labia +labial +labials +labile +labium +labor +laboratories +laboratory +labored +laborer +laborers +laboring +laborious +laboriously +laboriousness +labors +laborsaving +labour +laboured +labouring +labours +labs +laburnum +laburnums +labyrinth +labyrinthine +labyrinths +lace +laced +lacerate +lacerated +lacerates +lacerating +laceration +lacerations +laces +lacewing +lacewings +lacework +lachrymal +lachrymose +lacier +laciest +lacing +lack +lackadaisical +lackadaisically +lacked +lackey +lackeys +lacking +lackluster +lacklustre +lacks +laconic +laconically +lacquer +lacquered +lacquering +lacquers +lacrimal +lacrosse +lactate +lactated +lactates +lactating +lactation +lacteal +lactic +lactose +lacuna +lacunae +lacunas +lacy +ladder +laddered +laddering +ladders +laddie +laddies +lade +laded +laden +lades +ladies +lading +ladings +ladle +ladled +ladles +ladling +lads +lady +ladybird +ladybirds +ladybug +ladybugs +ladyfinger +ladyfingers +ladylike +ladylove +ladyloves +ladyship +laetrile +lager +lagers +laggard +laggardly +laggards +lagged +lagging +lagnappe +lagnappes +lagniappe +lagniappes +lagoon +lagoons +lags +laid +lain +lair +laird +lairds +lairs +laity +lake +lakefront +lakes +lallygag +lallygagged +lallygagging +lallygags +lama +lamas +lamaseries +lamasery +lamb +lambada +lambadas +lambast +lambaste +lambasted +lambastes +lambasting +lambasts +lambda +lambdas +lambed +lambency +lambent +lambently +lambing +lambkin +lambkins +lambs +lambskin +lambskins +lame +lamebrain +lamebrained +lamebrains +lamed +lamely +lameness +lament +lamentable +lamentably +lamentation +lamentations +lamented +lamenting +laments +lamer +lames +lamest +lamina +laminae +laminar +laminas +laminate +laminated +laminates +laminating +lamination +laming +lammed +lamming +lamp +lampblack +lamplight +lamplighter +lamplighters +lampoon +lampooned +lampooning +lampoons +lamppost +lampposts +lamprey +lampreys +lamps +lampshade +lampshades +lams +lanai +lanais +lance +lanced +lancer +lancers +lances +lancet +lancets +lancing +land +landau +landaus +landed +landfall +landfalls +landfill +landfills +landholder +landholders +landholding +landing +landings +landladies +landlady +landless +landlocked +landlord +landlords +landlubber +landlubbers +landmark +landmarks +landmass +landmasses +landowner +landowners +landowning +lands +landscape +landscaped +landscaper +landscapers +landscapes +landscaping +landslid +landslidden +landslide +landslides +landsliding +landsman +landsmen +landward +landwards +lane +lanes +language +languages +languid +languidly +languidness +languish +languished +languishes +languishing +languor +languorous +languorously +lank +lanker +lankest +lankier +lankiest +lankiness +lankly +lankness +lanky +lanolin +lantern +lanterns +lanthanum +lanyard +lanyards +lapboard +lapboards +lapdog +lapdogs +lapel +lapels +lapidaries +lapidary +lapin +lapins +lapped +lappet +lappets +lapping +laps +lapse +lapsed +lapses +lapsing +laptop +laptops +lapwing +lapwings +larboard +larboards +larcenies +larcenist +larcenists +larcenous +larceny +larch +larches +lard +larded +larder +larders +lardier +lardiest +larding +lards +lardy +large +largehearted +largely +largeness +larger +larges +largess +largesse +largest +largish +largo +largos +lariat +lariats +lark +larked +larking +larks +larkspur +larkspurs +larva +larvae +larval +larvas +laryngeal +larynges +laryngitis +larynx +larynxes +lasagna +lasagnas +lasagne +lasagnes +lascivious +lasciviously +lasciviousness +laser +lasers +lash +lashed +lashes +lashing +lashings +lass +lasses +lassie +lassies +lassitude +lasso +lassoed +lassoes +lassoing +lassos +last +lasted +lasting +lastingly +lastly +lasts +latch +latched +latches +latching +latchkey +latchkeys +late +latecomer +latecomers +lately +latency +lateness +latent +later +lateral +lateraled +lateraling +lateralled +lateralling +laterally +laterals +latest +latex +lath +lathe +lathed +lather +lathered +lathering +lathers +lathery +lathes +lathing +laths +latish +latitude +latitudes +latitudinal +latitudinarian +latitudinarians +latrine +latrines +latte +latter +latterly +lattes +lattice +latticed +lattices +latticework +latticeworks +laud +laudable +laudably +laudanum +laudatory +lauded +lauding +lauds +laugh +laughable +laughably +laughed +laughing +laughingly +laughingstock +laughingstocks +laughs +laughter +launch +launched +launcher +launchers +launches +launching +launchpad +launchpads +launder +laundered +launderer +launderers +launderette +launderettes +laundering +launders +laundress +laundresses +laundrette +laundrettes +laundries +laundromat +laundromats +laundry +laundryman +laundrymen +laundrywoman +laundrywomen +laureate +laureates +laureateship +laurel +laurels +lava +lavage +lavalier +lavaliere +lavalieres +lavaliers +lavatories +lavatory +lave +laved +lavender +lavenders +laves +laving +lavish +lavished +lavisher +lavishes +lavishest +lavishing +lavishly +lavishness +lawbreaker +lawbreakers +lawbreaking +lawful +lawfully +lawfulness +lawgiver +lawgivers +lawless +lawlessly +lawlessness +lawmaker +lawmakers +lawmaking +lawman +lawmen +lawn +lawnmower +lawnmowers +lawns +lawrencium +laws +lawsuit +lawsuits +lawyer +lawyers +laxative +laxatives +laxer +laxest +laxity +laxly +laxness +layaway +layer +layered +layering +layers +layette +layettes +laying +layman +laymen +layoff +layoffs +layout +layouts +layover +layovers +laypeople +layperson +laypersons +lays +layup +layups +laywoman +laywomen +laze +lazed +lazes +lazied +lazier +lazies +laziest +lazily +laziness +lazing +lazy +lazybones +lazying +leach +leached +leaches +leaching +lead +leaded +leaden +leader +leaderless +leaders +leadership +leading +leads +leaf +leafage +leafed +leafier +leafiest +leafing +leafless +leaflet +leafleted +leafleting +leaflets +leafletted +leafletting +leafs +leafstalk +leafstalks +leafy +league +leagued +leagues +leaguing +leak +leakage +leakages +leaked +leakier +leakiest +leakiness +leaking +leaks +leaky +lean +leaned +leaner +leanest +leaning +leanings +leanness +leans +leant +leap +leaped +leaper +leapers +leapfrog +leapfrogged +leapfrogging +leapfrogs +leaping +leaps +leapt +learn +learned +learnedly +learner +learners +learning +learns +learnt +leas +lease +leaseback +leasebacks +leased +leasehold +leaseholder +leaseholders +leaseholds +leaser +leasers +leases +leash +leashed +leashes +leashing +leasing +least +leastways +leastwise +leather +leatherette +leatherneck +leathernecks +leathery +leave +leaved +leaven +leavened +leavening +leavens +leaver +leavers +leaves +leaving +leavings +lech +lecher +lecherous +lecherously +lecherousness +lechers +lechery +leches +lecithin +lectern +lecterns +lecture +lectured +lecturer +lecturers +lectures +lectureship +lectureships +lecturing +ledge +ledger +ledgers +ledges +leech +leeched +leeches +leeching +leek +leeks +leer +leered +leerier +leeriest +leeriness +leering +leers +leery +lees +leeward +leewards +leeway +left +lefter +leftest +leftie +lefties +leftism +leftist +leftists +leftmost +leftover +leftovers +lefts +leftward +leftwards +lefty +legacies +legacy +legal +legalese +legalism +legalisms +legalistic +legality +legalization +legalize +legalized +legalizes +legalizing +legally +legals +legate +legatee +legatees +legates +legation +legations +legato +legatos +legend +legendarily +legendary +legends +legerdemain +legged +leggier +leggiest +leggin +legginess +legging +leggings +leggins +leggy +leghorn +leghorns +legibility +legible +legibly +legion +legionaries +legionary +legionnaire +legionnaires +legions +legislate +legislated +legislates +legislating +legislation +legislative +legislatively +legislator +legislators +legislature +legislatures +legit +legitimacy +legitimate +legitimated +legitimately +legitimates +legitimating +legitimatize +legitimatized +legitimatizes +legitimatizing +legitimization +legitimize +legitimized +legitimizes +legitimizing +legless +legman +legmen +legroom +legrooms +legs +legume +legumes +leguminous +legwork +leis +leisure +leisured +leisureliness +leisurely +leisurewear +leitmotif +leitmotifs +leitmotiv +leitmotivs +lemming +lemmings +lemon +lemonade +lemons +lemony +lemur +lemurs +lend +lender +lenders +lending +lends +length +lengthen +lengthened +lengthening +lengthens +lengthier +lengthiest +lengthily +lengthiness +lengths +lengthways +lengthwise +lengthy +lenience +leniency +lenient +leniently +lenitive +lens +lenses +lent +lenten +lentil +lentils +lento +leonine +leopard +leopardess +leopardesses +leopards +leotard +leotards +leper +lepers +leprechaun +leprechauns +leprosy +leprous +lept +lepta +lepton +leptons +lesbian +lesbianism +lesbians +lesion +lesions +less +lessee +lessees +lessen +lessened +lessening +lessens +lesser +lesson +lessons +lessor +lessors +lest +letdown +letdowns +lethal +lethally +lethargic +lethargically +lethargy +lets +letter +lettered +letterer +letterers +letterhead +letterheads +lettering +letterpress +letters +letting +lettuce +lettuces +letup +letups +leukaemia +leukemia +leukemic +leukemics +leukocyte +leukocytes +levee +levees +level +leveled +leveler +levelers +levelheaded +levelheadedness +leveling +levelled +leveller +levellers +levelling +levelly +levelness +levels +lever +leverage +leveraged +leverages +leveraging +levered +levering +levers +leviathan +leviathans +levied +levier +leviers +levies +levitate +levitated +levitates +levitating +levitation +levity +levy +levying +lewd +lewder +lewdest +lewdly +lewdness +lexica +lexical +lexicographer +lexicographers +lexicographic +lexicographical +lexicography +lexicon +lexicons +liabilities +liability +liable +liaise +liaised +liaises +liaising +liaison +liaisons +liar +liars +libation +libations +libber +libbers +libel +libeled +libeler +libelers +libeling +libelled +libeller +libellers +libelling +libellous +libelous +libels +liberal +liberalism +liberality +liberalization +liberalizations +liberalize +liberalized +liberalizes +liberalizing +liberally +liberalness +liberals +liberate +liberated +liberates +liberating +liberation +liberator +liberators +libertarian +libertarians +liberties +libertine +libertines +liberty +libidinal +libidinous +libido +libidos +librarian +librarians +libraries +library +libretti +librettist +librettists +libretto +librettos +lice +licence +licenced +licences +licencing +license +licensed +licensee +licensees +licenses +licensing +licentiate +licentiates +licentious +licentiously +licentiousness +lichee +lichees +lichen +lichens +licit +licitly +lick +licked +licking +lickings +licks +licorice +licorices +lidded +lidless +lido +lidos +lids +lied +lieder +lief +liefer +liefest +liege +lieges +lien +liens +lies +lieu +lieutenancy +lieutenant +lieutenants +life +lifeblood +lifeboat +lifeboats +lifebuoy +lifebuoys +lifeguard +lifeguards +lifeless +lifelessly +lifelessness +lifelike +lifeline +lifelines +lifelong +lifer +lifers +lifesaver +lifesavers +lifesaving +lifestyle +lifestyles +lifetime +lifetimes +lifework +lifeworks +lift +lifted +lifter +lifters +lifting +liftoff +liftoffs +lifts +ligament +ligaments +ligate +ligated +ligates +ligating +ligation +ligature +ligatured +ligatures +ligaturing +light +lighted +lighten +lightened +lightener +lighteners +lightening +lightens +lighter +lighters +lightest +lightface +lightfaced +lightheaded +lighthearted +lightheartedly +lightheartedness +lighthouse +lighthouses +lighting +lightly +lightness +lightning +lightninged +lightnings +lightproof +lights +lightship +lightships +lightweight +lightweights +ligneous +lignite +likability +likable +likableness +like +likeable +liked +likelier +likeliest +likelihood +likelihoods +likeliness +likely +liken +likened +likeness +likenesses +likening +likens +liker +likes +likest +likewise +liking +lilac +lilacs +lilies +lilliputian +lilt +lilted +lilting +lilts +lily +limb +limber +limbered +limbering +limberness +limbers +limbless +limbo +limbos +limbs +lime +limeade +limeades +limed +limelight +limerick +limericks +limes +limestone +limier +limiest +liming +limit +limitation +limitations +limited +limiter +limiters +limiting +limitless +limitlessness +limits +limn +limned +limning +limns +limo +limos +limousine +limousines +limp +limped +limper +limpest +limpet +limpets +limpid +limpidity +limpidly +limpidness +limping +limply +limpness +limps +limy +linage +linchpin +linchpins +linden +lindens +line +lineage +lineages +lineal +lineally +lineament +lineaments +linear +linearity +linearly +linebacker +linebackers +lined +lineman +linemen +linen +linens +liner +liners +lines +linesman +linesmen +lineup +lineups +ling +linger +lingered +lingerer +lingerers +lingerie +lingering +lingeringly +lingers +lingo +lingoes +lingos +lings +lingual +linguine +linguini +linguist +linguistic +linguistically +linguistics +linguists +liniment +liniments +lining +linings +link +linkage +linkages +linked +linking +links +linkup +linkups +linnet +linnets +linoleum +linseed +lint +lintel +lintels +lintier +lintiest +linty +lion +lioness +lionesses +lionhearted +lionization +lionize +lionized +lionizes +lionizing +lions +lipid +lipids +liposuction +lipped +lippier +lippiest +lippy +lipread +lipreader +lipreaders +lipreading +lipreads +lips +lipstick +lipsticks +liquefaction +liquefied +liquefies +liquefy +liquefying +liqueur +liqueurs +liquid +liquidate +liquidated +liquidates +liquidating +liquidation +liquidations +liquidator +liquidators +liquidity +liquidize +liquidized +liquidizer +liquidizers +liquidizes +liquidizing +liquids +liquified +liquifies +liquify +liquifying +liquor +liquored +liquorice +liquorices +liquoring +liquors +lira +liras +lire +lisle +lisp +lisped +lisper +lispers +lisping +lisps +lissom +lissome +list +listed +listen +listened +listener +listeners +listening +listens +listing +listings +listless +listlessly +listlessness +lists +litanies +litany +litchi +litchis +lite +liter +literacy +literal +literally +literalness +literals +literariness +literary +literate +literately +literates +literati +literature +liters +lithe +lithely +litheness +lither +lithesome +lithest +lithium +lithograph +lithographed +lithographer +lithographers +lithographic +lithographically +lithographing +lithographs +lithography +lithosphere +lithospheres +litigant +litigants +litigate +litigated +litigates +litigating +litigation +litigator +litigators +litigious +litigiousness +litmus +litotes +litre +litres +litter +litterateur +litterateurs +litterbug +litterbugs +littered +litterer +litterers +littering +litters +little +littleness +littler +littlest +littoral +littorals +liturgical +liturgically +liturgies +liturgist +liturgists +liturgy +livability +livable +live +liveable +lived +livelier +liveliest +livelihood +livelihoods +liveliness +livelong +lively +liven +livened +livening +livens +liver +liveried +liveries +liverish +livers +liverwort +liverworts +liverwurst +livery +liveryman +liverymen +lives +livest +livestock +livid +lividly +living +livings +lizard +lizards +llama +llamas +llano +llanos +load +loaded +loader +loaders +loading +loads +loadstar +loadstars +loadstone +loadstones +loaf +loafed +loafer +loafers +loafing +loafs +loam +loamier +loamiest +loamy +loan +loaned +loaner +loaners +loaning +loans +loansharking +loanword +loanwords +loath +loathe +loathed +loather +loathers +loathes +loathing +loathings +loathsome +loathsomely +loathsomeness +loaves +lobar +lobbed +lobber +lobbers +lobbied +lobbies +lobbing +lobby +lobbying +lobbyist +lobbyists +lobe +lobed +lobes +lobotomies +lobotomize +lobotomized +lobotomizes +lobotomizing +lobotomy +lobs +lobster +lobsters +local +locale +locales +localities +locality +localization +localize +localized +localizes +localizing +locally +locals +locate +located +locates +locating +location +locations +locator +locators +loch +lochs +loci +lock +locked +locker +lockers +locket +lockets +locking +lockjaw +lockout +lockouts +locks +locksmith +locksmiths +lockstep +lockup +lockups +loco +locomotion +locomotive +locomotives +locoweed +locoweeds +locus +locust +locusts +locution +locutions +lode +lodes +lodestar +lodestars +lodestone +lodestones +lodge +lodged +lodger +lodgers +lodges +lodging +lodgings +loft +lofted +loftier +loftiest +loftily +loftiness +lofting +lofts +lofty +loganberries +loganberry +logarithm +logarithmic +logarithms +logbook +logbooks +loge +loges +logged +logger +loggerhead +loggerheads +loggers +loggia +loggias +logging +logic +logical +logicality +logically +logician +logicians +logier +logiest +logistic +logistical +logistically +logistics +logjam +logjams +logo +logos +logotype +logotypes +logrolling +logs +logy +loin +loincloth +loincloths +loins +loiter +loitered +loiterer +loiterers +loitering +loiters +loll +lolled +lolling +lollipop +lollipops +lolls +lollygag +lollygagged +lollygagging +lollygags +lollypop +lollypops +lone +lonelier +loneliest +loneliness +lonely +loner +loners +lonesome +lonesomely +lonesomeness +long +longboat +longboats +longbow +longbows +longed +longer +longest +longevity +longhair +longhairs +longhand +longhorn +longhorns +longing +longingly +longings +longish +longitude +longitudes +longitudinal +longitudinally +longs +longshoreman +longshoremen +longsighted +longstanding +longtime +longueur +longueurs +longways +loofah +loofahs +look +lookalike +lookalikes +looked +looker +lookers +looking +lookout +lookouts +looks +loom +loomed +looming +looms +loon +looney +looneys +loonier +loonies +looniest +loons +loony +loop +looped +loophole +loopholes +loopier +loopiest +looping +loops +loopy +loose +loosed +loosely +loosen +loosened +looseness +loosening +loosens +looser +looses +loosest +loosing +loot +looted +looter +looters +looting +loots +lope +loped +lopes +loping +lopped +lopping +lops +lopsided +lopsidedly +lopsidedness +loquacious +loquaciousness +loquacity +lord +lorded +lording +lordlier +lordliest +lordliness +lordly +lords +lordship +lordships +lore +lorgnette +lorgnettes +loris +lorises +lorn +lorries +lorry +lose +loser +losers +loses +losing +losings +loss +losses +lost +loth +lotion +lotions +lots +lotteries +lottery +lotto +lotus +lotuses +loud +louder +loudest +loudhailer +loudhailers +loudly +loudmouth +loudmouthed +loudmouths +loudness +loudspeaker +loudspeakers +lounge +lounged +lounger +loungers +lounges +lounging +lour +loured +louring +lours +louse +louses +lousier +lousiest +lousily +lousiness +lousy +lout +loutish +loutishly +louts +louver +louvered +louvers +louvre +louvred +louvres +lovable +lovableness +lovably +love +loveable +lovebird +lovebirds +lovechild +lovechildren +loved +loveless +lovelier +lovelies +loveliest +loveliness +lovelorn +lovely +lovemaking +lover +lovers +loves +loveseat +loveseats +lovesick +loving +lovingly +lowborn +lowboy +lowboys +lowbrow +lowbrows +lowdown +lowed +lower +lowercase +lowered +lowering +lowermost +lowers +lowest +lowing +lowland +lowlander +lowlanders +lowlands +lowlier +lowliest +lowlife +lowlifes +lowliness +lowlives +lowly +lowness +lows +loyal +loyaler +loyalest +loyalism +loyalist +loyalists +loyaller +loyallest +loyally +loyalties +loyalty +lozenge +lozenges +luau +luaus +lubber +lubberly +lubbers +lube +lubed +lubes +lubing +lubricant +lubricants +lubricate +lubricated +lubricates +lubricating +lubrication +lubricator +lubricators +lubricious +lubricity +lucid +lucider +lucidest +lucidity +lucidly +lucidness +luck +lucked +luckier +luckiest +luckily +luckiness +lucking +luckless +lucks +lucky +lucrative +lucratively +lucrativeness +lucre +lucubrate +lucubrated +lucubrates +lucubrating +lucubration +ludicrous +ludicrously +ludicrousness +luff +luffed +luffing +luffs +luggage +lugged +lugger +luggers +lugging +lugs +lugsail +lugsails +lugubrious +lugubriously +lugubriousness +lukewarm +lukewarmly +lukewarmness +lull +lullabies +lullaby +lulled +lulling +lulls +lumbago +lumbar +lumber +lumbered +lumberer +lumberers +lumbering +lumberjack +lumberjacks +lumberman +lumbermen +lumbers +lumberyard +lumberyards +luminaries +luminary +luminescence +luminescent +luminosity +luminous +luminously +lummox +lummoxes +lump +lumped +lumpier +lumpiest +lumpiness +lumping +lumpish +lumps +lumpy +lunacies +lunacy +lunar +lunatic +lunatics +lunch +lunched +luncheon +luncheonette +luncheonettes +luncheons +lunches +lunching +lunchroom +lunchrooms +lunchtime +lunchtimes +lung +lunge +lunged +lunges +lungfish +lungfishes +lunging +lungs +lunkhead +lunkheads +lupin +lupine +lupines +lupins +lupus +lurch +lurched +lurches +lurching +lure +lured +lures +lurid +luridly +luridness +luring +lurk +lurked +lurking +lurks +luscious +lusciously +lusciousness +lush +lusher +lushes +lushest +lushly +lushness +lust +lusted +luster +lusterless +lustful +lustfully +lustier +lustiest +lustily +lustiness +lusting +lustre +lustrous +lustrously +lusts +lusty +lutanist +lutanists +lute +lutenist +lutenists +lutes +lutetium +luxuriance +luxuriant +luxuriantly +luxuriate +luxuriated +luxuriates +luxuriating +luxuriation +luxuries +luxurious +luxuriously +luxuriousness +luxury +lyceum +lyceums +lychee +lychees +lying +lymph +lymphatic +lymphatics +lymphocyte +lymphocytes +lymphoid +lymphoma +lymphomas +lymphomata +lynch +lynched +lyncher +lynchers +lynches +lynching +lynchings +lynchpin +lynchpins +lynx +lynxes +lyre +lyrebird +lyrebirds +lyres +lyric +lyrical +lyrically +lyricism +lyricist +lyricists +lyrics +macabre +macadam +macadamia +macadamias +macadamize +macadamized +macadamizes +macadamizing +macaque +macaques +macaroni +macaronies +macaronis +macaroon +macaroons +macaw +macaws +mace +maced +macerate +macerated +macerates +macerating +maceration +maces +mach +machete +machetes +machinate +machinated +machinates +machinating +machination +machinations +machine +machined +machinery +machines +machining +machinist +machinists +machismo +macho +macing +macintosh +macintoshes +mackerel +mackerels +mackinaw +mackinaws +mackintosh +mackintoshes +macrame +macro +macrobiotic +macrobiotics +macrocosm +macrocosms +macroeconomics +macron +macrons +macros +macroscopic +macs +madam +madame +madams +madcap +madcaps +madden +maddened +maddening +maddeningly +maddens +madder +madders +maddest +madding +made +mademoiselle +mademoiselles +madhouse +madhouses +madly +madman +madmen +madness +madras +madrases +madrigal +madrigals +mads +madwoman +madwomen +maelstrom +maelstroms +maestri +maestro +maestros +mafia +mafias +mafiosi +mafioso +mafiosos +magazine +magazines +magenta +maggot +maggots +maggoty +magi +magic +magical +magically +magician +magicians +magisterial +magisterially +magistracy +magistrate +magistrates +magma +magnanimity +magnanimous +magnanimously +magnate +magnates +magnesia +magnesium +magnet +magnetic +magnetically +magnetise +magnetised +magnetises +magnetising +magnetism +magnetite +magnetizable +magnetization +magnetize +magnetized +magnetizes +magnetizing +magneto +magnetometer +magnetometers +magnetos +magnets +magnification +magnifications +magnificence +magnificent +magnificently +magnified +magnifier +magnifiers +magnifies +magnify +magnifying +magniloquence +magniloquent +magnitude +magnitudes +magnolia +magnolias +magnum +magnums +magpie +magpies +mags +magus +maharaja +maharajah +maharajahs +maharajas +maharanee +maharanees +maharani +maharanis +maharishi +maharishis +mahatma +mahatmas +mahjong +mahoganies +mahogany +mahout +mahouts +maid +maiden +maidenhair +maidenhead +maidenheads +maidenhood +maidenly +maidens +maids +maidservant +maidservants +mail +mailbag +mailbags +mailbox +mailboxes +mailed +mailer +mailers +mailing +mailings +maillot +maillots +mailman +mailmen +mails +maim +maimed +maiming +maims +main +mainframe +mainframes +mainland +mainlands +mainline +mainlined +mainlines +mainlining +mainly +mainmast +mainmasts +mains +mainsail +mainsails +mainspring +mainsprings +mainstay +mainstays +mainstream +mainstreamed +mainstreaming +mainstreams +maintain +maintainable +maintained +maintaining +maintains +maintenance +maintop +maintops +maiolica +maisonette +maisonettes +maize +majestic +majestically +majesties +majesty +majolica +major +majordomo +majordomos +majored +majorette +majorettes +majoring +majorities +majority +majors +make +makeover +makeovers +maker +makers +makes +makeshift +makeshifts +makeup +makeups +making +makings +malachite +maladies +maladjusted +maladjustment +maladroit +maladroitly +maladroitness +malady +malaise +malamute +malamutes +malapropism +malapropisms +malaria +malarial +malarkey +malathion +malcontent +malcontents +male +malediction +maledictions +malefaction +malefactor +malefactors +malefic +maleficence +maleficent +maleness +males +malevolence +malevolent +malevolently +malfeasance +malformation +malformations +malformed +malfunction +malfunctioned +malfunctioning +malfunctions +malice +malicious +maliciously +maliciousness +malign +malignancies +malignancy +malignant +malignantly +maligned +maligning +malignity +maligns +malinger +malingered +malingerer +malingerers +malingering +malingers +mall +mallard +mallards +malleability +malleable +mallet +mallets +mallow +mallows +malls +malnourished +malnutrition +malocclusion +malodorous +malpractice +malpractices +malt +malted +malteds +maltier +maltiest +malting +maltose +maltreat +maltreated +maltreating +maltreatment +maltreats +malts +malty +mama +mamas +mamba +mambas +mambo +mamboed +mamboing +mambos +mamma +mammal +mammalian +mammalians +mammals +mammary +mammas +mammies +mammogram +mammograms +mammography +mammon +mammoth +mammoths +mammy +manacle +manacled +manacles +manacling +manage +manageability +manageable +managed +management +manager +managerial +managers +manages +managing +manana +mananas +manatee +manatees +mandala +mandalas +mandamus +mandamuses +mandarin +mandarins +mandate +mandated +mandates +mandating +mandatory +mandible +mandibles +mandibular +mandolin +mandolins +mandrake +mandrakes +mandrel +mandrels +mandril +mandrill +mandrills +mandrils +mane +maned +manege +manes +maneuver +maneuverability +maneuverable +maneuvered +maneuvering +maneuvers +manful +manfully +manganese +mange +manger +mangers +mangier +mangiest +manginess +mangle +mangled +mangles +mangling +mango +mangoes +mangos +mangrove +mangroves +mangy +manhandle +manhandled +manhandles +manhandling +manhole +manholes +manhood +manhunt +manhunts +mania +maniac +maniacal +maniacally +maniacs +manias +manic +manically +manics +manicure +manicured +manicures +manicuring +manicurist +manicurists +manifest +manifestation +manifestations +manifested +manifesting +manifestly +manifesto +manifestoes +manifestos +manifests +manifold +manifolded +manifolding +manifolds +manikin +manikins +manila +manilla +manioc +maniocs +manipulable +manipulate +manipulated +manipulates +manipulating +manipulation +manipulations +manipulative +manipulatively +manipulator +manipulators +mankind +manlier +manliest +manlike +manliness +manly +manna +manned +mannequin +mannequins +manner +mannered +mannerism +mannerisms +mannerly +manners +mannikin +mannikins +manning +mannish +mannishly +mannishness +manoeuvre +manoeuvred +manoeuvres +manoeuvring +manometer +manometers +manor +manorial +manors +manpower +manque +mans +mansard +mansards +manse +manservant +manses +mansion +mansions +manslaughter +manta +mantas +mantel +mantelpiece +mantelpieces +mantels +mantes +mantilla +mantillas +mantis +mantises +mantissa +mantissas +mantle +mantled +mantles +mantling +mantra +mantras +manual +manually +manuals +manufacture +manufactured +manufacturer +manufacturers +manufactures +manufacturing +manumission +manumissions +manumit +manumits +manumitted +manumitting +manure +manured +manures +manuring +manuscript +manuscripts +many +maple +maples +mapmaker +mapmakers +mapped +mapper +mappers +mapping +maps +marabou +marabous +marabout +marabouts +maraca +maracas +maraschino +maraschinos +marathon +marathoner +marathoners +marathons +maraud +marauded +marauder +marauders +marauding +marauds +marble +marbled +marbleize +marbleized +marbleizes +marbleizing +marbles +marbling +march +marched +marcher +marchers +marches +marching +marchioness +marchionesses +mare +mares +margarine +margarita +margaritas +margin +marginal +marginalia +marginalization +marginalize +marginalized +marginalizes +marginalizing +marginally +margins +maria +mariachi +mariachis +marigold +marigolds +marihuana +marijuana +marimba +marimbas +marina +marinade +marinaded +marinades +marinading +marinara +marinas +marinate +marinated +marinates +marinating +marination +marine +mariner +mariners +marines +marionette +marionettes +marital +maritally +maritime +marjoram +mark +markdown +markdowns +marked +markedly +marker +markers +market +marketability +marketable +marketed +marketeer +marketeers +marketer +marketers +marketing +marketplace +marketplaces +markets +marking +markings +markka +markkaa +markkas +marks +marksman +marksmanship +marksmen +markup +markups +marl +marlin +marlinespike +marlinespikes +marlins +marlinspike +marlinspikes +marmalade +marmoreal +marmoset +marmosets +marmot +marmots +maroon +marooned +marooning +maroons +marque +marquee +marquees +marques +marquess +marquesses +marquetry +marquis +marquise +marquises +marquisette +marred +marriage +marriageability +marriageable +marriages +married +marrieds +marries +marring +marrow +marrows +marry +marrying +mars +marsh +marshal +marshaled +marshaling +marshalled +marshalling +marshals +marshes +marshier +marshiest +marshland +marshmallow +marshmallows +marshy +marsupial +marsupials +mart +marten +martens +martial +martially +martin +martinet +martinets +martingale +martingales +martini +martinis +martins +marts +martyr +martyrdom +martyred +martyring +martyrs +marvel +marveled +marveling +marvelled +marvelling +marvellous +marvellously +marvelous +marvelously +marvels +marzipan +mascara +mascaraed +mascaraing +mascaras +mascot +mascots +masculine +masculines +masculinity +maser +masers +mash +mashed +masher +mashers +mashes +mashing +mask +masked +masker +maskers +masking +masks +masochism +masochist +masochistic +masochistically +masochists +mason +masonry +masons +masque +masquerade +masqueraded +masquerader +masqueraders +masquerades +masquerading +masques +mass +massacre +massacred +massacres +massacring +massage +massaged +massages +massaging +massed +masses +masseur +masseurs +masseuse +masseuses +massif +massifs +massing +massive +massively +massiveness +mast +mastectomies +mastectomy +masted +master +mastered +masterful +masterfully +mastering +masterly +mastermind +masterminded +masterminding +masterminds +masterpiece +masterpieces +masters +masterstroke +masterstrokes +masterwork +masterworks +mastery +masthead +mastheads +mastic +masticate +masticated +masticates +masticating +mastication +mastiff +mastiffs +mastodon +mastodons +mastoid +mastoids +masts +masturbate +masturbated +masturbates +masturbating +masturbation +masturbatory +matador +matadors +match +matchbook +matchbooks +matchbox +matchboxes +matched +matches +matching +matchless +matchlock +matchlocks +matchmaker +matchmakers +matchmaking +matchstick +matchsticks +matchwood +mate +mated +material +materialise +materialised +materialises +materialising +materialism +materialist +materialistic +materialistically +materialists +materialization +materialize +materialized +materializes +materializing +materially +materials +materiel +maternal +maternally +maternity +mates +math +mathematical +mathematically +mathematician +mathematicians +mathematics +matinee +matinees +mating +matins +matriarch +matriarchal +matriarchies +matriarchs +matriarchy +matrices +matricidal +matricide +matricides +matriculate +matriculated +matriculates +matriculating +matriculation +matrimonial +matrimony +matrix +matrixes +matron +matronly +matrons +mats +matt +matte +matted +matter +mattered +mattering +matters +mattes +matting +mattins +mattock +mattocks +mattress +mattresses +matts +maturate +maturated +maturates +maturating +maturation +mature +matured +maturely +maturer +matures +maturest +maturing +maturities +maturity +matzo +matzoh +matzohs +matzos +matzot +matzoth +maudlin +maul +mauled +mauler +maulers +mauling +mauls +maunder +maundered +maundering +maunders +mausolea +mausoleum +mausoleums +mauve +mauver +mauvest +maven +mavens +maverick +mavericks +mavin +mavins +mawkish +mawkishly +mawkishness +maws +maxed +maxes +maxi +maxilla +maxillae +maxillary +maxillas +maxim +maxima +maximal +maximally +maximization +maximize +maximized +maximizes +maximizing +maxims +maximum +maximums +maxing +maxis +maybe +maybes +mayday +maydays +mayflies +mayflower +mayflowers +mayfly +mayhem +mayo +mayonnaise +mayor +mayoral +mayoralty +mayoress +mayoresses +mayors +maypole +maypoles +mayst +maze +mazes +mazourka +mazourkas +mazurka +mazurkas +mead +meadow +meadowlark +meadowlarks +meadows +meager +meagerer +meagerest +meagerly +meagerness +meagre +meagrer +meagrest +meal +mealier +mealiest +mealiness +meals +mealtime +mealtimes +mealy +mealybug +mealybugs +mealymouthed +mean +meander +meandered +meandering +meanderings +meanders +meaner +meanest +meanie +meanies +meaning +meaningful +meaningfully +meaningfulness +meaningless +meaninglessly +meaninglessness +meanings +meanly +meanness +means +meant +meantime +meanwhile +meany +measles +measlier +measliest +measly +measurable +measurably +measure +measured +measureless +measurement +measurements +measures +measuring +meat +meatball +meatballs +meatier +meatiest +meatiness +meatless +meatloaf +meatloaves +meatpacking +meats +meaty +mecca +meccas +mechanic +mechanical +mechanically +mechanics +mechanism +mechanisms +mechanistic +mechanistically +mechanization +mechanize +mechanized +mechanizes +mechanizing +medal +medalist +medalists +medallion +medallions +medallist +medallists +medals +meddle +meddled +meddler +meddlers +meddles +meddlesome +meddling +media +mediaeval +medial +medially +median +medians +medias +mediate +mediated +mediates +mediating +mediation +mediator +mediators +medic +medicaid +medical +medically +medicals +medicament +medicare +medicate +medicated +medicates +medicating +medication +medications +medicinal +medicinally +medicine +medicines +medico +medicos +medics +medieval +medievalist +medievalists +mediocre +mediocrities +mediocrity +meditate +meditated +meditates +meditating +meditation +meditations +meditative +meditatively +medium +mediums +medley +medleys +meds +medulla +medullae +medullas +meed +meek +meeker +meekest +meekly +meekness +meerschaum +meerschaums +meet +meeting +meetinghouse +meetinghouses +meetings +meets +mega +megabit +megabits +megabucks +megabyte +megabytes +megacycle +megacycles +megadeath +megadeaths +megahertz +megahertzes +megalith +megalithic +megaliths +megalomania +megalomaniac +megalomaniacs +megalopolis +megalopolises +megaphone +megaphoned +megaphones +megaphoning +megaton +megatons +megawatt +megawatts +meiosis +meiotic +melamine +melancholia +melancholic +melancholy +melange +melanges +melanin +melanoma +melanomas +melanomata +meld +melded +melding +melds +melee +melees +meliorate +meliorated +meliorates +meliorating +melioration +meliorative +mellifluous +mellifluously +mellifluousness +mellow +mellowed +mellower +mellowest +mellowing +mellowly +mellowness +mellows +melodic +melodically +melodies +melodious +melodiously +melodiousness +melodrama +melodramas +melodramatic +melodramatically +melodramatics +melody +melon +melons +melt +meltdown +meltdowns +melted +melting +melts +member +members +membership +memberships +membrane +membranes +membranous +memento +mementoes +mementos +memo +memoir +memoirs +memorabilia +memorability +memorable +memorably +memoranda +memorandum +memorandums +memorial +memorialize +memorialized +memorializes +memorializing +memorials +memories +memorization +memorize +memorized +memorizes +memorizing +memory +memos +menace +menaced +menaces +menacing +menacingly +menage +menagerie +menageries +menages +mend +mendacious +mendaciously +mendacity +mended +mendelevium +mender +menders +mendicancy +mendicant +mendicants +mending +mends +menfolk +menfolks +menhaden +menhadens +menial +menially +menials +meningeal +meninges +meningitis +meninx +menisci +meniscus +meniscuses +menopausal +menopause +menorah +menorahs +mensch +mensches +menservants +menses +menstrual +menstruate +menstruated +menstruates +menstruating +menstruation +mensurable +mensuration +menswear +mental +mentalist +mentalists +mentalities +mentality +mentally +menthol +mentholated +mention +mentioned +mentioning +mentions +mentor +mentored +mentoring +mentors +menu +menus +meow +meowed +meowing +meows +mercantile +mercantilism +mercenaries +mercenary +mercer +mercerize +mercerized +mercerizes +mercerizing +mercers +merchandise +merchandised +merchandiser +merchandisers +merchandises +merchandising +merchandize +merchandized +merchandizes +merchandizing +merchant +merchantable +merchantman +merchantmen +merchants +mercies +merciful +mercifully +merciless +mercilessly +mercilessness +mercurial +mercurially +mercuric +mercury +mercy +mere +merely +meres +merest +meretricious +meretriciously +meretriciousness +merganser +mergansers +merge +merged +merger +mergers +merges +merging +meridian +meridians +meringue +meringues +merino +merinos +merit +merited +meriting +meritocracies +meritocracy +meritorious +meritoriously +meritoriousness +merits +mermaid +mermaids +merman +mermen +merrier +merriest +merrily +merriment +merriness +merry +merrymaker +merrymakers +merrymaking +mesa +mesas +mescal +mescaline +mescals +mesdames +mesdemoiselles +mesh +meshed +meshes +meshing +mesmerism +mesmerize +mesmerized +mesmerizer +mesmerizers +mesmerizes +mesmerizing +mesomorph +mesomorphs +meson +mesons +mesosphere +mesospheres +mesquit +mesquite +mesquites +mesquits +mess +message +messaged +messages +messaging +messed +messeigneurs +messenger +messengers +messes +messiah +messiahs +messianic +messier +messiest +messieurs +messily +messiness +messing +messmate +messmates +messy +mestizo +mestizoes +mestizos +metabolic +metabolically +metabolism +metabolisms +metabolite +metabolites +metabolize +metabolized +metabolizes +metabolizing +metacarpal +metacarpals +metacarpi +metacarpus +metal +metalanguage +metalanguages +metallic +metallurgic +metallurgical +metallurgist +metallurgists +metallurgy +metals +metalwork +metalworker +metalworkers +metalworking +metamorphic +metamorphism +metamorphose +metamorphosed +metamorphoses +metamorphosing +metamorphosis +metaphor +metaphoric +metaphorical +metaphorically +metaphors +metaphysical +metaphysically +metaphysics +metastases +metastasis +metastasize +metastasized +metastasizes +metastasizing +metastatic +metatarsal +metatarsals +metatarsi +metatarsus +metatheses +metathesis +mete +meted +metempsychosis +meteor +meteoric +meteorically +meteorite +meteorites +meteoroid +meteoroids +meteorologic +meteorological +meteorologist +meteorologists +meteorology +meteors +meter +metered +metering +meters +metes +methadon +methadone +methamphetamine +methane +methanol +methinks +method +methodical +methodically +methodicalness +methodological +methodologically +methodologies +methodology +methods +methought +methyl +meticulous +meticulously +meticulousness +metier +metiers +meting +metre +metres +metric +metrical +metrically +metricate +metricated +metricates +metricating +metrication +metricize +metricized +metricizes +metricizing +metro +metronome +metronomes +metropolis +metropolises +metropolitan +metros +mettle +mettlesome +mewed +mewing +mewl +mewled +mewling +mewls +mews +mezzanine +mezzanines +mezzo +mezzos +miasma +miasmas +miasmata +mica +mice +mickey +mickeys +micra +micro +microbe +microbes +microbial +microbiological +microbiologist +microbiologists +microbiology +microbreweries +microbrewery +microchip +microchips +microcircuit +microcircuits +microcomputer +microcomputers +microcosm +microcosmic +microcosms +microdot +microdots +microeconomics +microelectronic +microelectronics +microfiber +microfibers +microfiche +microfiches +microfilm +microfilmed +microfilming +microfilms +microgroove +microgrooves +microlight +microlights +micromanage +micromanaged +micromanagement +micromanages +micromanaging +micrometeorite +micrometeorites +micrometer +micrometers +micron +microns +microorganism +microorganisms +microphone +microphones +microprocessor +microprocessors +micros +microscope +microscopes +microscopic +microscopical +microscopically +microscopy +microsecond +microseconds +microsurgery +microwavable +microwave +microwaveable +microwaved +microwaves +microwaving +midair +midday +midden +middens +middies +middle +middlebrow +middlebrows +middleman +middlemen +middlemost +middles +middleweight +middleweights +middling +middy +midge +midges +midget +midgets +midi +midis +midland +midlands +midlife +midmost +midnight +midpoint +midpoints +midrib +midribs +midriff +midriffs +midsection +midsections +midshipman +midshipmen +midships +midsize +midst +midstream +midsummer +midterm +midterms +midtown +midway +midways +midweek +midweeks +midwife +midwifed +midwiferies +midwifery +midwifes +midwifing +midwinter +midwived +midwives +midwiving +midyear +midyears +mien +miens +miff +miffed +miffing +miffs +might +mightier +mightiest +mightily +mightiness +mighty +mignonette +mignonettes +migraine +migraines +migrant +migrants +migrate +migrated +migrates +migrating +migration +migrations +migratory +mikado +mikados +mike +miked +mikes +miking +miladies +milady +milch +mild +milder +mildest +mildew +mildewed +mildewing +mildews +mildly +mildness +mile +mileage +mileages +milepost +mileposts +miler +milers +miles +milestone +milestones +milieu +milieus +milieux +militancy +militant +militantly +militants +militaries +militarily +militarism +militarist +militaristic +militarists +militarization +militarize +militarized +militarizes +militarizing +military +militate +militated +militates +militating +militia +militiaman +militiamen +militias +milk +milked +milker +milkers +milkier +milkiest +milkiness +milking +milkmaid +milkmaids +milkman +milkmen +milks +milkshake +milkshakes +milksop +milksops +milkweed +milkweeds +milky +mill +millage +milled +millennia +millennial +millennium +millenniums +millepede +millepedes +miller +millers +millet +milliard +milliards +millibar +millibars +milligram +milligrams +milliliter +milliliters +millilitre +millilitres +millimeter +millimeters +millimetre +millimetres +milliner +milliners +millinery +milling +millings +million +millionaire +millionaires +millionnaire +millionnaires +millions +millionth +millionths +millipede +millipedes +millisecond +milliseconds +millpond +millponds +millrace +millraces +mills +millstone +millstones +millstream +millstreams +millwright +millwrights +milquetoast +milquetoasts +mils +milt +milted +milting +milts +mime +mimed +mimeograph +mimeographed +mimeographing +mimeographs +mimes +mimetic +mimic +mimicked +mimicker +mimickers +mimicking +mimicries +mimicry +mimics +miming +mimosa +mimosas +minaret +minarets +minatory +mince +minced +mincemeat +mincer +mincers +minces +mincing +mind +minded +mindful +mindfully +mindfulness +minding +mindless +mindlessly +mindlessness +minds +mindset +mindsets +mine +mined +minefield +minefields +miner +mineral +mineralogical +mineralogist +mineralogists +mineralogy +minerals +miners +mines +minestrone +minesweeper +minesweepers +mingle +mingled +mingles +mingling +mini +miniature +miniatures +miniaturist +miniaturists +miniaturization +miniaturize +miniaturized +miniaturizes +miniaturizing +minibike +minibikes +minibus +minibuses +minibusses +minicam +minicams +minicomputer +minicomputers +minim +minima +minimal +minimalism +minimalist +minimalists +minimally +minimization +minimize +minimized +minimizes +minimizing +minims +minimum +minimums +mining +minion +minions +minis +miniscule +miniscules +miniseries +miniskirt +miniskirts +minister +ministered +ministerial +ministering +ministers +ministrant +ministrants +ministration +ministrations +ministries +ministry +minivan +minivans +mink +minks +minnesinger +minnesingers +minnow +minnows +minor +minored +minoring +minorities +minority +minors +minoxidil +minster +minsters +minstrel +minstrels +minstrelsy +mint +mintage +minted +minter +minters +mintier +mintiest +minting +mints +minty +minuend +minuends +minuet +minuets +minus +minuscule +minuscules +minuses +minute +minuted +minutely +minuteman +minutemen +minuteness +minuter +minutes +minutest +minutia +minutiae +minuting +minx +minxes +miracle +miracles +miraculous +miraculously +mirage +mirages +mire +mired +mires +mirier +miriest +miring +mirror +mirrored +mirroring +mirrors +mirth +mirthful +mirthfully +mirthfulness +mirthless +mirthlessly +miry +misaddress +misaddressed +misaddresses +misaddressing +misadventure +misadventures +misaligned +misalignment +misalliance +misalliances +misanthrope +misanthropes +misanthropic +misanthropically +misanthropist +misanthropists +misanthropy +misapplication +misapplied +misapplies +misapply +misapplying +misapprehend +misapprehended +misapprehending +misapprehends +misapprehension +misapprehensions +misappropriate +misappropriated +misappropriates +misappropriating +misappropriation +misappropriations +misbegotten +misbehave +misbehaved +misbehaves +misbehaving +misbehavior +miscalculate +miscalculated +miscalculates +miscalculating +miscalculation +miscalculations +miscall +miscalled +miscalling +miscalls +miscarriage +miscarriages +miscarried +miscarries +miscarry +miscarrying +miscast +miscasting +miscasts +miscegenation +miscellaneous +miscellaneously +miscellanies +miscellany +mischance +mischances +mischief +mischievous +mischievously +mischievousness +miscibility +miscible +misconceive +misconceived +misconceives +misconceiving +misconception +misconceptions +misconduct +misconducted +misconducting +misconducts +misconstruction +misconstructions +misconstrue +misconstrued +misconstrues +misconstruing +miscount +miscounted +miscounting +miscounts +miscreant +miscreants +miscue +miscued +miscues +miscuing +misdeal +misdealing +misdeals +misdealt +misdeed +misdeeds +misdemeanor +misdemeanors +misdemeanour +misdemeanours +misdiagnose +misdiagnosed +misdiagnoses +misdiagnosing +misdiagnosis +misdid +misdirect +misdirected +misdirecting +misdirection +misdirects +misdo +misdoes +misdoing +misdoings +misdone +miser +miserable +miserableness +miserably +miseries +miserliness +miserly +misers +misery +misfeasance +misfile +misfiled +misfiles +misfiling +misfire +misfired +misfires +misfiring +misfit +misfits +misfitted +misfitting +misfortune +misfortunes +misgiving +misgivings +misgovern +misgoverned +misgoverning +misgovernment +misgoverns +misguidance +misguide +misguided +misguidedly +misguides +misguiding +mishandle +mishandled +mishandles +mishandling +mishap +mishaps +mishear +misheard +mishearing +mishears +mishmash +mishmashes +misidentified +misidentifies +misidentify +misidentifying +misinform +misinformation +misinformed +misinforming +misinforms +misinterpret +misinterpretation +misinterpretations +misinterpreted +misinterpreting +misinterprets +misjudge +misjudged +misjudges +misjudging +misjudgment +misjudgments +mislabel +mislabeled +mislabeling +mislabelled +mislabelling +mislabels +mislaid +mislay +mislaying +mislays +mislead +misleading +misleadingly +misleads +misled +mismanage +mismanaged +mismanagement +mismanages +mismanaging +mismatch +mismatched +mismatches +mismatching +misname +misnamed +misnames +misnaming +misnomer +misnomers +misogamist +misogamists +misogamy +misogynist +misogynistic +misogynists +misogynous +misogyny +misplace +misplaced +misplacement +misplaces +misplacing +misplay +misplayed +misplaying +misplays +misprint +misprinted +misprinting +misprints +misprision +mispronounce +mispronounced +mispronounces +mispronouncing +mispronunciation +mispronunciations +misquotation +misquotations +misquote +misquoted +misquotes +misquoting +misread +misreading +misreadings +misreads +misreport +misreported +misreporting +misreports +misrepresent +misrepresentation +misrepresentations +misrepresented +misrepresenting +misrepresents +misrule +misruled +misrules +misruling +miss +missal +missals +missed +misses +misshape +misshaped +misshapen +misshapes +misshaping +missile +missilery +missiles +missilry +missing +mission +missionaries +missionary +missioner +missioners +missions +missis +missises +missive +missives +misspeak +misspeaking +misspeaks +misspell +misspelled +misspelling +misspellings +misspells +misspelt +misspend +misspending +misspends +misspent +misspoke +misspoken +misstate +misstated +misstatement +misstatements +misstates +misstating +misstep +missteps +missus +missuses +mist +mistakable +mistake +mistaken +mistakenly +mistakes +mistaking +misted +mister +misters +mistier +mistiest +mistily +mistime +mistimed +mistimes +mistiming +mistiness +misting +mistletoe +mistook +mistral +mistrals +mistreat +mistreated +mistreating +mistreatment +mistreats +mistress +mistresses +mistrial +mistrials +mistrust +mistrusted +mistrustful +mistrustfully +mistrusting +mistrusts +mists +misty +misunderstand +misunderstanding +misunderstandings +misunderstands +misunderstood +misuse +misused +misuses +misusing +mite +miter +mitered +mitering +miters +mites +mitigate +mitigated +mitigates +mitigating +mitigation +mitosis +mitotic +mitre +mitred +mitres +mitring +mitt +mitten +mittens +mitts +mixable +mixed +mixer +mixers +mixes +mixing +mixt +mixture +mixtures +mizzen +mizzenmast +mizzenmasts +mizzens +mnemonic +mnemonically +mnemonics +moan +moaned +moaner +moaners +moaning +moans +moat +moats +mobbed +mobbing +mobile +mobiles +mobility +mobilization +mobilizations +mobilize +mobilized +mobilizer +mobilizers +mobilizes +mobilizing +mobs +mobster +mobsters +moccasin +moccasins +mocha +mochas +mock +mocked +mocker +mockeries +mockers +mockery +mocking +mockingbird +mockingbirds +mockingly +mocks +mockup +mockups +modal +modals +mode +model +modeled +modeler +modelers +modeling +modelled +modelling +models +modem +modems +moderate +moderated +moderately +moderateness +moderates +moderating +moderation +moderator +moderators +modern +modernism +modernist +modernistic +modernists +modernity +modernization +modernize +modernized +modernizer +modernizers +modernizes +modernizing +modernly +modernness +moderns +modes +modest +modestly +modesty +modicum +modicums +modification +modifications +modified +modifier +modifiers +modifies +modify +modifying +modish +modishly +modishness +mods +modular +modulate +modulated +modulates +modulating +modulation +modulations +modulator +modulators +module +modules +mogul +moguls +mohair +moieties +moiety +moil +moiled +moiling +moils +moire +moires +moist +moisten +moistened +moistener +moisteners +moistening +moistens +moister +moistest +moistly +moistness +moisture +moisturize +moisturized +moisturizer +moisturizers +moisturizes +moisturizing +molar +molars +molasses +mold +moldboard +moldboards +molded +molder +moldered +moldering +molders +moldier +moldiest +moldiness +molding +moldings +molds +moldy +mole +molecular +molecularity +molecule +molecules +molehill +molehills +moles +moleskin +molest +molestation +molested +molester +molesters +molesting +molests +moll +mollies +mollification +mollified +mollifies +mollify +mollifying +molls +mollusc +molluscan +molluscans +molluscs +mollusk +molluskan +molluskans +mollusks +molly +mollycoddle +mollycoddled +mollycoddles +mollycoddling +molt +molted +molten +molter +molters +molting +molts +molybdenum +moment +momentarily +momentariness +momentary +momentous +momentously +momentousness +moments +momentum +momma +mommas +mommie +mommies +mommy +moms +monarch +monarchic +monarchical +monarchies +monarchism +monarchist +monarchistic +monarchists +monarchs +monarchy +monasteries +monastery +monastic +monastical +monastically +monasticism +monastics +monaural +monetarily +monetarism +monetarist +monetarists +monetary +monetize +monetized +monetizes +monetizing +money +moneybag +moneybags +moneyed +moneygrubber +moneygrubbers +moneygrubbing +moneylender +moneylenders +moneymaker +moneymakers +moneymaking +mongeese +monger +mongered +mongering +mongers +mongolism +mongoloid +mongoloids +mongoose +mongooses +mongrel +mongrels +monicker +monickers +monied +moniker +monikers +monism +monist +monists +monition +monitions +monitor +monitored +monitoring +monitors +monitory +monk +monkey +monkeyed +monkeying +monkeys +monkeyshine +monkeyshines +monkish +monks +monkshood +monkshoods +mono +monochromatic +monochrome +monochromes +monocle +monocled +monocles +monoclonal +monocotyledon +monocotyledonous +monocotyledons +monocular +monodic +monodies +monodist +monodists +monody +monogamist +monogamists +monogamous +monogamously +monogamy +monogram +monogrammed +monogramming +monograms +monograph +monographs +monolingual +monolinguals +monolith +monolithic +monoliths +monolog +monologist +monologists +monologs +monologue +monologues +monologuist +monologuists +monomania +monomaniac +monomaniacal +monomaniacs +monomer +monomers +mononucleosis +monophonic +monoplane +monoplanes +monopolies +monopolist +monopolistic +monopolists +monopolization +monopolize +monopolized +monopolizer +monopolizers +monopolizes +monopolizing +monopoly +monorail +monorails +monosyllabic +monosyllable +monosyllables +monotheism +monotheist +monotheistic +monotheists +monotone +monotones +monotonous +monotonously +monotonousness +monotony +monounsaturated +monoxide +monoxides +monseigneur +monsieur +monsignor +monsignori +monsignors +monsoon +monsoonal +monsoons +monster +monsters +monstrance +monstrances +monstrosities +monstrosity +monstrous +monstrously +montage +montages +month +monthlies +monthly +months +monument +monumental +monumentally +monuments +mooch +mooched +moocher +moochers +mooches +mooching +mood +moodier +moodiest +moodily +moodiness +moods +moody +mooed +mooing +moon +moonbeam +moonbeams +mooned +mooning +moonless +moonlight +moonlighted +moonlighter +moonlighters +moonlighting +moonlights +moonlit +moons +moonscape +moonscapes +moonshine +moonshiner +moonshiners +moonshot +moonshots +moonstone +moonstones +moonstruck +moonwalk +moonwalks +moor +moored +mooring +moorings +moorland +moors +moos +moose +moot +mooted +mooting +moots +mope +moped +mopeds +moper +mopers +mopes +mopey +mopier +mopiest +moping +mopish +mopped +moppet +moppets +mopping +mops +mopy +moraine +moraines +moral +morale +moralist +moralistic +moralistically +moralists +moralities +morality +moralization +moralize +moralized +moralizer +moralizers +moralizes +moralizing +morally +morals +morass +morasses +moratoria +moratorium +moratoriums +moray +morays +morbid +morbidity +morbidly +morbidness +mordancy +mordant +mordantly +mordants +more +morel +morels +moreover +mores +morgue +morgues +moribund +morn +morning +mornings +morns +morocco +moron +moronic +moronically +morons +morose +morosely +moroseness +morph +morphed +morpheme +morphemes +morphemic +morphia +morphine +morphing +morphological +morphology +morphs +morrow +morrows +morsel +morsels +mortal +mortality +mortally +mortals +mortar +mortarboard +mortarboards +mortared +mortaring +mortars +mortgage +mortgaged +mortgagee +mortgagees +mortgager +mortgagers +mortgages +mortgaging +mortgagor +mortgagors +mortice +morticed +mortices +mortician +morticians +morticing +mortification +mortified +mortifies +mortify +mortifying +mortise +mortised +mortises +mortising +mortuaries +mortuary +mosaic +mosaics +mosey +moseyed +moseying +moseys +mosh +moshed +moshes +moshing +mosque +mosques +mosquito +mosquitoes +mosquitos +moss +mossback +mossbacks +mosses +mossier +mossiest +mossy +most +mostly +mote +motel +motels +motes +motet +motets +moth +mothball +mothballed +mothballing +mothballs +mother +motherboard +motherboards +mothered +motherfucker +motherfuckers +motherfucking +motherhood +mothering +motherland +motherlands +motherless +motherliness +motherly +mothers +moths +motif +motifs +motile +motility +motion +motioned +motioning +motionless +motionlessly +motionlessness +motions +motivate +motivated +motivates +motivating +motivation +motivational +motivations +motivator +motivators +motive +motiveless +motives +motley +motlier +motliest +motocross +motocrosses +motor +motorbike +motorbiked +motorbikes +motorbiking +motorboat +motorboated +motorboating +motorboats +motorcade +motorcades +motorcar +motorcars +motorcycle +motorcycled +motorcycles +motorcycling +motorcyclist +motorcyclists +motored +motoring +motorist +motorists +motorization +motorize +motorized +motorizes +motorizing +motorman +motormen +motormouth +motormouths +motors +mots +mottle +mottled +mottles +mottling +motto +mottoes +mottos +moue +moues +mould +moulded +moulder +mouldered +mouldering +moulders +mouldier +mouldiest +moulding +mouldings +moulds +mouldy +moult +moulted +moulting +moults +mound +mounded +mounding +mounds +mount +mountable +mountain +mountaineer +mountaineered +mountaineering +mountaineers +mountainous +mountains +mountainside +mountainsides +mountaintop +mountaintops +mountebank +mountebanks +mounted +mounter +mounters +mounting +mountings +mounts +mourn +mourned +mourner +mourners +mournful +mournfully +mournfulness +mourning +mourns +mouse +moused +mouser +mousers +mouses +mousetrap +mousetrapped +mousetrapping +mousetraps +mousey +mousier +mousiest +mousiness +mousing +mousse +moussed +mousses +moussing +moustache +moustaches +mousy +mouth +mouthed +mouthful +mouthfuls +mouthier +mouthiest +mouthiness +mouthing +mouthpiece +mouthpieces +mouths +mouthwash +mouthwashes +mouthwatering +mouthy +mouton +movable +movables +move +moveable +moveables +moved +movement +movements +mover +movers +moves +movie +moviegoer +moviegoers +movies +moving +movingly +mowed +mower +mowers +mowing +mown +mows +moxie +mozzarella +much +mucilage +mucilaginous +muck +mucked +muckier +muckiest +mucking +muckrake +muckraked +muckraker +muckrakers +muckrakes +muckraking +mucks +mucky +mucous +mucus +muddied +muddier +muddies +muddiest +muddily +muddiness +muddle +muddled +muddleheaded +muddles +muddling +muddy +muddying +mudflat +mudflats +mudguard +mudguards +mudroom +mudrooms +mudslide +mudslides +mudslinger +mudslingers +mudslinging +muenster +muezzin +muezzins +muff +muffed +muffin +muffing +muffins +muffle +muffled +muffler +mufflers +muffles +muffling +muffs +mufti +muftis +mugful +mugfuls +mugged +mugger +muggers +muggier +muggiest +mugginess +mugging +muggings +muggy +mugs +mugshot +mugshots +mugwump +mugwumps +mujahedin +mukluk +mukluks +mulatto +mulattoes +mulattos +mulberries +mulberry +mulch +mulched +mulches +mulching +mulct +mulcted +mulcting +mulcts +mule +mules +muleskinner +muleskinners +muleteer +muleteers +mulish +mulishly +mulishness +mull +mullah +mullahs +mulled +mullein +mullet +mullets +mulligan +mulligans +mulligatawny +mulling +mullion +mullioned +mullions +mulls +multicolored +multicultural +multiculturalism +multidimensional +multidisciplinary +multifaceted +multifamily +multifarious +multifariously +multifariousness +multiform +multilateral +multilaterally +multilevel +multilingual +multilingualism +multimedia +multimillionaire +multimillionaires +multinational +multinationals +multiple +multiples +multiplex +multiplexed +multiplexer +multiplexers +multiplexes +multiplexing +multiplexor +multiplexors +multiplicand +multiplicands +multiplication +multiplications +multiplicities +multiplicity +multiplied +multiplier +multipliers +multiplies +multiply +multiplying +multiprocessor +multiprocessors +multipurpose +multiracial +multistage +multistory +multitasking +multitude +multitudes +multitudinous +multivitamin +multivitamins +mumble +mumbled +mumbler +mumblers +mumbles +mumbletypeg +mumbling +mummer +mummers +mummery +mummies +mummification +mummified +mummifies +mummify +mummifying +mummy +mumps +mums +munch +munched +munches +munchies +munching +munchkin +munchkins +mundane +mundanely +municipal +municipalities +municipality +municipally +municipals +munificence +munificent +munificently +munition +munitioned +munitioning +munitions +mural +muralist +muralists +murals +murder +murdered +murderer +murderers +murderess +murderesses +murdering +murderous +murderously +murders +murk +murkier +murkiest +murkily +murkiness +murky +murmur +murmured +murmurer +murmurers +murmuring +murmurings +murmurous +murmurs +murrain +muscat +muscatel +muscatels +muscats +muscle +musclebound +muscled +muscles +muscling +muscular +muscularity +muscularly +musculature +muse +mused +muses +musette +musettes +museum +museums +mush +mushed +mushes +mushier +mushiest +mushiness +mushing +mushroom +mushroomed +mushrooming +mushrooms +mushy +music +musical +musicale +musicales +musicality +musically +musicals +musician +musicianly +musicians +musicianship +musicological +musicologist +musicologists +musicology +musing +musingly +musings +musk +muskeg +muskegs +muskellunge +muskellunges +musket +musketeer +musketeers +musketry +muskets +muskie +muskier +muskies +muskiest +muskiness +muskmelon +muskmelons +muskox +muskoxen +muskrat +muskrats +musky +muslin +muss +mussed +mussel +mussels +musses +mussier +mussiest +mussing +mussy +must +mustache +mustached +mustaches +mustachio +mustachios +mustang +mustangs +mustard +muster +mustered +mustering +musters +mustier +mustiest +mustily +mustiness +musts +musty +mutability +mutable +mutably +mutagen +mutagens +mutant +mutants +mutate +mutated +mutates +mutating +mutation +mutational +mutations +mutative +mute +muted +mutely +muteness +muter +mutes +mutest +mutilate +mutilated +mutilates +mutilating +mutilation +mutilations +mutilator +mutilators +mutineer +mutineers +muting +mutinied +mutinies +mutinous +mutinously +mutiny +mutinying +mutt +mutter +muttered +mutterer +mutterers +muttering +mutterings +mutters +mutton +muttonchops +muttony +mutts +mutual +mutuality +mutually +muumuu +muumuus +muzzle +muzzled +muzzles +muzzling +mycologist +mycologists +mycology +myelitis +myna +mynah +mynahs +mynas +myopia +myopic +myopically +myriad +myriads +myrmidon +myrmidons +myrrh +myrtle +myrtles +myself +mysteries +mysterious +mysteriously +mysteriousness +mystery +mystic +mystical +mystically +mysticism +mystics +mystification +mystified +mystifies +mystify +mystifying +mystique +myth +mythic +mythical +mythological +mythologies +mythologist +mythologists +mythologize +mythologized +mythologizes +mythologizing +mythology +myths +nabbed +nabbing +nabob +nabobs +nabs +nacelle +nacelles +nacho +nachos +nacre +nacreous +nadir +nadirs +nagged +nagger +naggers +nagging +nags +naiad +naiades +naiads +naif +naifs +nail +nailbrush +nailbrushes +nailed +nailing +nails +naive +naively +naiver +naivest +naivete +naivety +naked +nakedly +nakedness +name +nameable +named +namedrop +namedropped +namedropping +namedrops +nameless +namelessly +namely +nameplate +nameplates +names +namesake +namesakes +naming +nannies +nanny +nanosecond +nanoseconds +napalm +napalmed +napalming +napalms +nape +napes +naphtha +naphthalene +napkin +napkins +napless +napoleon +napoleons +napped +napper +nappers +nappier +nappies +nappiest +napping +nappy +naps +narc +narcissi +narcissism +narcissist +narcissistic +narcissists +narcissus +narcissuses +narcolepsy +narcosis +narcotic +narcotics +narcotization +narcotize +narcotized +narcotizes +narcotizing +narcs +nark +narks +narrate +narrated +narrates +narrating +narration +narrations +narrative +narratives +narrator +narrators +narrow +narrowed +narrower +narrowest +narrowing +narrowly +narrowness +narrows +narwhal +narwhals +nary +nasal +nasality +nasalization +nasalize +nasalized +nasalizes +nasalizing +nasally +nasals +nascence +nascent +nastier +nastiest +nastily +nastiness +nasturtium +nasturtiums +nasty +natal +natch +nation +national +nationalism +nationalist +nationalistic +nationalistically +nationalists +nationalities +nationality +nationalization +nationalizations +nationalize +nationalized +nationalizes +nationalizing +nationally +nationals +nationhood +nations +nationwide +native +natives +nativities +nativity +natter +nattered +nattering +natters +nattier +nattiest +nattily +nattiness +natty +natural +naturalism +naturalist +naturalistic +naturalists +naturalization +naturalize +naturalized +naturalizes +naturalizing +naturally +naturalness +naturals +nature +natures +naught +naughtier +naughtiest +naughtily +naughtiness +naughts +naughty +nausea +nauseate +nauseated +nauseates +nauseating +nauseatingly +nauseous +nauseously +nauseousness +nautical +nautically +nautili +nautilus +nautiluses +naval +nave +navel +navels +naves +navies +navigability +navigable +navigate +navigated +navigates +navigating +navigation +navigational +navigator +navigators +navy +nays +naysayer +naysayers +neanderthal +neanderthals +neap +neaps +near +nearby +neared +nearer +nearest +nearing +nearly +nearness +nears +nearsighted +nearsightedly +nearsightedness +neat +neaten +neatened +neatening +neatens +neater +neatest +neath +neatly +neatness +nebula +nebulae +nebular +nebulas +nebulous +nebulously +nebulousness +necessaries +necessarily +necessary +necessitate +necessitated +necessitates +necessitating +necessities +necessitous +necessity +neck +necked +neckerchief +neckerchiefs +neckerchieves +necking +necklace +necklaces +neckline +necklines +necks +necktie +neckties +necrology +necromancer +necromancers +necromancy +necropoleis +necropoles +necropoli +necropolis +necropolises +necrosis +necrotic +nectar +nectarine +nectarines +need +needed +needful +needfully +needier +neediest +neediness +needing +needle +needled +needlepoint +needles +needless +needlessly +needlessness +needlewoman +needlewomen +needlework +needling +needs +needy +nefarious +nefariously +nefariousness +negate +negated +negates +negating +negation +negations +negative +negatived +negatively +negativeness +negatives +negativing +negativism +negativity +neglect +neglected +neglectful +neglectfully +neglectfulness +neglecting +neglects +neglige +negligee +negligees +negligence +negligent +negligently +negliges +negligible +negligibly +negotiability +negotiable +negotiate +negotiated +negotiates +negotiating +negotiation +negotiations +negotiator +negotiators +negritude +neigh +neighbor +neighbored +neighborhood +neighborhoods +neighboring +neighborliness +neighborly +neighbors +neighbour +neighboured +neighbouring +neighbours +neighed +neighing +neighs +neither +nelson +nelsons +nematode +nematodes +nemeses +nemesis +neoclassic +neoclassical +neoclassicism +neocolonialism +neocolonialist +neocolonialists +neoconservative +neoconservatives +neodymium +neolithic +neologism +neologisms +neon +neonatal +neonate +neonates +neophyte +neophytes +neoplasm +neoplasms +neoplastic +neoprene +nepenthe +nephew +nephews +nephrite +nephritic +nephritis +nepotism +nepotist +nepotists +neptunium +nerd +nerdier +nerdiest +nerds +nerdy +nerve +nerved +nerveless +nervelessly +nervelessness +nerves +nervier +nerviest +nerviness +nerving +nervous +nervously +nervousness +nervy +nest +nested +nesting +nestle +nestled +nestles +nestling +nestlings +nests +nether +nethermost +netherworld +nets +nett +netted +netting +nettle +nettled +nettles +nettlesome +nettling +netts +network +networked +networking +networks +neural +neuralgia +neuralgic +neurally +neurasthenia +neurasthenic +neurasthenics +neuritic +neuritics +neuritis +neurological +neurologically +neurologist +neurologists +neurology +neuron +neuronal +neurons +neuroses +neurosis +neurosurgeon +neurosurgeons +neurosurgery +neurotic +neurotically +neurotics +neurotransmitter +neurotransmitters +neuter +neutered +neutering +neuters +neutral +neutralism +neutralist +neutralists +neutrality +neutralization +neutralize +neutralized +neutralizer +neutralizers +neutralizes +neutralizing +neutrally +neutrals +neutrino +neutrinos +neutron +neutrons +never +nevermore +nevertheless +nevi +nevus +newbie +newbies +newborn +newborns +newcomer +newcomers +newel +newels +newer +newest +newfangled +newly +newlywed +newlyweds +newness +news +newsboy +newsboys +newscast +newscaster +newscasters +newscasts +newsdealer +newsdealers +newsgirl +newsgirls +newsgroup +newsgroups +newsier +newsiest +newsletter +newsletters +newsman +newsmen +newspaper +newspaperman +newspapermen +newspapers +newspaperwoman +newspaperwomen +newsprint +newsreel +newsreels +newsroom +newsrooms +newsstand +newsstands +newsweeklies +newsweekly +newswoman +newswomen +newsworthiness +newsworthy +newsy +newt +newton +newtons +newts +next +nexus +nexuses +niacin +nibble +nibbled +nibbler +nibblers +nibbles +nibbling +nibs +nice +nicely +niceness +nicer +nicest +niceties +nicety +niche +niches +nick +nicked +nickel +nickelodeon +nickelodeons +nickels +nicker +nickered +nickering +nickers +nicking +nicknack +nicknacks +nickname +nicknamed +nicknames +nicknaming +nicks +nicotine +niece +nieces +niftier +niftiest +nifty +niggard +niggardliness +niggardly +niggards +nigger +niggers +niggle +niggled +niggler +nigglers +niggles +niggling +nigh +nigher +nighest +night +nightcap +nightcaps +nightclothes +nightclub +nightclubbed +nightclubbing +nightclubs +nightdress +nightdresses +nightfall +nightgown +nightgowns +nighthawk +nighthawks +nightie +nighties +nightingale +nightingales +nightlife +nightlong +nightly +nightmare +nightmares +nightmarish +nights +nightshade +nightshades +nightshirt +nightshirts +nightspot +nightspots +nightstand +nightstands +nightstick +nightsticks +nighttime +nightwear +nighty +nihilism +nihilist +nihilistic +nihilists +nimbi +nimble +nimbleness +nimbler +nimblest +nimbly +nimbus +nimbuses +nimrod +nimrods +nincompoop +nincompoops +nine +ninepin +ninepins +nines +nineteen +nineteens +nineteenth +nineteenths +nineties +ninetieth +ninetieths +ninety +ninja +ninjas +ninnies +ninny +ninth +ninths +niobium +nipped +nipper +nippers +nippier +nippiest +nippiness +nipping +nipple +nipples +nippy +nips +nirvana +nisei +niseis +nite +niter +nites +nitpick +nitpicked +nitpicker +nitpickers +nitpicking +nitpicks +nitrate +nitrated +nitrates +nitrating +nitration +nitre +nitrification +nitrite +nitrites +nitrocellulose +nitrogen +nitrogenous +nitroglycerin +nitroglycerine +nits +nitwit +nitwits +nixed +nixes +nixing +nobelium +nobility +noble +nobleman +noblemen +nobleness +nobler +nobles +noblest +noblewoman +noblewomen +nobly +nobodies +nobody +nocturnal +nocturnally +nocturne +nocturnes +nodal +nodded +nodding +noddle +noddles +node +nodes +nods +nodular +nodule +nodules +noel +noels +noes +noggin +noggins +nohow +noise +noised +noiseless +noiselessly +noiselessness +noisemaker +noisemakers +noises +noisier +noisiest +noisily +noisiness +noising +noisome +noisy +nomad +nomadic +nomads +nomenclature +nomenclatures +nominal +nominally +nominate +nominated +nominates +nominating +nomination +nominations +nominative +nominatives +nominator +nominators +nominee +nominees +nonabrasive +nonabsorbent +nonabsorbents +nonacademic +nonacceptance +nonacid +nonactive +nonactives +nonaddictive +nonadhesive +nonadjacent +nonadjustable +nonadministrative +nonage +nonagenarian +nonagenarians +nonages +nonaggression +nonalcoholic +nonaligned +nonalignment +nonallergic +nonappearance +nonappearances +nonassignable +nonathletic +nonattendance +nonautomotive +nonavailability +nonbasic +nonbeliever +nonbelievers +nonbelligerent +nonbelligerents +nonbinding +nonbreakable +nonburnable +noncaloric +noncancerous +nonce +nonchalance +nonchalant +nonchalantly +nonchargeable +nonclerical +nonclericals +nonclinical +noncollectable +noncom +noncombat +noncombatant +noncombatants +noncombustible +noncommercial +noncommercials +noncommittal +noncommittally +noncommunicable +noncompeting +noncompetitive +noncompliance +noncomplying +noncomprehending +noncoms +nonconducting +nonconductor +nonconductors +nonconforming +nonconformist +nonconformists +nonconformity +nonconsecutive +nonconstructive +noncontagious +noncontinuous +noncontributing +noncontributory +noncontroversial +nonconvertible +noncooperation +noncorroding +noncorrosive +noncredit +noncriminal +noncriminals +noncritical +noncrystalline +noncumulative +noncustodial +nondairy +nondeductible +nondeliveries +nondelivery +nondemocratic +nondenominational +nondepartmental +nondepreciating +nondescript +nondestructive +nondetachable +nondisciplinary +nondisclosure +nondiscrimination +nondiscriminatory +nondramatic +nondrinker +nondrinkers +nondrying +none +noneducational +noneffective +nonelastic +nonelectric +nonelectrical +nonenforceable +nonentities +nonentity +nonequivalent +nonequivalents +nonessential +nonesuch +nonesuches +nonetheless +nonevent +nonevents +nonexchangeable +nonexclusive +nonexempt +nonexempts +nonexistence +nonexistent +nonexplosive +nonexplosives +nonfactual +nonfading +nonfat +nonfatal +nonfattening +nonferrous +nonfiction +nonfictional +nonflammable +nonflowering +nonfluctuating +nonflying +nonfood +nonfoods +nonfreezing +nonfunctional +nongovernmental +nongranular +nonhazardous +nonhereditary +nonhuman +nonidentical +noninclusive +nonindependent +nonindustrial +noninfectious +noninflammatory +noninflationary +noninflected +nonintellectual +nonintellectuals +noninterchangeable +noninterference +nonintervention +nonintoxicating +noninvasive +nonirritating +nonjudgmental +nonjudicial +nonlegal +nonlethal +nonlinear +nonliterary +nonliving +nonmagnetic +nonmalignant +nonmember +nonmembers +nonmetal +nonmetallic +nonmetals +nonmigratory +nonmilitant +nonmilitary +nonnarcotic +nonnarcotics +nonnative +nonnatives +nonnegotiable +nonnuclear +nonnumerical +nonobjective +nonobligatory +nonobservance +nonobservant +nonoccupational +nonoccurrence +nonofficial +nonoperational +nonoperative +nonparallel +nonparallels +nonpareil +nonpareils +nonparticipant +nonparticipants +nonparticipating +nonpartisan +nonpartisans +nonpaying +nonpayment +nonpayments +nonperformance +nonperforming +nonperishable +nonperson +nonpersons +nonphysical +nonphysically +nonplus +nonplused +nonpluses +nonplusing +nonplussed +nonplusses +nonplussing +nonpoisonous +nonpolitical +nonpolluting +nonporous +nonpracticing +nonprejudicial +nonprescription +nonproductive +nonprofessional +nonprofessionals +nonprofit +nonprofitable +nonprofits +nonproliferation +nonpublic +nonpunishable +nonracial +nonradioactive +nonrandom +nonreactive +nonreciprocal +nonreciprocals +nonreciprocating +nonrecognition +nonrecoverable +nonrecurring +nonredeemable +nonrefillable +nonrefundable +nonreligious +nonrenewable +nonrepresentational +nonresident +nonresidential +nonresidents +nonresidual +nonresiduals +nonresistance +nonresistant +nonrestrictive +nonreturnable +nonreturnables +nonrhythmic +nonrigid +nonsalaried +nonscheduled +nonscientific +nonscoring +nonseasonal +nonsectarian +nonsecular +nonsegregated +nonsense +nonsensical +nonsensically +nonsensitive +nonsexist +nonsexual +nonskid +nonslip +nonsmoker +nonsmokers +nonsmoking +nonsocial +nonspeaking +nonspecialist +nonspecialists +nonspecializing +nonspecific +nonspiritual +nonspirituals +nonstaining +nonstandard +nonstarter +nonstarters +nonstick +nonstop +nonstrategic +nonstriking +nonstructural +nonsuccessive +nonsupport +nonsupporting +nonsurgical +nonsustaining +nonsympathizer +nonsympathizers +nontarnishable +nontaxable +nontechnical +nontenured +nontheatrical +nonthinking +nonthreatening +nontoxic +nontraditional +nontransferable +nontransparent +nontropical +nonuniform +nonunion +nonuser +nonusers +nonvenomous +nonverbal +nonviable +nonviolence +nonviolent +nonviolently +nonvirulent +nonvocal +nonvocational +nonvolatile +nonvoter +nonvoters +nonvoting +nonwhite +nonwhites +nonworking +nonyielding +noodle +noodled +noodles +noodling +nook +nooks +noon +noonday +noontide +noontime +noose +nooses +nope +norm +normal +normalcy +normality +normalization +normalize +normalized +normalizes +normalizing +normally +normative +norms +north +northbound +northeast +northeaster +northeasterly +northeastern +northeasters +northeastward +northeastwards +norther +northerlies +northerly +northern +northerner +northerners +northernmost +northers +northward +northwards +northwest +northwester +northwesterly +northwestern +northwesters +northwestward +northwestwards +nose +nosebleed +nosebleeds +nosecone +nosecones +nosed +nosedive +nosedived +nosedives +nosediving +nosedove +nosegay +nosegays +noses +nosey +nosh +noshed +nosher +noshers +noshes +noshing +nosier +nosiest +nosily +nosiness +nosing +nostalgia +nostalgic +nostalgically +nostril +nostrils +nostrum +nostrums +nosy +notabilities +notability +notable +notables +notably +notarial +notaries +notarization +notarize +notarized +notarizes +notarizing +notary +notate +notated +notates +notating +notation +notations +notch +notched +notches +notching +note +notebook +notebooks +noted +notepaper +notes +noteworthier +noteworthiest +noteworthiness +noteworthy +nothing +nothingness +nothings +notice +noticeable +noticeably +noticed +notices +noticing +notification +notifications +notified +notifier +notifiers +notifies +notify +notifying +noting +notion +notional +notions +notoriety +notorious +notoriously +notwithstanding +nougat +nougats +nought +noughts +noun +nouns +nourish +nourished +nourishes +nourishing +nourishment +nova +novae +novas +novel +novelette +novelettes +novelist +novelists +novelization +novelizations +novelize +novelized +novelizes +novelizing +novella +novellas +novelle +novels +novelties +novelty +novena +novenae +novenas +novice +novices +novitiate +novitiates +nowadays +noway +noways +nowhere +nowise +noxious +nozzle +nozzles +nuance +nuanced +nuances +nubbier +nubbiest +nubbin +nubbins +nubby +nubile +nubs +nuclear +nucleate +nucleated +nucleates +nucleating +nucleation +nuclei +nucleoli +nucleolus +nucleon +nucleons +nucleus +nucleuses +nude +nuder +nudes +nudest +nudge +nudged +nudges +nudging +nudism +nudist +nudists +nudity +nugatory +nugget +nuggets +nuisance +nuisances +nuke +nuked +nukes +nuking +null +nullification +nullified +nullifies +nullify +nullifying +nullity +numb +numbed +number +numbered +numbering +numberless +numbers +numbest +numbing +numbly +numbness +numbs +numbskull +numbskulls +numerable +numeracy +numeral +numerals +numerate +numerated +numerates +numerating +numeration +numerations +numerator +numerators +numeric +numerical +numerically +numerologist +numerologists +numerology +numerous +numerously +numinous +numismatic +numismatics +numismatist +numismatists +numskull +numskulls +nuncio +nuncios +nunneries +nunnery +nuns +nuptial +nuptials +nurse +nursed +nurseling +nurselings +nursemaid +nursemaids +nurser +nurseries +nursers +nursery +nurseryman +nurserymen +nurses +nursing +nursling +nurslings +nurture +nurtured +nurturer +nurturers +nurtures +nurturing +nutcracker +nutcrackers +nuthatch +nuthatches +nutmeat +nutmeats +nutmeg +nutmegs +nutpick +nutpicks +nutria +nutrias +nutrient +nutrients +nutriment +nutriments +nutrition +nutritional +nutritionally +nutritionist +nutritionists +nutritious +nutritiously +nutritiousness +nutritive +nuts +nutshell +nutshells +nutted +nuttier +nuttiest +nuttiness +nutting +nutty +nuzzle +nuzzled +nuzzler +nuzzlers +nuzzles +nuzzling +nylon +nylons +nymph +nymphet +nymphets +nymphomania +nymphomaniac +nymphomaniacs +nymphs +oafish +oafishly +oafishness +oafs +oaken +oaks +oakum +oared +oaring +oarlock +oarlocks +oars +oarsman +oarsmen +oarswoman +oarswomen +oases +oasis +oatcake +oatcakes +oaten +oath +oaths +oatmeal +oats +obbligati +obbligato +obbligatos +obduracy +obdurate +obdurately +obdurateness +obedience +obedient +obediently +obeisance +obeisances +obeisant +obelisk +obelisks +obese +obesity +obey +obeyed +obeying +obeys +obfuscate +obfuscated +obfuscates +obfuscating +obfuscation +obis +obit +obits +obituaries +obituary +object +objected +objectified +objectifies +objectify +objectifying +objecting +objection +objectionable +objectionably +objections +objective +objectively +objectiveness +objectives +objectivity +objector +objectors +objects +objurgate +objurgated +objurgates +objurgating +objurgation +objurgations +oblate +oblation +oblations +obligate +obligated +obligates +obligating +obligation +obligations +obligatorily +obligatory +oblige +obliged +obliges +obliging +obligingly +oblique +obliquely +obliqueness +obliques +obliquity +obliterate +obliterated +obliterates +obliterating +obliteration +oblivion +oblivious +obliviously +obliviousness +oblong +oblongs +obloquy +obnoxious +obnoxiously +obnoxiousness +oboe +oboes +oboist +oboists +obscene +obscenely +obscener +obscenest +obscenities +obscenity +obscurantism +obscurantist +obscurantists +obscure +obscured +obscurely +obscurer +obscures +obscurest +obscuring +obscurities +obscurity +obsequies +obsequious +obsequiously +obsequiousness +obsequy +observable +observably +observance +observances +observant +observantly +observation +observational +observations +observatories +observatory +observe +observed +observer +observers +observes +observing +obsess +obsessed +obsesses +obsessing +obsession +obsessional +obsessions +obsessive +obsessively +obsessiveness +obsessives +obsidian +obsolesce +obsolesced +obsolescence +obsolescent +obsolesces +obsolescing +obsolete +obsoleted +obsoletes +obsoleting +obstacle +obstacles +obstetric +obstetrical +obstetrician +obstetricians +obstetrics +obstinacy +obstinate +obstinately +obstreperous +obstreperously +obstreperousness +obstruct +obstructed +obstructing +obstruction +obstructionism +obstructionist +obstructionists +obstructions +obstructive +obstructively +obstructiveness +obstructs +obtain +obtainable +obtained +obtaining +obtainment +obtains +obtrude +obtruded +obtrudes +obtruding +obtrusion +obtrusive +obtrusively +obtrusiveness +obtuse +obtusely +obtuseness +obtuser +obtusest +obverse +obverses +obviate +obviated +obviates +obviating +obviation +obvious +obviously +obviousness +ocarina +ocarinas +occasion +occasional +occasionally +occasioned +occasioning +occasions +occidental +occidentals +occlude +occluded +occludes +occluding +occlusion +occlusions +occlusive +occult +occultism +occultist +occultists +occupancy +occupant +occupants +occupation +occupational +occupationally +occupations +occupied +occupier +occupiers +occupies +occupy +occupying +occur +occurred +occurrence +occurrences +occurring +occurs +ocean +oceanfront +oceanfronts +oceangoing +oceanic +oceanographer +oceanographers +oceanographic +oceanography +oceanology +oceans +ocelot +ocelots +ocher +ochre +octagon +octagonal +octagons +octane +octave +octaves +octavo +octavos +octet +octets +octette +octettes +octogenarian +octogenarians +octopi +octopus +octopuses +ocular +oculars +oculist +oculists +odalisque +odalisques +oddball +oddballs +odder +oddest +oddities +oddity +oddly +oddment +oddments +oddness +odds +odes +odious +odiously +odiousness +odium +odometer +odometers +odor +odored +odoriferous +odorless +odorous +odors +odour +odours +odyssey +odysseys +oedipal +oenology +oenophile +oenophiles +oesophagi +oesophagus +oeuvre +oeuvres +offal +offbeat +offbeats +offed +offence +offences +offend +offended +offender +offenders +offending +offends +offense +offenses +offensive +offensively +offensiveness +offensives +offer +offered +offering +offerings +offers +offertories +offertory +offhand +offhanded +offhandedly +offhandedness +office +officeholder +officeholders +officer +officers +offices +official +officialdom +officialism +officially +officials +officiant +officiants +officiate +officiated +officiates +officiating +officiator +officiators +officious +officiously +officiousness +offing +offings +offish +offline +offload +offloaded +offloading +offloads +offprint +offprints +offs +offset +offsets +offsetting +offshoot +offshoots +offshore +offside +offspring +offsprings +offstage +offtrack +often +oftener +oftenest +oftentimes +ofttimes +ogle +ogled +ogler +oglers +ogles +ogling +ogre +ogreish +ogres +ogress +ogresses +ohmmeter +ohmmeters +ohms +oilcloth +oilcloths +oiled +oilier +oiliest +oiliness +oiling +oils +oilskin +oilskins +oily +oink +oinked +oinking +oinks +ointment +ointments +okapi +okapis +okay +okayed +okaying +okays +okra +okras +olden +older +oldest +oldie +oldies +oldish +oldness +oldster +oldsters +oleaginous +oleander +oleanders +oleo +oleomargarin +oleomargarine +oles +olfactories +olfactory +oligarch +oligarchic +oligarchical +oligarchies +oligarchs +oligarchy +oligopolies +oligopoly +olive +olives +ombudsman +ombudsmen +omega +omegas +omelet +omelets +omelette +omelettes +omen +omens +omicron +omicrons +ominous +ominously +ominousness +omission +omissions +omit +omits +omitted +omitting +omnibus +omnibuses +omnibusses +omnipotence +omnipotent +omnipresence +omnipresent +omniscience +omniscient +omnivore +omnivores +omnivorous +omnivorously +omnivorousness +once +oncogene +oncogenes +oncologist +oncologists +oncology +oncoming +oneness +onerous +onerously +onerousness +ones +oneself +onetime +ongoing +onion +onions +onionskin +online +onlooker +onlookers +onlooking +only +onomatopoeia +onomatopoeic +onomatopoetic +onrush +onrushes +onrushing +onscreen +onset +onsets +onshore +onside +onslaught +onslaughts +onstage +onto +ontogeny +ontological +ontology +onus +onuses +onward +onwards +onyx +onyxes +oodles +oohed +oohing +oohs +oops +ooze +oozed +oozes +oozier +ooziest +oozing +oozy +opacity +opal +opalescence +opalescent +opals +opaque +opaqued +opaquely +opaqueness +opaquer +opaques +opaquest +opaquing +oped +open +opened +opener +openers +openest +openhanded +openhandedness +openhearted +opening +openings +openly +openness +opens +openwork +opera +operable +operas +operate +operated +operates +operatic +operatically +operating +operation +operational +operationally +operations +operative +operatives +operator +operators +operetta +operettas +opes +ophthalmic +ophthalmologist +ophthalmologists +ophthalmology +opiate +opiates +opine +opined +opines +oping +opining +opinion +opinionated +opinions +opium +opossum +opossums +opponent +opponents +opportune +opportunely +opportunism +opportunist +opportunistic +opportunistically +opportunists +opportunities +opportunity +oppose +opposed +opposes +opposing +opposite +oppositely +opposites +opposition +oppress +oppressed +oppresses +oppressing +oppression +oppressive +oppressively +oppressiveness +oppressor +oppressors +opprobrious +opprobriously +opprobrium +opted +optic +optical +optically +optician +opticians +optics +optima +optimal +optimally +optimism +optimist +optimistic +optimistically +optimists +optimization +optimize +optimized +optimizes +optimizing +optimum +optimums +opting +option +optional +optionally +optioned +optioning +options +optometrist +optometrists +optometry +opts +opulence +opulent +opulently +opus +opuses +oracle +oracles +oracular +oral +orally +orals +orange +orangeade +orangeades +oranger +orangeries +orangery +oranges +orangest +orangutan +orangutang +orangutangs +orangutans +orate +orated +orates +orating +oration +orations +orator +oratorical +oratorically +oratories +oratorio +oratorios +orators +oratory +orbicular +orbit +orbital +orbitals +orbited +orbiter +orbiters +orbiting +orbits +orbs +orchard +orchards +orchestra +orchestral +orchestras +orchestrate +orchestrated +orchestrates +orchestrating +orchestration +orchestrations +orchid +orchids +ordain +ordained +ordaining +ordainment +ordains +ordeal +ordeals +order +ordered +ordering +orderlies +orderliness +orderly +orders +ordinal +ordinals +ordinance +ordinances +ordinarily +ordinariness +ordinary +ordinate +ordinates +ordination +ordinations +ordnance +ordure +oregano +ores +organ +organdie +organdy +organelle +organelles +organic +organically +organics +organism +organismic +organisms +organist +organists +organization +organizational +organizationally +organizations +organize +organized +organizer +organizers +organizes +organizing +organs +organza +orgasm +orgasmic +orgasms +orgiastic +orgies +orgy +oriel +oriels +orient +oriental +orientals +orientate +orientated +orientates +orientating +orientation +orientations +oriented +orienting +orients +orifice +orifices +origami +origin +original +originality +originally +originals +originate +originated +originates +originating +origination +originator +originators +origins +oriole +orioles +orison +orisons +ormolu +ornament +ornamental +ornamentation +ornamented +ornamenting +ornaments +ornate +ornately +ornateness +ornerier +orneriest +orneriness +ornery +ornithological +ornithologist +ornithologists +ornithology +orotund +orotundities +orotundity +orphan +orphanage +orphanages +orphaned +orphaning +orphans +orris +orrises +orthodontia +orthodontic +orthodontics +orthodontist +orthodontists +orthodox +orthodoxies +orthodoxy +orthographic +orthographically +orthographies +orthography +orthopaedic +orthopaedics +orthopaedist +orthopaedists +orthopedic +orthopedics +orthopedist +orthopedists +orzo +oscillate +oscillated +oscillates +oscillating +oscillation +oscillations +oscillator +oscillators +oscillatory +oscilloscope +oscilloscopes +osculate +osculated +osculates +osculating +osculation +osculations +osier +osiers +osmium +osmosis +osmotic +osprey +ospreys +ossification +ossified +ossifies +ossify +ossifying +ostensible +ostensibly +ostentation +ostentatious +ostentatiously +osteoarthritis +osteopath +osteopathic +osteopaths +osteopathy +osteoporosis +ostracism +ostracize +ostracized +ostracizes +ostracizing +ostrich +ostriches +other +others +otherwise +otherworldly +otiose +otter +otters +ottoman +ottomans +oubliette +oubliettes +ouch +ought +ounce +ounces +ours +ourselves +oust +ousted +ouster +ousters +ousting +ousts +outage +outages +outargue +outargued +outargues +outarguing +outback +outbacks +outbalance +outbalanced +outbalances +outbalancing +outbid +outbidding +outbids +outboard +outboards +outboast +outboasted +outboasting +outboasts +outbound +outbox +outboxed +outboxes +outboxing +outbreak +outbreaks +outbuilding +outbuildings +outburst +outbursts +outcast +outcasts +outclass +outclassed +outclasses +outclassing +outcome +outcomes +outcries +outcrop +outcropped +outcropping +outcroppings +outcrops +outcry +outdated +outdid +outdistance +outdistanced +outdistances +outdistancing +outdo +outdoes +outdoing +outdone +outdoor +outdoors +outdoorsy +outdraw +outdrawing +outdrawn +outdraws +outdrew +outed +outer +outermost +outerwear +outface +outfaced +outfaces +outfacing +outfield +outfielder +outfielders +outfields +outfight +outfighting +outfights +outfit +outfits +outfitted +outfitter +outfitters +outfitting +outflank +outflanked +outflanking +outflanks +outflow +outflows +outfought +outfox +outfoxed +outfoxes +outfoxing +outgo +outgoes +outgoing +outgrew +outgrow +outgrowing +outgrown +outgrows +outgrowth +outgrowths +outguess +outguessed +outguesses +outguessing +outgun +outgunned +outgunning +outguns +outhit +outhits +outhitting +outhouse +outhouses +outing +outings +outlaid +outlandish +outlandishly +outlandishness +outlast +outlasted +outlasting +outlasts +outlaw +outlawed +outlawing +outlaws +outlay +outlaying +outlays +outlet +outlets +outline +outlined +outlines +outlining +outlive +outlived +outlives +outliving +outlook +outlooks +outlying +outmaneuver +outmaneuvered +outmaneuvering +outmaneuvers +outmanoeuvre +outmanoeuvred +outmanoeuvres +outmanoeuvring +outmatch +outmatched +outmatches +outmatching +outmoded +outnumber +outnumbered +outnumbering +outnumbers +outpatient +outpatients +outperform +outperformed +outperforming +outperforms +outplace +outplaced +outplacement +outplaces +outplacing +outplay +outplayed +outplaying +outplays +outpoint +outpointed +outpointing +outpoints +outpost +outposts +outpouring +outpourings +outproduce +outproduced +outproduces +outproducing +output +outputs +outputted +outputting +outrace +outraced +outraces +outracing +outrage +outraged +outrageous +outrageously +outrages +outraging +outran +outrank +outranked +outranking +outranks +outre +outreach +outreached +outreaches +outreaching +outrider +outriders +outrigger +outriggers +outright +outrun +outrunning +outruns +outs +outscore +outscored +outscores +outscoring +outsell +outselling +outsells +outset +outsets +outshine +outshined +outshines +outshining +outshone +outshout +outshouted +outshouting +outshouts +outside +outsider +outsiders +outsides +outsize +outsized +outsizes +outskirt +outskirts +outsmart +outsmarted +outsmarting +outsmarts +outsold +outsource +outsourced +outsources +outsourcing +outspend +outspending +outspends +outspent +outspoken +outspokenly +outspokenness +outspread +outspreading +outspreads +outstanding +outstandingly +outstation +outstations +outstay +outstayed +outstaying +outstays +outstretch +outstretched +outstretches +outstretching +outstrip +outstripped +outstripping +outstrips +outstript +outtake +outtakes +outvote +outvoted +outvotes +outvoting +outward +outwardly +outwards +outwear +outwearing +outwears +outweigh +outweighed +outweighing +outweighs +outwit +outwits +outwitted +outwitting +outwore +outwork +outworked +outworking +outworks +outworn +ouzo +oval +ovals +ovarian +ovaries +ovary +ovate +ovation +ovations +oven +ovenbird +ovenbirds +ovens +over +overabundance +overabundant +overachieve +overachieved +overachiever +overachievers +overachieves +overachieving +overact +overacted +overacting +overactive +overacts +overage +overages +overaggressive +overall +overalls +overambitious +overanxious +overarm +overarmed +overarming +overarms +overate +overattentive +overawe +overawed +overawes +overawing +overbalance +overbalanced +overbalances +overbalancing +overbear +overbearing +overbearingly +overbears +overbid +overbidding +overbids +overbite +overbites +overblown +overboard +overbold +overbook +overbooked +overbooking +overbooks +overbore +overborne +overbought +overbuild +overbuilding +overbuilds +overbuilt +overburden +overburdened +overburdening +overburdens +overbuy +overbuying +overbuys +overcame +overcapacity +overcapitalize +overcapitalized +overcapitalizes +overcapitalizing +overcareful +overcast +overcasting +overcasts +overcautious +overcharge +overcharged +overcharges +overcharging +overcloud +overclouded +overclouding +overclouds +overcoat +overcoats +overcome +overcomes +overcoming +overcompensate +overcompensated +overcompensates +overcompensating +overcompensation +overconfidence +overconfident +overconscientious +overcook +overcooked +overcooking +overcooks +overcritical +overcrowd +overcrowded +overcrowding +overcrowds +overdecorate +overdecorated +overdecorates +overdecorating +overdependent +overdevelop +overdeveloped +overdeveloping +overdevelops +overdid +overdo +overdoes +overdoing +overdone +overdose +overdosed +overdoses +overdosing +overdraft +overdrafts +overdraw +overdrawing +overdrawn +overdraws +overdress +overdressed +overdresses +overdressing +overdrew +overdrive +overdub +overdubbed +overdubbing +overdubs +overdue +overeager +overeat +overeaten +overeating +overeats +overemotional +overemphasis +overemphasize +overemphasized +overemphasizes +overemphasizing +overenthusiastic +overestimate +overestimated +overestimates +overestimating +overestimation +overexcite +overexcited +overexcites +overexciting +overexercise +overexercised +overexercises +overexercising +overexert +overexerted +overexerting +overexertion +overexerts +overexpose +overexposed +overexposes +overexposing +overexposure +overextend +overextended +overextending +overextends +overfed +overfeed +overfeeding +overfeeds +overfill +overfilled +overfilling +overfills +overflew +overflies +overflight +overflights +overflow +overflowed +overflowing +overflown +overflows +overfly +overflying +overfond +overfull +overgeneralize +overgeneralized +overgeneralizes +overgeneralizing +overgenerous +overgraze +overgrazed +overgrazes +overgrazing +overgrew +overgrow +overgrowing +overgrown +overgrows +overgrowth +overhand +overhanded +overhands +overhang +overhanging +overhangs +overhasty +overhaul +overhauled +overhauling +overhauls +overhead +overheads +overhear +overheard +overhearing +overhears +overheat +overheated +overheating +overheats +overhung +overindulge +overindulged +overindulgence +overindulgent +overindulges +overindulging +overjoy +overjoyed +overjoying +overjoys +overkill +overladen +overlaid +overlain +overland +overlap +overlapped +overlapping +overlaps +overlarge +overlay +overlaying +overlays +overleaf +overlie +overlies +overload +overloaded +overloading +overloads +overlong +overlook +overlooked +overlooking +overlooks +overlord +overlords +overly +overlying +overmaster +overmastered +overmastering +overmasters +overmodest +overmuch +overnice +overnight +overnights +overoptimism +overoptimistic +overpaid +overparticular +overpass +overpasses +overpay +overpaying +overpays +overplay +overplayed +overplaying +overplays +overpopulate +overpopulated +overpopulates +overpopulating +overpopulation +overpower +overpowered +overpowering +overpoweringly +overpowers +overpraise +overpraised +overpraises +overpraising +overprecise +overprice +overpriced +overprices +overpricing +overprint +overprinted +overprinting +overprints +overproduce +overproduced +overproduces +overproducing +overproduction +overprotect +overprotected +overprotecting +overprotective +overprotects +overqualified +overran +overrate +overrated +overrates +overrating +overreach +overreached +overreaches +overreaching +overreact +overreacted +overreacting +overreaction +overreactions +overreacts +overrefined +overridden +override +overrides +overriding +overripe +overrode +overrule +overruled +overrules +overruling +overrun +overrunning +overruns +overs +oversaw +oversea +overseas +oversee +overseeing +overseen +overseer +overseers +oversees +oversell +overselling +oversells +oversensitive +oversensitiveness +oversexed +overshadow +overshadowed +overshadowing +overshadows +overshoe +overshoes +overshoot +overshooting +overshoots +overshot +oversight +oversights +oversimple +oversimplification +oversimplifications +oversimplified +oversimplifies +oversimplify +oversimplifying +oversize +oversized +oversleep +oversleeping +oversleeps +overslept +oversold +overspecialization +overspecialize +overspecialized +overspecializes +overspecializing +overspend +overspending +overspends +overspent +overspill +overspilled +overspilling +overspills +overspilt +overspread +overspreading +overspreads +overstate +overstated +overstatement +overstatements +overstates +overstating +overstay +overstayed +overstaying +overstays +overstep +overstepped +overstepping +oversteps +overstimulate +overstimulated +overstimulates +overstimulating +overstock +overstocked +overstocking +overstocks +overstrict +overstrung +overstuffed +oversubscribe +oversubscribed +oversubscribes +oversubscribing +oversubtle +oversupplied +oversupplies +oversupply +oversupplying +oversuspicious +overt +overtake +overtaken +overtakes +overtaking +overtax +overtaxed +overtaxes +overtaxing +overthrew +overthrow +overthrowing +overthrown +overthrows +overtime +overtimes +overtire +overtired +overtires +overtiring +overtly +overtone +overtones +overtook +overture +overtures +overturn +overturned +overturning +overturns +overuse +overused +overuses +overusing +overvalue +overvalued +overvalues +overvaluing +overview +overviews +overweening +overweight +overwhelm +overwhelmed +overwhelming +overwhelmingly +overwhelms +overwinter +overwintered +overwintering +overwinters +overwork +overworked +overworking +overworks +overwrought +overzealous +oviduct +oviducts +oviparous +ovoid +ovoids +ovular +ovulate +ovulated +ovulates +ovulating +ovulation +ovule +ovules +ovum +owed +owes +owing +owlet +owlets +owlish +owlishly +owls +owned +owner +owners +ownership +owning +owns +oxblood +oxbow +oxbows +oxcart +oxcarts +oxen +oxford +oxfords +oxidant +oxidants +oxidation +oxide +oxides +oxidization +oxidize +oxidized +oxidizer +oxidizers +oxidizes +oxidizing +oxyacetylene +oxygen +oxygenate +oxygenated +oxygenates +oxygenating +oxygenation +oxymora +oxymoron +oxymorons +oyster +oysters +ozone +pablum +pabulum +pace +paced +pacemaker +pacemakers +pacer +pacers +paces +pacesetter +pacesetters +pachyderm +pachyderms +pachysandra +pachysandras +pacific +pacifically +pacification +pacified +pacifier +pacifiers +pacifies +pacifism +pacifist +pacifistic +pacifists +pacify +pacifying +pacing +pack +package +packaged +packager +packagers +packages +packaging +packed +packer +packers +packet +packets +packing +packinghouse +packinghouses +packs +packsaddle +packsaddles +pact +pacts +padded +paddies +padding +paddle +paddled +paddler +paddlers +paddles +paddling +paddock +paddocked +paddocking +paddocks +paddy +padlock +padlocked +padlocking +padlocks +padre +padres +pads +paean +paeans +paediatric +paediatrician +paediatricians +paediatrics +paella +pagan +paganism +pagans +page +pageant +pageantry +pageants +pageboy +pageboys +paged +pager +pagers +pages +paginate +paginated +paginates +paginating +pagination +paging +pagoda +pagodas +paid +pail +pailful +pailfuls +pails +pailsful +pain +pained +painful +painfuller +painfullest +painfully +painfulness +paining +painkiller +painkillers +painkilling +painless +painlessly +painlessness +pains +painstaking +painstakingly +paint +paintbox +paintboxes +paintbrush +paintbrushes +painted +painter +painters +painting +paintings +paints +pair +paired +pairing +pairs +paisley +paisleys +pajama +pajamas +palace +palaces +paladin +paladins +palanquin +palanquins +palatable +palatal +palatalization +palatalize +palatalized +palatalizes +palatalizing +palatals +palate +palates +palatial +palatially +palatinate +palatinates +palatine +palatines +palaver +palavered +palavering +palavers +pale +paled +paleface +palefaces +palely +paleness +paleographer +paleographers +paleography +paleolithic +paleontologist +paleontologists +paleontology +paler +pales +palest +palette +palettes +palfrey +palfreys +palimony +palimpsest +palimpsests +palindrome +palindromes +paling +palings +palisade +palisades +palish +pall +palladium +pallbearer +pallbearers +palled +pallet +pallets +palliate +palliated +palliates +palliating +palliation +palliative +palliatives +pallid +pallider +pallidest +pallidly +pallidness +palling +pallor +palls +palm +palmate +palmed +palmetto +palmettoes +palmettos +palmier +palmiest +palming +palmist +palmistry +palmists +palms +palmtop +palmtops +palmy +palomino +palominos +palpable +palpably +palpate +palpated +palpates +palpating +palpation +palpitate +palpitated +palpitates +palpitating +palpitation +palpitations +pals +palsied +palsies +palsy +palsying +paltrier +paltriest +paltriness +paltry +pampas +pamper +pampered +pampering +pampers +pamphlet +pamphleted +pamphleteer +pamphleteers +pamphleting +pamphlets +panacea +panaceas +panache +panama +panamas +pancake +pancaked +pancakes +pancaking +panchromatic +pancreas +pancreases +pancreatic +panda +pandas +pandemic +pandemics +pandemonium +pander +pandered +panderer +panderers +pandering +panders +pane +panegyric +panegyrics +panel +paneled +paneling +panelist +panelists +panelled +panelling +panels +panes +pang +pangs +panhandle +panhandled +panhandler +panhandlers +panhandles +panhandling +panic +panicked +panicking +panicky +panics +panier +paniers +panned +pannier +panniers +panning +panoplies +panoply +panorama +panoramas +panoramic +panpipes +pans +pansies +pansy +pant +pantaloons +panted +pantheism +pantheist +pantheistic +pantheists +pantheon +pantheons +panther +panthers +pantie +panties +panting +pantomime +pantomimed +pantomimes +pantomimic +pantomiming +pantomimist +pantomimists +pantries +pantry +pants +pantsuit +pantsuits +panty +pantyhose +pantyliner +pantyliners +pantywaist +pantywaists +papa +papacies +papacy +papal +paparazzi +papas +papaw +papaws +papaya +papayas +paper +paperback +paperbacks +paperboard +paperboy +paperboys +papered +paperer +paperers +papergirl +papergirls +paperhanger +paperhangers +paperhanging +papering +papers +paperweight +paperweights +paperwork +papery +papilla +papillae +papillary +papist +papists +papoose +papooses +pappies +pappy +paprika +paps +papyri +papyrus +papyruses +para +parable +parables +parabola +parabolas +parabolic +parachute +parachuted +parachutes +parachuting +parachutist +parachutists +parade +paraded +parader +paraders +parades +paradigm +paradigmatic +paradigms +parading +paradisaical +paradise +paradises +paradox +paradoxes +paradoxical +paradoxically +paraffin +paragon +paragons +paragraph +paragraphed +paragraphing +paragraphs +parakeet +parakeets +paralegal +paralegals +parallax +parallaxes +parallel +paralleled +paralleling +parallelism +parallelisms +parallelled +parallelling +parallelogram +parallelograms +parallels +paralyse +paralysed +paralyses +paralysing +paralysis +paralytic +paralytics +paralyze +paralyzed +paralyzes +paralyzing +paralyzingly +paramecia +paramecium +parameciums +paramedic +paramedical +paramedicals +paramedics +parameter +parameters +parametric +paramilitaries +paramilitary +paramount +paramour +paramours +paranoia +paranoiac +paranoiacs +paranoid +paranoids +paranormal +parapet +parapets +paraphernalia +paraphrase +paraphrased +paraphrases +paraphrasing +paraplegia +paraplegic +paraplegics +paraprofessional +paraprofessionals +parapsychologist +parapsychologists +parapsychology +paraquat +paras +parasite +parasites +parasitic +parasitically +parasitism +parasol +parasols +parasympathetic +parathion +parathyroid +parathyroids +paratrooper +paratroopers +paratroops +paratyphoid +parboil +parboiled +parboiling +parboils +parcel +parceled +parceling +parcelled +parcelling +parcels +parch +parched +parches +parching +parchment +parchments +pardon +pardonable +pardonably +pardoned +pardoner +pardoners +pardoning +pardons +pare +pared +paregoric +parent +parentage +parental +parented +parentheses +parenthesis +parenthesize +parenthesized +parenthesizes +parenthesizing +parenthetic +parenthetical +parenthetically +parenthood +parenting +parents +parer +parers +pares +paresis +parfait +parfaits +pariah +pariahs +parietal +parimutuel +parimutuels +paring +parings +parish +parishes +parishioner +parishioners +parity +park +parka +parkas +parked +parking +parks +parkway +parkways +parlance +parlay +parlayed +parlaying +parlays +parley +parleyed +parleying +parleys +parliament +parliamentarian +parliamentarians +parliamentary +parliaments +parlor +parlors +parlour +parlours +parlous +parmigiana +parmigiano +parochial +parochialism +parochially +parodied +parodies +parodist +parodists +parody +parodying +parole +paroled +parolee +parolees +paroles +paroling +paroxysm +paroxysmal +paroxysms +parquet +parqueted +parqueting +parquetry +parquets +parrakeet +parrakeets +parred +parricidal +parricide +parricides +parried +parries +parring +parrot +parroted +parroting +parrots +parry +parrying +pars +parse +parsec +parsecs +parsed +parses +parsimonious +parsimoniously +parsimony +parsing +parsley +parsnip +parsnips +parson +parsonage +parsonages +parsons +part +partake +partaken +partaker +partakers +partakes +partaking +parted +parterre +parterres +parthenogenesis +partial +partiality +partially +partials +participant +participants +participate +participated +participates +participating +participation +participator +participators +participatory +participial +participle +participles +particle +particleboard +particles +particular +particularities +particularity +particularization +particularize +particularized +particularizes +particularizing +particularly +particulars +particulate +particulates +partied +parties +parting +partings +partisan +partisans +partisanship +partition +partitioned +partitioning +partitions +partitive +partitives +partizan +partizans +partly +partner +partnered +partnering +partners +partnership +partnerships +partook +partridge +partridges +parts +parturition +partway +party +partying +parvenu +parvenus +pascal +pascals +paschal +pasha +pashas +pass +passable +passably +passage +passages +passageway +passageways +passbook +passbooks +passe +passed +passel +passels +passenger +passengers +passer +passerby +passers +passersby +passes +passim +passing +passingly +passion +passionate +passionately +passionflower +passionflowers +passionless +passions +passive +passively +passiveness +passives +passivity +passkey +passkeys +passport +passports +password +passwords +past +pasta +pastas +paste +pasteboard +pasted +pastel +pastels +pastern +pasterns +pastes +pasteurization +pasteurize +pasteurized +pasteurizer +pasteurizers +pasteurizes +pasteurizing +pastiche +pastiches +pastier +pasties +pastiest +pastille +pastilles +pastime +pastimes +pastiness +pasting +pastor +pastoral +pastorals +pastorate +pastorates +pastors +pastrami +pastries +pastry +pasts +pasturage +pasture +pastured +pastureland +pastures +pasturing +pasty +patch +patched +patches +patchier +patchiest +patchily +patchiness +patching +patchwork +patchworks +patchy +pate +patella +patellae +patellas +patent +patented +patenting +patently +patents +paterfamilias +paterfamiliases +paternal +paternalism +paternalistic +paternally +paternity +paternoster +paternosters +pates +path +pathetic +pathetically +pathfinder +pathfinders +pathless +pathogen +pathogenic +pathogens +pathological +pathologically +pathologies +pathologist +pathologists +pathology +pathos +paths +pathway +pathways +patience +patient +patienter +patientest +patiently +patients +patina +patinae +patinas +patio +patios +patois +patresfamilias +patriarch +patriarchal +patriarchate +patriarchates +patriarchies +patriarchs +patriarchy +patrician +patricians +patricide +patricides +patrimonial +patrimonies +patrimony +patriot +patriotic +patriotically +patriotism +patriots +patrol +patrolled +patrolling +patrolman +patrolmen +patrols +patrolwoman +patrolwomen +patron +patronage +patroness +patronesses +patronize +patronized +patronizer +patronizers +patronizes +patronizing +patronizingly +patrons +patronymic +patronymically +patronymics +patroon +patroons +pats +patsies +patsy +patted +patter +pattered +pattering +pattern +patterned +patterning +patterns +patters +patties +patting +patty +paucity +paunch +paunches +paunchier +paunchiest +paunchy +pauper +pauperism +pauperize +pauperized +pauperizes +pauperizing +paupers +pause +paused +pauses +pausing +pave +paved +pavement +pavements +paves +pavilion +pavilions +paving +pavings +pawed +pawing +pawl +pawls +pawn +pawnbroker +pawnbrokers +pawnbroking +pawned +pawning +pawns +pawnshop +pawnshops +pawpaw +pawpaws +paws +payable +payback +paybacks +paycheck +paychecks +payday +paydays +payed +payee +payees +payer +payers +paying +payload +payloads +paymaster +paymasters +payment +payments +payoff +payoffs +payola +payout +payouts +payroll +payrolls +pays +payslip +payslips +peace +peaceable +peaceably +peaceful +peacefully +peacefulness +peacekeeper +peacekeepers +peacekeeping +peacemaker +peacemakers +peacemaking +peaces +peacetime +peach +peaches +peachier +peachiest +peachy +peacock +peacocks +peafowl +peafowls +peahen +peahens +peak +peaked +peaking +peaks +peal +pealed +pealing +peals +peanut +peanuts +pear +pearl +pearled +pearlier +pearliest +pearling +pearls +pearly +pears +peas +peasant +peasantry +peasants +pease +peashooter +peashooters +peat +peatier +peatiest +peaty +pebble +pebbled +pebbles +pebblier +pebbliest +pebbling +pebbly +pecan +pecans +peccadillo +peccadilloes +peccadillos +peccaries +peccary +peck +pecked +pecking +pecks +pectic +pectin +pectoral +pectorals +peculate +peculated +peculates +peculating +peculation +peculator +peculators +peculiar +peculiarities +peculiarity +peculiarly +pecuniary +pedagog +pedagogic +pedagogical +pedagogs +pedagogue +pedagogues +pedagogy +pedal +pedaled +pedaling +pedalled +pedalling +pedals +pedant +pedantic +pedantically +pedantry +pedants +peddle +peddled +peddler +peddlers +peddles +peddling +pederast +pederasts +pederasty +pedestal +pedestals +pedestrian +pedestrianize +pedestrianized +pedestrianizes +pedestrianizing +pedestrians +pediatric +pediatrician +pediatricians +pediatrics +pedicab +pedicabs +pedicure +pedicured +pedicures +pedicuring +pedicurist +pedicurists +pedigree +pedigreed +pedigrees +pediment +pediments +pedlar +pedlars +pedometer +pedometers +peduncle +peduncles +peed +peeing +peek +peekaboo +peeked +peeking +peeks +peel +peeled +peeler +peelers +peeling +peelings +peels +peen +peens +peep +peeped +peeper +peepers +peephole +peepholes +peeping +peeps +peepshow +peepshows +peer +peerage +peerages +peered +peeress +peeresses +peering +peerless +peers +pees +peeve +peeved +peeves +peeving +peevish +peevishly +peevishness +peewee +peewees +pegboard +pegboards +pegged +pegging +pegs +peignoir +peignoirs +pejoration +pejorative +pejoratively +pejoratives +peke +pekes +pekinese +pekingese +pekoe +pelagic +pelf +pelican +pelicans +pellagra +pellet +pelleted +pelleting +pellets +pellmell +pellucid +pelt +pelted +pelting +pelts +pelves +pelvic +pelvis +pelvises +pemmican +penal +penalization +penalize +penalized +penalizes +penalizing +penalties +penalty +penance +penances +pence +penchant +penchants +pencil +penciled +penciling +pencilled +pencilling +pencils +pend +pendant +pendants +pended +pendent +pendents +pending +pends +pendulous +pendulum +pendulums +penes +penetrability +penetrable +penetrate +penetrated +penetrates +penetrating +penetratingly +penetration +penetrations +penetrative +penguin +penguins +penicillin +penile +peninsula +peninsular +peninsulas +penis +penises +penitence +penitent +penitential +penitentiaries +penitentiary +penitently +penitents +penknife +penknives +penlight +penlights +penlite +penlites +penman +penmanship +penmen +pennant +pennants +penned +pennies +penniless +penning +pennon +pennons +penny +pennyweight +pennyweights +penologist +penologists +penology +pens +pension +pensionable +pensioned +pensioner +pensioners +pensioning +pensions +pensive +pensively +pensiveness +pent +pentacle +pentacles +pentagon +pentagonal +pentagons +pentagram +pentagrams +pentameter +pentameters +pentathlete +pentathletes +pentathlon +pentathlons +penthouse +penthouses +penuche +penultimate +penultimates +penumbra +penumbrae +penumbras +penurious +penuriously +penuriousness +penury +peon +peonage +peonies +peons +peony +people +peopled +peoples +peopling +pepped +pepper +peppercorn +peppercorns +peppered +peppering +peppermint +peppermints +pepperoni +pepperonis +peppers +peppery +peppier +peppiest +peppiness +pepping +peppy +peps +pepsin +peptic +peptics +peradventure +perambulate +perambulated +perambulates +perambulating +perambulation +perambulations +perambulator +perambulators +percale +percales +perceivable +perceive +perceived +perceives +perceiving +percent +percentage +percentages +percentile +percentiles +percents +perceptible +perceptibly +perception +perceptional +perceptions +perceptive +perceptively +perceptiveness +perceptual +perceptually +perch +perchance +perched +perches +perching +percipience +percipient +percolate +percolated +percolates +percolating +percolation +percolator +percolators +percussion +percussionist +percussionists +perdition +perdurable +peregrinate +peregrinated +peregrinates +peregrinating +peregrination +peregrinations +peregrine +peregrines +peremptorily +peremptory +perennial +perennially +perennials +perestroika +perfect +perfecta +perfectas +perfected +perfecter +perfectest +perfectibility +perfectible +perfecting +perfection +perfectionism +perfectionist +perfectionists +perfections +perfectly +perfectness +perfects +perfidies +perfidious +perfidiously +perfidy +perforate +perforated +perforates +perforating +perforation +perforations +perforce +perform +performance +performances +performed +performer +performers +performing +performs +perfume +perfumed +perfumer +perfumeries +perfumers +perfumery +perfumes +perfuming +perfunctorily +perfunctory +pergola +pergolas +perhaps +pericardia +pericardium +pericardiums +perigee +perigees +perihelia +perihelion +perihelions +peril +periled +periling +perilled +perilling +perilous +perilously +perils +perimeter +perimeters +perinea +perineum +period +periodic +periodical +periodically +periodicals +periodicity +periodontal +periodontics +periodontist +periodontists +periods +peripatetic +peripatetics +peripheral +peripherally +peripherals +peripheries +periphery +periphrases +periphrasis +periphrastic +periscope +periscopes +perish +perishable +perishables +perished +perishes +perishing +peristalsis +peristaltic +peristyle +peristyles +peritonea +peritoneal +peritoneum +peritoneums +peritonitis +periwig +periwigs +periwinkle +periwinkles +perjure +perjured +perjurer +perjurers +perjures +perjuries +perjuring +perjury +perk +perked +perkier +perkiest +perkily +perkiness +perking +perks +perky +perm +permafrost +permanence +permanency +permanent +permanently +permanents +permeability +permeable +permeate +permeated +permeates +permeating +permeation +permed +perming +permissible +permissibly +permission +permissive +permissively +permissiveness +permit +permits +permitted +permitting +perms +permutation +permutations +permute +permuted +permutes +permuting +pernicious +perniciously +perniciousness +pernickety +peroration +perorations +peroxide +peroxided +peroxides +peroxiding +perpendicular +perpendicularity +perpendicularly +perpendiculars +perpetrate +perpetrated +perpetrates +perpetrating +perpetration +perpetrator +perpetrators +perpetual +perpetually +perpetuals +perpetuate +perpetuated +perpetuates +perpetuating +perpetuation +perpetuity +perplex +perplexed +perplexedly +perplexes +perplexing +perplexities +perplexity +perquisite +perquisites +persecute +persecuted +persecutes +persecuting +persecution +persecutions +persecutor +persecutors +perseverance +persevere +persevered +perseveres +persevering +persiflage +persimmon +persimmons +persist +persisted +persistence +persistent +persistently +persisting +persists +persnickety +person +persona +personable +personae +personage +personages +personal +personalities +personality +personalize +personalized +personalizes +personalizing +personally +personals +personalty +personas +personification +personifications +personified +personifies +personify +personifying +personnel +persons +perspective +perspectives +perspicacious +perspicaciously +perspicacity +perspicuity +perspicuous +perspiration +perspire +perspired +perspires +perspiring +persuadable +persuade +persuaded +persuader +persuaders +persuades +persuading +persuasion +persuasions +persuasive +persuasively +persuasiveness +pert +pertain +pertained +pertaining +pertains +perter +pertest +pertinacious +pertinaciously +pertinacity +pertinence +pertinent +pertinently +pertly +pertness +perturb +perturbation +perturbations +perturbed +perturbing +perturbs +pertussis +peruke +perukes +perusal +perusals +peruse +perused +peruses +perusing +pervade +pervaded +pervades +pervading +pervasive +pervasively +pervasiveness +perverse +perversely +perverseness +perversion +perversions +perversity +pervert +perverted +perverting +perverts +peseta +pesetas +peskier +peskiest +peskily +peskiness +pesky +peso +pesos +pessimism +pessimist +pessimistic +pessimistically +pessimists +pest +pester +pestered +pestering +pesters +pesticide +pesticides +pestiferous +pestilence +pestilences +pestilent +pestilential +pestle +pestled +pestles +pestling +pesto +pests +petal +petaled +petals +petard +petards +petcock +petcocks +peter +petered +petering +peters +petiole +petioles +petite +petites +petition +petitioned +petitioner +petitioners +petitioning +petitions +petrel +petrels +petrifaction +petrified +petrifies +petrify +petrifying +petrochemical +petrochemicals +petrodollar +petrodollars +petrol +petrolatum +petroleum +petrologist +petrologists +petrology +pets +petted +petticoat +petticoats +pettier +pettiest +pettifog +pettifogged +pettifogger +pettifoggers +pettifoggery +pettifogging +pettifogs +pettily +pettiness +petting +pettish +pettishly +petty +petulance +petulant +petulantly +petunia +petunias +pewee +pewees +pewit +pewits +pews +pewter +pewters +peyote +pfennig +pfennige +pfennigs +phaeton +phaetons +phagocyte +phagocytes +phalanger +phalangers +phalanges +phalanx +phalanxes +phalli +phallic +phallus +phalluses +phantasied +phantasies +phantasm +phantasmagoria +phantasmagorias +phantasmal +phantasms +phantasy +phantasying +phantom +phantoms +pharaoh +pharaohs +pharisaic +pharisee +pharisees +pharmaceutic +pharmaceutical +pharmaceuticals +pharmaceutics +pharmacies +pharmacist +pharmacists +pharmacological +pharmacologist +pharmacologists +pharmacology +pharmacopeia +pharmacopeias +pharmacopoeia +pharmacopoeias +pharmacy +pharyngeal +pharynges +pharyngitis +pharynx +pharynxes +phase +phased +phaseout +phaseouts +phases +phasing +phat +phatter +phattest +pheasant +pheasants +phenacetin +phenobarbital +phenol +phenom +phenomena +phenomenal +phenomenally +phenomenon +phenomenons +phenoms +pheromone +pheromones +phew +phial +phials +philander +philandered +philanderer +philanderers +philandering +philanders +philanthropic +philanthropically +philanthropies +philanthropist +philanthropists +philanthropy +philatelic +philatelist +philatelists +philately +philharmonic +philharmonics +philippic +philippics +philistine +philistines +philistinism +philodendra +philodendron +philodendrons +philological +philologist +philologists +philology +philosopher +philosophers +philosophic +philosophical +philosophically +philosophies +philosophize +philosophized +philosophizer +philosophizers +philosophizes +philosophizing +philosophy +philter +philters +philtre +philtres +phis +phlebitis +phlegm +phlegmatic +phlegmatically +phloem +phlox +phloxes +phobia +phobias +phobic +phobics +phoebe +phoebes +phoenix +phoenixes +phone +phoned +phoneme +phonemes +phonemic +phonemically +phones +phonetic +phonetically +phonetician +phoneticians +phonetics +phoney +phoneyed +phoneying +phoneys +phonic +phonically +phonics +phonied +phonier +phonies +phoniest +phoniness +phoning +phonograph +phonographic +phonographs +phonological +phonologically +phonologist +phonologists +phonology +phony +phonying +phooey +phosphate +phosphates +phosphor +phosphorescence +phosphorescent +phosphorescently +phosphoric +phosphorous +phosphors +phosphorus +photo +photocell +photocells +photocopied +photocopier +photocopiers +photocopies +photocopy +photocopying +photoed +photoelectric +photoelectrically +photoengrave +photoengraved +photoengraver +photoengravers +photoengraves +photoengraving +photoengravings +photofinishing +photogenic +photogenically +photograph +photographed +photographer +photographers +photographic +photographically +photographing +photographs +photography +photoing +photojournalism +photojournalist +photojournalists +photometer +photometers +photon +photons +photos +photosensitive +photostat +photostated +photostatic +photostating +photostats +photostatted +photostatting +photosynthesis +photosynthesize +photosynthesized +photosynthesizes +photosynthesizing +photosynthetic +phrasal +phrase +phrased +phraseology +phrases +phrasing +phrasings +phrenetic +phrenologist +phrenologists +phrenology +phyla +phylacteries +phylactery +phylogeny +phylum +physic +physical +physically +physicals +physician +physicians +physicist +physicists +physicked +physicking +physics +physiognomies +physiognomy +physiography +physiologic +physiological +physiologically +physiologist +physiologists +physiology +physiotherapist +physiotherapists +physiotherapy +physique +physiques +pianissimi +pianissimo +pianissimos +pianist +pianists +piano +pianoforte +pianofortes +pianos +piaster +piasters +piastre +piastres +piazza +piazzas +piazze +pibroch +pibrochs +pica +picador +picadors +picaresque +picayune +piccalilli +piccolo +piccolos +pick +pickaback +pickabacked +pickabacking +pickabacks +pickax +pickaxe +pickaxed +pickaxes +pickaxing +picked +picker +pickerel +pickerels +pickers +picket +picketed +picketing +pickets +pickier +pickiest +picking +pickings +pickle +pickled +pickles +pickling +pickpocket +pickpockets +picks +pickup +pickups +picky +picnic +picnicked +picnicker +picnickers +picnicking +picnics +picot +picots +pics +pictograph +pictographs +pictorial +pictorially +pictorials +picture +pictured +pictures +picturesque +picturesquely +picturesqueness +picturing +piddle +piddled +piddles +piddling +piddly +pidgin +pidgins +piebald +piebalds +piece +pieced +piecemeal +pieces +piecework +pieceworker +pieceworkers +piecing +pied +pieing +pier +pierce +pierced +pierces +piercing +piercingly +piercings +piers +pies +piety +piffle +piffling +pigeon +pigeonhole +pigeonholed +pigeonholes +pigeonholing +pigeons +pigged +piggier +piggies +piggiest +pigging +piggish +piggishly +piggishness +piggy +piggyback +piggybacked +piggybacking +piggybacks +pigheaded +pigheadedly +pigheadedness +piglet +piglets +pigment +pigmentation +pigments +pigmies +pigmy +pigpen +pigpens +pigs +pigskin +pigskins +pigsties +pigsty +pigtail +pigtails +piing +pike +piked +piker +pikers +pikes +pikestaff +pikestaffs +pikestaves +piking +pilaf +pilaff +pilaffs +pilafs +pilaster +pilasters +pilau +pilaus +pilchard +pilchards +pile +piled +piles +pileup +pileups +pilfer +pilferage +pilfered +pilferer +pilferers +pilfering +pilfers +pilgrim +pilgrimage +pilgrimages +pilgrims +piling +pilings +pill +pillage +pillaged +pillager +pillagers +pillages +pillaging +pillar +pillars +pillbox +pillboxes +pilled +pilling +pillion +pillions +pilloried +pillories +pillory +pillorying +pillow +pillowcase +pillowcases +pillowed +pillowing +pillows +pillowslip +pillowslips +pills +pilot +piloted +pilothouse +pilothouses +piloting +pilots +pimento +pimentos +pimiento +pimientos +pimp +pimped +pimpernel +pimpernels +pimping +pimple +pimpled +pimples +pimplier +pimpliest +pimply +pimps +pinafore +pinafores +pinata +pinatas +pinball +pincer +pincers +pinch +pinched +pinches +pinching +pincushion +pincushions +pine +pineapple +pineapples +pined +pines +piney +pinfeather +pinfeathers +ping +pinged +pinging +pings +pinhead +pinheads +pinhole +pinholes +pinier +piniest +pining +pinion +pinioned +pinioning +pinions +pink +pinked +pinker +pinkest +pinkeye +pinkie +pinkies +pinking +pinkish +pinkness +pinko +pinkoes +pinkos +pinks +pinky +pinnacle +pinnacles +pinnate +pinned +pinning +pinochle +pinocle +pinon +pinones +pinons +pinpoint +pinpointed +pinpointing +pinpoints +pinprick +pinpricks +pins +pinsetter +pinsetters +pinstripe +pinstriped +pinstripes +pint +pinto +pintoes +pintos +pints +pinup +pinups +pinwheel +pinwheeled +pinwheeling +pinwheels +piny +pinyin +pinyon +pinyons +pioneer +pioneered +pioneering +pioneers +pious +piously +piousness +pipe +piped +pipeline +pipelines +piper +pipers +pipes +pipette +pipettes +piping +pipit +pipits +pipped +pippin +pipping +pippins +pips +pipsqueak +pipsqueaks +piquancy +piquant +piquantly +pique +piqued +piques +piquing +piracy +piranha +piranhas +pirate +pirated +pirates +piratical +piratically +pirating +pirogi +piroshki +pirouette +pirouetted +pirouettes +pirouetting +piscatorial +pismire +pismires +piss +pissed +pisses +pissing +pistachio +pistachios +pistil +pistillate +pistils +pistol +pistols +piston +pistons +pita +pitapat +pitapats +pitch +pitchblende +pitched +pitcher +pitchers +pitches +pitchfork +pitchforked +pitchforking +pitchforks +pitching +pitchman +pitchmen +piteous +piteously +piteousness +pitfall +pitfalls +pith +pithier +pithiest +pithily +pithiness +pithy +pitiable +pitiably +pitied +pities +pitiful +pitifully +pitiless +pitilessly +pitilessness +piton +pitons +pits +pittance +pittances +pitted +pitting +pituitaries +pituitary +pity +pitying +pivot +pivotal +pivoted +pivoting +pivots +pixel +pixels +pixie +pixies +pixy +pizazz +pizza +pizzas +pizzazz +pizzeria +pizzerias +pizzicati +pizzicato +placard +placarded +placarding +placards +placate +placated +placates +placating +placation +placatory +place +placebo +placeboes +placebos +placed +placeholder +placeholders +placekick +placekicked +placekicker +placekickers +placekicking +placekicks +placement +placements +placenta +placentae +placental +placentas +placer +placers +places +placid +placidity +placidly +placing +placket +plackets +plagiarism +plagiarisms +plagiarist +plagiarists +plagiarize +plagiarized +plagiarizer +plagiarizers +plagiarizes +plagiarizing +plagiary +plague +plagued +plagues +plaguing +plaid +plaids +plain +plainclothes +plainclothesman +plainclothesmen +plainer +plainest +plainly +plainness +plains +plainsman +plainsmen +plainsong +plainspoken +plaint +plaintiff +plaintiffs +plaintive +plaintively +plaints +plait +plaited +plaiting +plaits +plan +plane +planed +planeload +planeloads +planer +planers +planes +planet +planetaria +planetarium +planetariums +planetary +planets +plangency +plangent +planing +plank +planked +planking +planks +plankton +planned +planner +planners +planning +plans +plant +plantain +plantains +plantar +plantation +plantations +planted +planter +planters +planting +plantings +plantlike +plants +plaque +plaques +plash +plashed +plashes +plashing +plasma +plaster +plasterboard +plastered +plasterer +plasterers +plastering +plasters +plastic +plasticity +plasticize +plasticized +plasticizes +plasticizing +plastics +plat +plate +plateau +plateaued +plateauing +plateaus +plateaux +plated +plateful +platefuls +platelet +platelets +platen +platens +plates +platform +platformed +platforming +platforms +platies +plating +platinum +platitude +platitudes +platitudinous +platonic +platoon +platooned +platooning +platoons +plats +platted +platter +platters +platting +platy +platypi +platypus +platypuses +platys +plaudit +plaudits +plausibility +plausible +plausibly +play +playable +playact +playacted +playacting +playacts +playback +playbacks +playbill +playbills +playbook +playbooks +playboy +playboys +played +player +players +playfellow +playfellows +playful +playfully +playfulness +playgirl +playgirls +playgoer +playgoers +playground +playgrounds +playhouse +playhouses +playing +playmate +playmates +playoff +playoffs +playpen +playpens +playroom +playrooms +plays +plaything +playthings +playtime +playwright +playwrights +plaza +plazas +plea +plead +pleaded +pleader +pleaders +pleading +pleadings +pleads +pleas +pleasant +pleasanter +pleasantest +pleasantly +pleasantness +pleasantries +pleasantry +please +pleased +pleases +pleasing +pleasingly +pleasurable +pleasurably +pleasure +pleasured +pleasureful +pleasures +pleasuring +pleat +pleated +pleating +pleats +plebe +plebeian +plebeians +plebes +plebiscite +plebiscites +plectra +plectrum +plectrums +pled +pledge +pledged +pledges +pledging +plenaries +plenary +plenipotentiaries +plenipotentiary +plenitude +plenitudes +plenteous +plentiful +plentifully +plenty +pleonasm +pleonasms +plethora +pleura +pleurae +pleurisy +plexiglass +plexus +plexuses +pliability +pliable +pliancy +pliant +plied +pliers +plies +plight +plighted +plighting +plights +plinth +plinths +plod +plodded +plodder +plodders +plodding +plods +plop +plopped +plopping +plops +plot +plots +plotted +plotter +plotters +plotting +plough +ploughed +ploughing +ploughs +plover +plovers +plow +plowed +plowing +plowman +plowmen +plows +plowshare +plowshares +ploy +ploys +pluck +plucked +pluckier +pluckiest +pluckily +pluckiness +plucking +plucks +plucky +plug +plugged +plugging +plugs +plum +plumage +plumb +plumbed +plumber +plumbers +plumbing +plumbs +plume +plumed +plumes +plumier +plumiest +pluming +plummet +plummeted +plummeting +plummets +plump +plumped +plumper +plumpest +plumping +plumply +plumpness +plumps +plums +plumy +plunder +plundered +plunderer +plunderers +plundering +plunders +plunge +plunged +plunger +plungers +plunges +plunging +plunk +plunked +plunking +plunks +pluperfect +pluperfects +plural +pluralism +pluralist +pluralistic +pluralists +pluralities +plurality +pluralization +pluralize +pluralized +pluralizes +pluralizing +plurals +plus +pluses +plush +plusher +plushest +plushier +plushiest +plushly +plushness +plushy +plusses +plutocracies +plutocracy +plutocrat +plutocratic +plutocrats +plutonium +pluvial +plying +plywood +pneumatic +pneumatically +pneumonia +poach +poached +poacher +poachers +poaches +poaching +pock +pocked +pocket +pocketbook +pocketbooks +pocketed +pocketful +pocketfuls +pocketing +pocketknife +pocketknives +pockets +pocketsful +pockmark +pockmarked +pockmarking +pockmarks +pocks +podded +podding +podia +podiatrist +podiatrists +podiatry +podium +podiums +pods +poem +poems +poesy +poet +poetaster +poetasters +poetess +poetesses +poetic +poetical +poetically +poetry +poets +pogrom +pogroms +poignancy +poignant +poignantly +poinciana +poincianas +poinsettia +poinsettias +point +pointblank +pointed +pointedly +pointer +pointers +pointier +pointiest +pointillism +pointillist +pointillists +pointing +pointless +pointlessly +pointlessness +points +pointy +poise +poised +poises +poising +poison +poisoned +poisoner +poisoners +poisoning +poisonings +poisonous +poisonously +poisons +poke +poked +poker +pokers +pokes +pokey +pokeys +pokier +pokiest +poking +poky +polar +polarities +polarity +polarization +polarize +polarized +polarizes +polarizing +pole +polecat +polecats +poled +polemic +polemical +polemically +polemicist +polemicists +polemics +poles +polestar +polestars +police +policed +policeman +policemen +polices +policewoman +policewomen +policies +policing +policy +policyholder +policyholders +poling +polio +poliomyelitis +polish +polished +polisher +polishers +polishes +polishing +politburo +politburos +polite +politely +politeness +politer +politesse +politest +politic +political +politically +politician +politicians +politicization +politicize +politicized +politicizes +politicizing +politicking +politico +politicoes +politicos +politics +polities +polity +polka +polkaed +polkaing +polkas +poll +pollack +pollacks +polled +pollen +pollinate +pollinated +pollinates +pollinating +pollination +pollinator +pollinators +polling +polliwog +polliwogs +pollock +pollocks +polls +pollster +pollsters +pollutant +pollutants +pollute +polluted +polluter +polluters +pollutes +polluting +pollution +pollywog +pollywogs +polo +polonaise +polonaises +polonium +pols +poltergeist +poltergeists +poltroon +poltroons +polyandrous +polyandry +polyclinic +polyclinics +polyester +polyesters +polyethylene +polygamist +polygamists +polygamous +polygamy +polyglot +polyglots +polygon +polygonal +polygons +polygraph +polygraphed +polygraphing +polygraphs +polyhedra +polyhedral +polyhedron +polyhedrons +polymath +polymaths +polymer +polymeric +polymerization +polymerize +polymerized +polymerizes +polymerizing +polymers +polynomial +polynomials +polyp +polyphonic +polyphony +polypropylene +polyps +polystyrene +polysyllabic +polysyllable +polysyllables +polytechnic +polytechnics +polytheism +polytheist +polytheistic +polytheists +polyunsaturated +polyurethane +polyurethanes +polyvinyl +pomade +pomaded +pomades +pomading +pomander +pomanders +pomegranate +pomegranates +pommel +pommeled +pommeling +pommelled +pommelling +pommels +pomp +pompadour +pompadours +pompano +pompanos +pompom +pompoms +pompon +pompons +pomposity +pompous +pompously +pompousness +poncho +ponchos +pond +ponder +pondered +ponderer +ponderers +pondering +ponderous +ponderously +ponderousness +ponders +ponds +pone +pones +pongee +poniard +poniards +ponies +pontiff +pontiffs +pontifical +pontifically +pontificate +pontificated +pontificates +pontificating +pontoon +pontoons +pony +ponytail +ponytails +pooch +pooches +poodle +poodles +poof +poofs +pooh +poohed +poohing +poohs +pool +pooled +pooling +poolroom +poolrooms +pools +poop +pooped +pooping +poops +poor +poorboy +poorboys +poorer +poorest +poorhouse +poorhouses +poorly +poorness +popcorn +pope +popes +popgun +popguns +popinjay +popinjays +poplar +poplars +poplin +popover +popovers +poppa +poppas +popped +popper +poppers +poppies +popping +poppy +poppycock +pops +populace +populaces +popular +popularity +popularization +popularize +popularized +popularizes +popularizing +popularly +populate +populated +populates +populating +population +populations +populism +populist +populists +populous +populousness +porcelain +porch +porches +porcine +porcupine +porcupines +pore +pored +pores +porgies +porgy +poring +pork +porker +porkers +porkier +porkies +porkiest +porky +porn +porno +pornographer +pornographers +pornographic +pornographically +pornography +porosity +porous +porousness +porphyritic +porphyry +porpoise +porpoised +porpoises +porpoising +porridge +porringer +porringers +port +portability +portable +portables +portage +portaged +portages +portaging +portal +portals +portcullis +portcullises +ported +portend +portended +portending +portends +portent +portentous +portentously +portents +porter +porterhouse +porterhouses +porters +portfolio +portfolios +porthole +portholes +portico +porticoes +porticos +portiere +portieres +porting +portion +portioned +portioning +portions +portlier +portliest +portliness +portly +portmanteau +portmanteaus +portmanteaux +portrait +portraitist +portraitists +portraits +portraiture +portray +portrayal +portrayals +portrayed +portraying +portrays +ports +portulaca +pose +posed +poser +posers +poses +poseur +poseurs +posh +posher +poshest +posies +posing +posit +posited +positing +position +positioned +positioning +positions +positive +positively +positiveness +positives +positron +positrons +posits +posse +posses +possess +possessed +possesses +possessing +possession +possessions +possessive +possessively +possessiveness +possessives +possessor +possessors +possibilities +possibility +possible +possibles +possibly +possum +possums +post +postage +postal +postcard +postcards +postconsonantal +postdate +postdated +postdates +postdating +postdoctoral +posted +poster +posterior +posteriors +posterity +posters +postgraduate +postgraduates +posthaste +posthumous +posthumously +posthypnotic +postilion +postilions +postillion +postillions +postindustrial +posting +postings +postlude +postludes +postman +postmark +postmarked +postmarking +postmarks +postmaster +postmasters +postmen +postmenopausal +postmeridian +postmistress +postmistresses +postmodern +postmodernism +postmodernist +postmodernists +postmortem +postmortems +postnasal +postnatal +postoperative +postpaid +postpartum +postpone +postponed +postponement +postponements +postpones +postponing +postprandial +posts +postscript +postscripts +postseason +postseasons +postulate +postulated +postulates +postulating +postulation +postulations +posture +postured +postures +posturing +posturings +postwar +posy +potability +potable +potables +potash +potassium +potato +potatoes +potbellied +potbellies +potbelly +potboiler +potboilers +potency +potent +potentate +potentates +potential +potentialities +potentiality +potentially +potently +potful +potfuls +pothead +potheads +pother +potherb +potherbs +pothered +pothering +pothers +potholder +potholders +pothole +potholed +potholes +potholing +pothook +pothooks +potion +potions +potluck +potlucks +potpie +potpies +potpourri +potpourris +pots +potsherd +potsherds +potshot +potshots +pottage +potted +potter +pottered +potteries +pottering +potters +pottery +pottier +potties +pottiest +potting +potty +pouch +pouched +pouches +pouching +poulterer +poulterers +poultice +poulticed +poultices +poulticing +poultry +pounce +pounced +pounces +pouncing +pound +poundage +pounded +pounding +poundings +pounds +pour +poured +pouring +pours +pout +pouted +pouter +pouters +pouting +pouts +poverty +powder +powdered +powdering +powders +powdery +power +powerboat +powerboats +powered +powerful +powerfully +powerhouse +powerhouses +powering +powerless +powerlessly +powerlessness +powers +powwow +powwowed +powwowing +powwows +poxes +practicability +practicable +practicably +practical +practicalities +practicality +practically +practicals +practice +practiced +practices +practicing +practicum +practicums +practise +practised +practises +practising +practitioner +practitioners +praetor +praetorian +praetors +pragmatic +pragmatical +pragmatically +pragmatics +pragmatism +pragmatist +pragmatists +prairie +prairies +praise +praised +praises +praiseworthier +praiseworthiest +praiseworthiness +praiseworthy +praising +praline +pralines +pram +prams +prance +pranced +prancer +prancers +prances +prancing +prancingly +prank +pranks +prankster +pranksters +praseodymium +prate +prated +prater +praters +prates +pratfall +pratfalls +prating +prattle +prattled +prattler +prattlers +prattles +prattling +prawn +prawned +prawning +prawns +pray +prayed +prayer +prayerful +prayerfully +prayers +praying +prays +preach +preached +preacher +preachers +preaches +preachier +preachiest +preaching +preachment +preachy +preadolescence +preadolescences +preamble +preambles +prearrange +prearranged +prearrangement +prearranges +prearranging +preassigned +precancel +precanceled +precanceling +precancelled +precancelling +precancels +precancerous +precarious +precariously +precariousness +precaution +precautionary +precautions +precede +preceded +precedence +precedent +precedents +precedes +preceding +precept +preceptor +preceptors +precepts +precinct +precincts +preciosity +precious +preciously +preciousness +precipice +precipices +precipitant +precipitants +precipitate +precipitated +precipitately +precipitates +precipitating +precipitation +precipitations +precipitous +precipitously +precis +precise +precised +precisely +preciseness +preciser +precises +precisest +precising +precision +preclude +precluded +precludes +precluding +preclusion +precocious +precociously +precociousness +precocity +precognition +precognitive +precolonial +preconceive +preconceived +preconceives +preconceiving +preconception +preconceptions +precondition +preconditioned +preconditioning +preconditions +precook +precooked +precooking +precooks +precursor +precursors +precursory +predate +predated +predates +predating +predator +predators +predatory +predawn +predecease +predeceased +predeceases +predeceasing +predecessor +predecessors +predesignate +predesignated +predesignates +predesignating +predestination +predestine +predestined +predestines +predestining +predetermination +predetermine +predetermined +predeterminer +predeterminers +predetermines +predetermining +predicable +predicament +predicaments +predicate +predicated +predicates +predicating +predication +predicative +predict +predictability +predictable +predictably +predicted +predicting +prediction +predictions +predictive +predictor +predictors +predicts +predigest +predigested +predigesting +predigests +predilection +predilections +predispose +predisposed +predisposes +predisposing +predisposition +predispositions +predominance +predominant +predominantly +predominate +predominated +predominates +predominating +preemie +preemies +preeminence +preeminent +preeminently +preempt +preempted +preempting +preemption +preemptive +preempts +preen +preened +preening +preens +preexist +preexisted +preexistence +preexisting +preexists +prefab +prefabbed +prefabbing +prefabricate +prefabricated +prefabricates +prefabricating +prefabrication +prefabs +preface +prefaced +prefaces +prefacing +prefatory +prefect +prefects +prefecture +prefectures +prefer +preferable +preferably +preference +preferences +preferential +preferentially +preferment +preferred +preferring +prefers +prefigure +prefigured +prefigures +prefiguring +prefix +prefixed +prefixes +prefixing +preform +preformed +preforming +preforms +pregame +pregames +pregnancies +pregnancy +pregnant +preheat +preheated +preheating +preheats +prehensile +prehistoric +prehistorical +prehistorically +prehistory +prejudge +prejudged +prejudges +prejudging +prejudgment +prejudgments +prejudice +prejudiced +prejudices +prejudicial +prejudicing +prekindergarten +prekindergartens +prelacy +prelate +prelates +prelim +preliminaries +preliminary +prelims +preliterate +prelude +preludes +premarital +premature +prematurely +premed +premedical +premeditate +premeditated +premeditates +premeditating +premeditation +premeds +premenstrual +premier +premiere +premiered +premieres +premiering +premiers +premiership +premierships +premise +premised +premises +premising +premiss +premisses +premium +premiums +premix +premixed +premixes +premixing +premolar +premolars +premonition +premonitions +premonitory +prenatal +prenatally +prenuptial +preoccupation +preoccupations +preoccupied +preoccupies +preoccupy +preoccupying +preoperative +preordain +preordained +preordaining +preordains +prep +prepackage +prepackaged +prepackages +prepackaging +prepaid +preparation +preparations +preparatory +prepare +prepared +preparedness +prepares +preparing +prepay +prepaying +prepayment +prepayments +prepays +preponderance +preponderances +preponderant +preponderantly +preponderate +preponderated +preponderates +preponderating +preposition +prepositional +prepositionally +prepositions +prepossess +prepossessed +prepossesses +prepossessing +prepossession +prepossessions +preposterous +preposterously +prepped +preppie +preppier +preppies +preppiest +prepping +preppy +preps +prepubescence +prepubescent +prepubescents +prepuce +prepuces +prequel +prequels +prerecord +prerecorded +prerecording +prerecords +preregister +preregistered +preregistering +preregisters +preregistration +prerequisite +prerequisites +prerogative +prerogatives +presage +presaged +presages +presaging +presbyopia +presbyter +presbyteries +presbyters +presbytery +preschool +preschooler +preschoolers +preschools +prescience +prescient +presciently +prescribe +prescribed +prescribes +prescribing +prescript +prescription +prescriptions +prescriptive +prescriptively +prescripts +preseason +preseasons +presence +presences +present +presentable +presentably +presentation +presentations +presented +presenter +presenters +presentiment +presentiments +presenting +presently +presentment +presentments +presents +preservable +preservation +preservationist +preservationists +preservative +preservatives +preserve +preserved +preserver +preservers +preserves +preserving +preset +presets +presetting +preshrank +preshrink +preshrinking +preshrinks +preshrunk +preshrunken +preside +presided +presidencies +presidency +president +presidential +presidents +presides +presidia +presiding +presidium +presidiums +presort +presorted +presorting +presorts +press +pressed +presser +pressers +presses +pressing +pressingly +pressings +pressman +pressmen +pressure +pressured +pressures +pressuring +pressurization +pressurize +pressurized +pressurizer +pressurizers +pressurizes +pressurizing +prestidigitation +prestige +prestigious +presto +prestos +presumable +presumably +presume +presumed +presumes +presuming +presumption +presumptions +presumptive +presumptuous +presumptuously +presumptuousness +presuppose +presupposed +presupposes +presupposing +presupposition +presuppositions +pretax +preteen +preteens +pretence +pretences +pretend +pretended +pretender +pretenders +pretending +pretends +pretense +pretenses +pretension +pretensions +pretentious +pretentiously +pretentiousness +preterit +preterite +preterites +preterits +preterm +preternatural +preternaturally +pretest +pretested +pretesting +pretests +pretext +pretexts +pretrial +prettied +prettier +pretties +prettiest +prettified +prettifies +prettify +prettifying +prettily +prettiness +pretty +prettying +pretzel +pretzels +prevail +prevailed +prevailing +prevails +prevalence +prevalent +prevaricate +prevaricated +prevaricates +prevaricating +prevarication +prevarications +prevaricator +prevaricators +prevent +preventable +preventative +preventatives +prevented +preventible +preventing +prevention +preventive +preventives +prevents +preview +previewed +previewing +previews +previous +previously +prevision +previsions +prevue +prevues +prewar +prey +preyed +preying +preys +priapic +price +priced +priceless +prices +pricey +pricier +priciest +pricing +prick +pricked +pricker +prickers +pricking +prickle +prickled +prickles +pricklier +prickliest +prickliness +prickling +prickly +pricks +pricy +pride +prided +prideful +pridefully +prides +priding +pried +prier +priers +pries +priest +priestess +priestesses +priesthood +priesthoods +priestlier +priestliest +priestliness +priestly +priests +prig +priggish +priggishness +prigs +prim +primacy +primaeval +primal +primaries +primarily +primary +primate +primates +prime +primed +primer +primers +primes +primeval +priming +primitive +primitively +primitiveness +primitives +primly +primmer +primmest +primness +primogenitor +primogenitors +primogeniture +primordial +primordially +primp +primped +primping +primps +primrose +primroses +prince +princedom +princedoms +princelier +princeliest +princeliness +princely +princes +princess +princesses +principal +principalities +principality +principally +principals +principle +principled +principles +print +printable +printed +printer +printers +printing +printings +printout +printouts +prints +prior +prioress +prioresses +priories +priorities +prioritize +prioritized +prioritizes +prioritizing +priority +priors +priory +prise +prised +prises +prising +prism +prismatic +prisms +prison +prisoner +prisoners +prisons +prissier +prissiest +prissily +prissiness +prissy +pristine +prithee +privacy +private +privateer +privateers +privately +privater +privates +privatest +privation +privations +privatization +privatizations +privatize +privatized +privatizes +privatizing +privet +privets +privier +privies +priviest +privilege +privileged +privileges +privileging +privily +privy +prize +prized +prizefight +prizefighter +prizefighters +prizefighting +prizefights +prizes +prizewinner +prizewinners +prizewinning +prizing +proactive +probabilities +probability +probable +probables +probably +probate +probated +probates +probating +probation +probational +probationary +probationer +probationers +probe +probed +probes +probing +probity +problem +problematic +problematical +problematically +problems +proboscides +proboscis +proboscises +procaine +procedural +procedure +procedures +proceed +proceeded +proceeding +proceedings +proceeds +process +processed +processes +processing +procession +processional +processionals +processioned +processioning +processions +processor +processors +proclaim +proclaimed +proclaiming +proclaims +proclamation +proclamations +proclivities +proclivity +proconsul +proconsular +proconsuls +procrastinate +procrastinated +procrastinates +procrastinating +procrastination +procrastinator +procrastinators +procreate +procreated +procreates +procreating +procreation +procreative +proctor +proctored +proctoring +proctors +procurable +procurator +procurators +procure +procured +procurement +procurer +procurers +procures +procuring +prod +prodded +prodding +prodigal +prodigality +prodigals +prodigies +prodigious +prodigiously +prodigy +prods +produce +produced +producer +producers +produces +producible +producing +product +production +productions +productive +productively +productiveness +productivity +products +prof +profanation +profanations +profane +profaned +profanely +profaneness +profanes +profaning +profanities +profanity +profess +professed +professedly +professes +professing +profession +professional +professionalism +professionalize +professionalized +professionalizes +professionalizing +professionally +professionals +professions +professor +professorial +professorially +professors +professorship +professorships +proffer +proffered +proffering +proffers +proficiency +proficient +proficiently +proficients +profile +profiled +profiles +profiling +profit +profitability +profitable +profitably +profited +profiteer +profiteered +profiteering +profiteers +profiterole +profiteroles +profiting +profitless +profits +profligacy +profligate +profligately +profligates +profound +profounder +profoundest +profoundly +profoundness +profs +profundities +profundity +profuse +profusely +profuseness +profuser +profusest +profusion +profusions +progenitor +progenitors +progeny +progesterone +prognathous +prognoses +prognosis +prognostic +prognosticate +prognosticated +prognosticates +prognosticating +prognostication +prognostications +prognosticator +prognosticators +prognostics +program +programed +programer +programers +programing +programmable +programmables +programmatic +programme +programmed +programmer +programmers +programmes +programming +programs +progress +progressed +progresses +progressing +progression +progressions +progressive +progressively +progressiveness +progressives +prohibit +prohibited +prohibiting +prohibition +prohibitionist +prohibitionists +prohibitions +prohibitive +prohibitively +prohibitory +prohibits +project +projected +projectile +projectiles +projecting +projection +projectionist +projectionists +projections +projector +projectors +projects +prolapse +prolapsed +prolapses +prolapsing +proletarian +proletarians +proletariat +proliferate +proliferated +proliferates +proliferating +proliferation +prolific +prolifically +prolix +prolixity +prolixly +prolog +prologs +prologue +prologues +prolong +prolongation +prolongations +prolonged +prolonging +prolongs +prom +promenade +promenaded +promenades +promenading +promethium +prominence +prominent +prominently +promiscuity +promiscuous +promiscuously +promise +promised +promises +promising +promisingly +promissory +promo +promoed +promoing +promontories +promontory +promos +promote +promoted +promoter +promoters +promotes +promoting +promotion +promotional +promotions +prompt +prompted +prompter +prompters +promptest +prompting +promptings +promptitude +promptly +promptness +prompts +proms +promulgate +promulgated +promulgates +promulgating +promulgation +promulgator +promulgators +prone +proneness +proner +pronest +prong +pronged +pronghorn +pronghorns +prongs +pronominal +pronominals +pronoun +pronounce +pronounceable +pronounced +pronouncement +pronouncements +pronounces +pronouncing +pronouns +pronto +pronuclear +pronunciation +pronunciations +proof +proofed +proofing +proofread +proofreader +proofreaders +proofreading +proofreads +proofs +prop +propaganda +propagandist +propagandists +propagandize +propagandized +propagandizes +propagandizing +propagate +propagated +propagates +propagating +propagation +propagator +propagators +propane +propel +propellant +propellants +propelled +propellent +propellents +propeller +propellers +propelling +propels +propensities +propensity +proper +properer +properest +properly +propertied +properties +property +prophecies +prophecy +prophesied +prophesier +prophesiers +prophesies +prophesy +prophesying +prophet +prophetess +prophetesses +prophetic +prophetical +prophetically +prophets +prophylactic +prophylactics +prophylaxis +propinquity +propitiate +propitiated +propitiates +propitiating +propitiation +propitiatory +propitious +propitiously +proponent +proponents +proportion +proportional +proportionally +proportionate +proportionately +proportioned +proportioning +proportions +proposal +proposals +propose +proposed +proposer +proposers +proposes +proposing +proposition +propositional +propositioned +propositioning +propositions +propound +propounded +propounding +propounds +propped +propping +proprietaries +proprietary +proprieties +proprietor +proprietorial +proprietors +proprietorship +proprietress +proprietresses +propriety +props +propulsion +propulsive +prorate +prorated +prorates +prorating +prorogation +prorogue +prorogued +prorogues +proroguing +pros +prosaic +prosaically +proscenia +proscenium +prosceniums +prosciutto +proscribe +proscribed +proscribes +proscribing +proscription +proscriptions +prose +prosecute +prosecuted +prosecutes +prosecuting +prosecution +prosecutions +prosecutor +prosecutors +proselyte +proselyted +proselytes +proselyting +proselytism +proselytize +proselytized +proselytizer +proselytizers +proselytizes +proselytizing +prosier +prosiest +prosodies +prosody +prospect +prospected +prospecting +prospective +prospectively +prospector +prospectors +prospects +prospectus +prospectuses +prosper +prospered +prospering +prosperity +prosperous +prosperously +prospers +prostate +prostates +prostheses +prosthesis +prosthetic +prostitute +prostituted +prostitutes +prostituting +prostitution +prostrate +prostrated +prostrates +prostrating +prostration +prostrations +prosy +protactinium +protagonist +protagonists +protean +protect +protected +protecting +protection +protectionism +protectionist +protectionists +protections +protective +protectively +protectiveness +protector +protectorate +protectorates +protectors +protects +protege +proteges +protein +proteins +protest +protestation +protestations +protested +protester +protesters +protesting +protestor +protestors +protests +protocol +protocols +proton +protons +protoplasm +protoplasmic +prototype +prototypes +prototypical +protozoa +protozoan +protozoans +protozoic +protozoon +protract +protracted +protracting +protraction +protractor +protractors +protracts +protrude +protruded +protrudes +protruding +protrusile +protrusion +protrusions +protuberance +protuberances +protuberant +proud +prouder +proudest +proudly +provability +provable +prove +proved +proven +provenance +provender +provenience +proverb +proverbial +proverbially +proverbs +proves +provide +provided +providence +provident +providential +providentially +providently +provider +providers +provides +providing +province +provinces +provincial +provincialism +provincially +provincials +proving +provision +provisional +provisionally +provisioned +provisioning +provisions +proviso +provisoes +provisos +provocation +provocations +provocative +provocatively +provocativeness +provoke +provoked +provoker +provokers +provokes +provoking +provokingly +provolone +provost +provosts +prow +prowess +prowl +prowled +prowler +prowlers +prowling +prowls +prows +proxies +proximate +proximity +proxy +prude +prudence +prudent +prudential +prudentially +prudently +prudery +prudes +prudish +prudishly +prudishness +prune +pruned +pruner +pruners +prunes +pruning +prurience +prurient +pryer +pryers +prying +psalm +psalmist +psalmists +psalms +psalteries +psaltery +pseudo +pseudonym +pseudonymous +pseudonyms +pseudoscience +pseudosciences +pshaw +pshaws +psis +psittacosis +psoriasis +psst +psych +psyche +psyched +psychedelic +psychedelically +psychedelics +psyches +psychiatric +psychiatrist +psychiatrists +psychiatry +psychic +psychical +psychically +psychics +psyching +psycho +psychoactive +psychoanalysis +psychoanalyst +psychoanalysts +psychoanalytic +psychoanalytical +psychoanalyze +psychoanalyzed +psychoanalyzes +psychoanalyzing +psychobabble +psychodrama +psychodramas +psychogenic +psychological +psychologically +psychologies +psychologist +psychologists +psychology +psychoneurosis +psychopath +psychopathic +psychopaths +psychopathy +psychos +psychoses +psychosis +psychosomatic +psychotherapies +psychotherapist +psychotherapists +psychotherapy +psychotic +psychotically +psychotics +psychotropic +psychotropics +psychs +ptarmigan +ptarmigans +pterodactyl +pterodactyls +ptomaine +ptomaines +pubertal +puberty +pubes +pubescence +pubescent +pubic +pubis +public +publican +publicans +publication +publications +publicist +publicists +publicity +publicize +publicized +publicizes +publicizing +publicly +publish +published +publisher +publishers +publishes +publishing +pubs +puce +puck +pucker +puckered +puckering +puckers +puckish +puckishly +puckishness +pucks +pudding +puddings +puddle +puddled +puddles +puddling +pudenda +pudendum +pudgier +pudgiest +pudginess +pudgy +pueblo +pueblos +puerile +puerility +puerperal +puff +puffball +puffballs +puffed +puffer +puffers +puffier +puffiest +puffin +puffiness +puffing +puffins +puffs +puffy +pugilism +pugilist +pugilistic +pugilists +pugnacious +pugnaciously +pugnaciousness +pugnacity +pugs +puke +puked +pukes +puking +pukka +pulchritude +pulchritudinous +pule +puled +pules +puling +pull +pullback +pullbacks +pulled +puller +pullers +pullet +pullets +pulley +pulleys +pulling +pullout +pullouts +pullover +pullovers +pulls +pullup +pullups +pulmonary +pulp +pulped +pulpier +pulpiest +pulpiness +pulping +pulpit +pulpits +pulps +pulpwood +pulpy +pulsar +pulsars +pulsate +pulsated +pulsates +pulsating +pulsation +pulsations +pulse +pulsed +pulses +pulsing +pulverization +pulverize +pulverized +pulverizes +pulverizing +puma +pumas +pumice +pummel +pummeled +pummeling +pummelled +pummelling +pummels +pump +pumped +pumper +pumpernickel +pumpers +pumping +pumpkin +pumpkins +pumps +punch +punched +puncheon +puncheons +puncher +punchers +punches +punchier +punchiest +punching +punchy +punctilio +punctilious +punctiliously +punctiliousness +punctual +punctuality +punctually +punctuate +punctuated +punctuates +punctuating +punctuation +puncture +punctured +punctures +puncturing +pundit +punditry +pundits +pungency +pungent +pungently +punier +puniest +puniness +punish +punishable +punished +punishes +punishing +punishment +punishments +punitive +punitively +punk +punker +punkest +punkin +punkins +punks +punned +punning +puns +punster +punsters +punt +punted +punter +punters +punting +punts +puny +pupa +pupae +pupal +pupas +pupil +pupils +pupped +puppet +puppeteer +puppeteers +puppetry +puppets +puppies +pupping +puppy +pups +purblind +purchasable +purchase +purchased +purchaser +purchasers +purchases +purchasing +purdah +pure +purebred +purebreds +puree +pureed +pureeing +purees +purely +pureness +purer +purest +purgative +purgatives +purgatorial +purgatories +purgatory +purge +purged +purger +purgers +purges +purging +purification +purified +purifier +purifiers +purifies +purify +purifying +purine +purines +purism +purist +puristic +purists +puritan +puritanical +puritanically +puritanism +puritans +purity +purl +purled +purlieu +purlieus +purling +purloin +purloined +purloining +purloins +purls +purple +purpler +purples +purplest +purplish +purport +purported +purportedly +purporting +purports +purpose +purposed +purposeful +purposefully +purposefulness +purposeless +purposelessly +purposely +purposes +purposing +purr +purred +purring +purrs +purse +pursed +purser +pursers +purses +pursing +pursuance +pursuant +pursue +pursued +pursuer +pursuers +pursues +pursuing +pursuit +pursuits +purulence +purulent +purvey +purveyance +purveyed +purveying +purveyor +purveyors +purveys +purview +push +pushcart +pushcarts +pushed +pusher +pushers +pushes +pushier +pushiest +pushily +pushiness +pushing +pushover +pushovers +pushup +pushups +pushy +pusillanimity +pusillanimous +pusillanimously +puss +pusses +pussier +pussies +pussiest +pussy +pussycat +pussycats +pussyfoot +pussyfooted +pussyfooting +pussyfoots +pustular +pustule +pustules +putative +putdown +putdowns +putout +putouts +putrefaction +putrefactive +putrefied +putrefies +putrefy +putrefying +putrescence +putrescent +putrid +puts +putsch +putsches +putt +putted +puttee +puttees +putter +puttered +putterer +putterers +puttering +putters +puttied +putties +putting +putts +putty +puttying +puzzle +puzzled +puzzlement +puzzler +puzzlers +puzzles +puzzling +pygmies +pygmy +pyjamas +pylon +pylons +pylori +pyloric +pylorus +pyorrhea +pyorrhoea +pyramid +pyramidal +pyramided +pyramiding +pyramids +pyre +pyres +pyrimidine +pyrimidines +pyrite +pyrites +pyromania +pyromaniac +pyromaniacs +pyrotechnic +pyrotechnical +pyrotechnics +python +pythons +pyxes +quack +quacked +quackery +quacking +quacks +quad +quadrangle +quadrangles +quadrangular +quadrant +quadrants +quadraphonic +quadratic +quadratics +quadrennia +quadrennial +quadrennium +quadrenniums +quadriceps +quadricepses +quadrilateral +quadrilaterals +quadrille +quadrilles +quadrillion +quadrillions +quadriplegia +quadriplegic +quadriplegics +quadrivium +quadruped +quadrupedal +quadrupeds +quadruple +quadrupled +quadruples +quadruplet +quadruplets +quadruplicate +quadruplicated +quadruplicates +quadruplicating +quadruplication +quadrupling +quads +quaff +quaffed +quaffing +quaffs +quagmire +quagmires +quahaug +quahaugs +quahog +quahogs +quail +quailed +quailing +quails +quaint +quainter +quaintest +quaintly +quaintness +quake +quaked +quakes +quakier +quakiest +quaking +quaky +qualification +qualifications +qualified +qualifier +qualifiers +qualifies +qualify +qualifying +qualitative +qualitatively +qualities +quality +qualm +qualmish +qualms +quandaries +quandary +quanta +quantifiable +quantification +quantified +quantifier +quantifiers +quantifies +quantify +quantifying +quantitative +quantitatively +quantities +quantity +quantum +quarantine +quarantined +quarantines +quarantining +quark +quarks +quarrel +quarreled +quarreler +quarrelers +quarreling +quarrelled +quarrelling +quarrels +quarrelsome +quarrelsomeness +quarried +quarries +quarry +quarrying +quart +quarter +quarterback +quarterbacked +quarterbacking +quarterbacks +quarterdeck +quarterdecks +quartered +quarterfinal +quarterfinals +quartering +quarterlies +quarterly +quartermaster +quartermasters +quarters +quarterstaff +quarterstaffs +quarterstaves +quartet +quartets +quartette +quartettes +quarto +quartos +quarts +quartz +quasar +quasars +quash +quashed +quashes +quashing +quasi +quatrain +quatrains +quaver +quavered +quavering +quavers +quavery +quay +quays +queasier +queasiest +queasily +queasiness +queasy +queen +queened +queening +queenlier +queenliest +queenly +queens +queer +queered +queerer +queerest +queering +queerly +queerness +queers +quell +quelled +quelling +quells +quench +quenchable +quenched +quencher +quenchers +quenches +quenching +quenchless +queried +queries +querulous +querulously +querulousness +query +querying +quest +quested +questing +question +questionable +questionably +questioned +questioner +questioners +questioning +questioningly +questionings +questionnaire +questionnaires +questions +quests +queue +queued +queueing +queues +queuing +quibble +quibbled +quibbler +quibblers +quibbles +quibbling +quiche +quiches +quick +quicken +quickened +quickening +quickens +quicker +quickest +quickie +quickies +quicklime +quickly +quickness +quicksand +quicksands +quicksilver +quickstep +quicksteps +quid +quids +quiescence +quiescent +quiescently +quiet +quieted +quieter +quietest +quieting +quietly +quietness +quiets +quietude +quietus +quietuses +quill +quills +quilt +quilted +quilter +quilters +quilting +quilts +quince +quinces +quinine +quinsy +quint +quintessence +quintessences +quintessential +quintessentially +quintet +quintets +quintette +quintettes +quints +quintuple +quintupled +quintuples +quintuplet +quintuplets +quintupling +quip +quipped +quipping +quips +quipster +quipsters +quire +quires +quirk +quirked +quirkier +quirkiest +quirkiness +quirking +quirks +quirky +quirt +quirts +quisling +quislings +quit +quitclaim +quitclaims +quite +quits +quittance +quitted +quitter +quitters +quitting +quiver +quivered +quivering +quivers +quivery +quixotic +quixotically +quiz +quizzed +quizzer +quizzers +quizzes +quizzical +quizzically +quizzing +quoin +quoins +quoit +quoited +quoiting +quoits +quondam +quorum +quorums +quota +quotability +quotable +quotas +quotation +quotations +quote +quoted +quotes +quoth +quotidian +quotient +quotients +quoting +qwerty +rabbet +rabbeted +rabbeting +rabbets +rabbi +rabbinate +rabbinic +rabbinical +rabbis +rabbit +rabbits +rabble +rabbles +rabid +rabidly +rabidness +rabies +raccoon +raccoons +race +racecourse +racecourses +raced +racehorse +racehorses +raceme +racemes +racer +racers +races +racetrack +racetracks +raceway +raceways +racial +racialism +racialist +racialists +racially +racier +raciest +racily +raciness +racing +racism +racist +racists +rack +racked +racket +racketed +racketeer +racketeered +racketeering +racketeers +racketing +rackets +racking +racks +raconteur +raconteurs +racoon +racoons +racquet +racquetball +racquetballs +racquets +racy +radar +radars +radarscope +radarscopes +radial +radially +radials +radiance +radiant +radiantly +radiate +radiated +radiates +radiating +radiation +radiations +radiator +radiators +radical +radicalism +radicalization +radicalize +radicalized +radicalizes +radicalizing +radically +radicals +radicchio +radii +radio +radioactive +radioactively +radioactivity +radiocarbon +radioed +radiogram +radiograms +radiographer +radiographers +radiography +radioing +radioisotope +radioisotopes +radiologist +radiologists +radiology +radioman +radiomen +radiometer +radiometers +radiometric +radiometry +radiophone +radiophones +radios +radioscopy +radiosonde +radiosondes +radiotelegraph +radiotelegraphed +radiotelegraphing +radiotelegraphs +radiotelegraphy +radiotelephone +radiotelephones +radiotherapist +radiotherapists +radiotherapy +radish +radishes +radium +radius +radiuses +radon +rads +raffia +raffish +raffishly +raffishness +raffle +raffled +raffles +raffling +raft +rafted +rafter +rafters +rafting +rafts +raga +ragamuffin +ragamuffins +ragas +ragbag +rage +raged +rages +ragged +raggeder +raggedest +raggedier +raggediest +raggedly +raggedness +raggedy +ragging +raging +ragingly +raglan +raglans +ragout +ragouts +rags +ragtag +ragtime +ragweed +raid +raided +raider +raiders +raiding +raids +rail +railed +railing +railings +railleries +raillery +railroad +railroaded +railroader +railroaders +railroading +railroads +rails +railway +railways +raiment +rain +rainbow +rainbows +raincoat +raincoats +raindrop +raindrops +rained +rainfall +rainfalls +rainier +rainiest +raining +rainmaker +rainmakers +rainmaking +rainproof +rains +rainstorm +rainstorms +rainwater +rainy +raise +raised +raiser +raisers +raises +raisin +raising +raisins +raja +rajah +rajahs +rajas +rake +raked +rakes +raking +rakish +rakishly +rakishness +rallied +rallies +rally +rallying +ramble +rambled +rambler +ramblers +rambles +rambling +rambunctious +rambunctiously +rambunctiousness +ramekin +ramekins +ramequin +ramequins +ramie +ramification +ramifications +ramified +ramifies +ramify +ramifying +ramjet +ramjets +rammed +ramming +ramp +rampage +rampaged +rampages +rampaging +rampancy +rampant +rampantly +rampart +ramparts +ramps +ramrod +ramrodded +ramrodding +ramrods +rams +ramshackle +ranch +ranched +rancher +ranchers +ranches +ranching +rancid +rancidity +rancidness +rancor +rancorous +rancorously +rancour +rand +randier +randiest +randiness +random +randomization +randomize +randomized +randomizes +randomizing +randomly +randomness +randy +ranee +ranees +rang +range +ranged +ranger +rangers +ranges +rangier +rangiest +ranginess +ranging +rangy +rani +ranis +rank +ranked +ranker +rankest +ranking +rankings +rankle +rankled +rankles +rankling +rankly +rankness +ranks +ransack +ransacked +ransacking +ransacks +ransom +ransomed +ransomer +ransomers +ransoming +ransoms +rant +ranted +ranter +ranters +ranting +rants +rapacious +rapaciously +rapaciousness +rapacity +rape +raped +raper +rapers +rapes +rapeseed +rapid +rapider +rapidest +rapidity +rapidly +rapidness +rapids +rapier +rapiers +rapine +raping +rapist +rapists +rapped +rappel +rappelled +rappelling +rappels +rapper +rappers +rapping +rapport +rapports +rapprochement +rapprochements +raps +rapscallion +rapscallions +rapt +raptly +raptness +rapture +raptures +rapturous +rapturously +rare +rarebit +rarebits +rared +rarefaction +rarefied +rarefies +rarefy +rarefying +rarely +rareness +rarer +rares +rarest +raring +rarities +rarity +rascal +rascally +rascals +rash +rasher +rashers +rashes +rashest +rashly +rashness +rasp +raspberries +raspberry +rasped +raspier +raspiest +rasping +rasps +raspy +ratatouille +ratchet +ratcheted +ratcheting +ratchets +rate +rated +rater +raters +rates +rather +rathskeller +rathskellers +ratification +ratified +ratifier +ratifiers +ratifies +ratify +ratifying +rating +ratings +ratio +ratiocinate +ratiocinated +ratiocinates +ratiocinating +ratiocination +ration +rational +rationale +rationales +rationalism +rationalist +rationalistic +rationalists +rationality +rationalization +rationalizations +rationalize +rationalized +rationalizes +rationalizing +rationally +rationals +rationed +rationing +rations +ratios +ratlike +ratlin +ratline +ratlines +ratlins +rats +rattan +rattans +ratted +ratter +ratters +rattier +rattiest +ratting +rattle +rattlebrain +rattlebrained +rattlebrains +rattled +rattler +rattlers +rattles +rattlesnake +rattlesnakes +rattletrap +rattletraps +rattling +rattly +rattrap +rattraps +ratty +raucous +raucously +raucousness +raunchier +raunchiest +raunchily +raunchiness +raunchy +ravage +ravaged +ravager +ravagers +ravages +ravaging +rave +raved +ravel +raveled +raveling +ravelled +ravelling +ravels +raven +ravened +ravening +ravenous +ravenously +ravens +raves +ravine +ravines +raving +ravings +ravioli +raviolis +ravish +ravished +ravisher +ravishers +ravishes +ravishing +ravishingly +ravishment +rawboned +rawer +rawest +rawhide +rawness +rayon +rays +raze +razed +razes +razing +razor +razorback +razorbacks +razors +razz +razzed +razzes +razzing +razzmatazz +reabsorb +reabsorbed +reabsorbing +reabsorbs +reach +reachable +reached +reaches +reaching +reacquaint +reacquainted +reacquainting +reacquaints +reacquire +reacquired +reacquires +reacquiring +react +reactant +reactants +reacted +reacting +reaction +reactionaries +reactionary +reactions +reactivate +reactivated +reactivates +reactivating +reactivation +reactive +reactor +reactors +reacts +read +readabilities +readability +readable +readdress +readdressed +readdresses +readdressing +reader +readers +readership +readerships +readied +readier +readies +readiest +readily +readiness +reading +readings +readjust +readjusted +readjusting +readjustment +readjustments +readjusts +readmission +readmit +readmits +readmitted +readmitting +readopt +readopted +readopting +readopts +readout +readouts +reads +ready +readying +reaffirm +reaffirmation +reaffirmations +reaffirmed +reaffirming +reaffirms +reagent +reagents +real +realer +reales +realest +realign +realigned +realigning +realignment +realignments +realigns +realism +realist +realistic +realistically +realists +realities +reality +realizable +realization +realize +realized +realizes +realizing +reallocate +reallocated +reallocates +reallocating +reallocation +really +realm +realms +realness +realpolitik +realtor +realtors +realty +ream +reamed +reamer +reamers +reaming +reams +reanalyses +reanalysis +reanalyze +reanalyzed +reanalyzes +reanalyzing +reanimate +reanimated +reanimates +reanimating +reanimation +reap +reaped +reaper +reapers +reaping +reappear +reappearance +reappearances +reappeared +reappearing +reappears +reapplication +reapplications +reapplied +reapplies +reapply +reapplying +reappoint +reappointed +reappointing +reappointment +reappoints +reapportion +reapportioned +reapportioning +reapportionment +reapportions +reappraisal +reappraisals +reappraise +reappraised +reappraises +reappraising +reaps +rear +reared +rearguard +rearguards +rearing +rearm +rearmament +rearmed +rearming +rearmost +rearms +rearrange +rearranged +rearrangement +rearrangements +rearranges +rearranging +rearrest +rearrested +rearresting +rearrests +rears +rearward +rearwards +reascend +reascended +reascending +reascends +reason +reasonable +reasonableness +reasonably +reasoned +reasoner +reasoners +reasoning +reasons +reassemble +reassembled +reassembles +reassembling +reassembly +reassert +reasserted +reasserting +reassertion +reasserts +reassess +reassessed +reassesses +reassessing +reassessment +reassessments +reassign +reassigned +reassigning +reassignment +reassignments +reassigns +reassurance +reassurances +reassure +reassured +reassures +reassuring +reassuringly +reattach +reattached +reattaches +reattaching +reattachment +reattain +reattained +reattaining +reattains +reattempt +reattempted +reattempting +reattempts +reauthorize +reauthorized +reauthorizes +reauthorizing +reawaken +reawakened +reawakening +reawakens +rebate +rebated +rebates +rebating +rebel +rebelled +rebelling +rebellion +rebellions +rebellious +rebelliously +rebelliousness +rebels +rebid +rebidding +rebids +rebind +rebinding +rebinds +rebirth +rebirths +reboil +reboiled +reboiling +reboils +reboot +rebooted +rebooting +reboots +reborn +rebound +rebounded +rebounding +rebounds +rebroadcast +rebroadcasted +rebroadcasting +rebroadcasts +rebuff +rebuffed +rebuffing +rebuffs +rebuild +rebuilding +rebuilds +rebuilt +rebuke +rebuked +rebukes +rebuking +rebukingly +reburial +reburials +reburied +reburies +rebury +reburying +rebus +rebuses +rebut +rebuts +rebuttal +rebuttals +rebutted +rebutting +recalcitrance +recalcitrant +recalculate +recalculated +recalculates +recalculating +recalculation +recalculations +recall +recalled +recalling +recalls +recant +recantation +recantations +recanted +recanting +recants +recap +recapitalize +recapitalized +recapitalizes +recapitalizing +recapitulate +recapitulated +recapitulates +recapitulating +recapitulation +recapitulations +recapped +recapping +recaps +recapture +recaptured +recaptures +recapturing +recast +recasting +recastings +recasts +recede +receded +recedes +receding +receipt +receipted +receipting +receipts +receivable +receivables +receive +received +receiver +receivers +receivership +receives +receiving +recent +recenter +recentest +recently +recentness +receptacle +receptacles +reception +receptionist +receptionists +receptions +receptive +receptively +receptiveness +receptivity +receptor +receptors +recess +recessed +recesses +recessing +recession +recessional +recessionals +recessionary +recessions +recessive +recessives +recharge +rechargeable +recharged +recharges +recharging +recharter +rechartered +rechartering +recharters +recheck +rechecked +rechecking +rechecks +recherche +rechristen +rechristened +rechristening +rechristens +recidivism +recidivist +recidivists +recipe +recipes +recipient +recipients +reciprocal +reciprocally +reciprocals +reciprocate +reciprocated +reciprocates +reciprocating +reciprocation +reciprocity +recirculate +recirculated +recirculates +recirculating +recital +recitalist +recitalists +recitals +recitation +recitations +recitative +recitatives +recite +recited +reciter +reciters +recites +reciting +reckless +recklessly +recklessness +reckon +reckoned +reckoning +reckonings +reckons +reclaim +reclaimable +reclaimed +reclaiming +reclaims +reclamation +reclassification +reclassified +reclassifies +reclassify +reclassifying +recline +reclined +recliner +recliners +reclines +reclining +recluse +recluses +reclusive +recognition +recognizable +recognizably +recognizance +recognize +recognized +recognizes +recognizing +recoil +recoiled +recoiling +recoils +recollect +recollected +recollecting +recollection +recollections +recollects +recolonization +recolonize +recolonized +recolonizes +recolonizing +recolor +recolored +recoloring +recolors +recombine +recombined +recombines +recombining +recommence +recommenced +recommencement +recommences +recommencing +recommend +recommendable +recommendation +recommendations +recommended +recommending +recommends +recommission +recommissioned +recommissioning +recommissions +recommit +recommits +recommitted +recommitting +recompense +recompensed +recompenses +recompensing +recompose +recomposed +recomposes +recomposing +recompute +recomputed +recomputes +recomputing +reconcilable +reconcile +reconciled +reconciles +reconciliation +reconciliations +reconciling +recondite +recondition +reconditioned +reconditioning +reconditions +reconfirm +reconfirmation +reconfirmations +reconfirmed +reconfirming +reconfirms +reconnaissance +reconnaissances +reconnect +reconnected +reconnecting +reconnects +reconnoiter +reconnoitered +reconnoitering +reconnoiters +reconnoitre +reconnoitred +reconnoitres +reconnoitring +reconquer +reconquered +reconquering +reconquers +reconquest +reconsecrate +reconsecrated +reconsecrates +reconsecrating +reconsecration +reconsider +reconsideration +reconsidered +reconsidering +reconsiders +reconsign +reconsigned +reconsigning +reconsigns +reconstitute +reconstituted +reconstitutes +reconstituting +reconstitution +reconstruct +reconstructed +reconstructing +reconstruction +reconstructions +reconstructs +recontact +recontacted +recontacting +recontacts +recontaminate +recontaminated +recontaminates +recontaminating +reconvene +reconvened +reconvenes +reconvening +reconvert +reconverted +reconverting +reconverts +recook +recooked +recooking +recooks +recopied +recopies +recopy +recopying +record +recorded +recorder +recorders +recording +recordings +records +recount +recounted +recounting +recounts +recoup +recouped +recouping +recoups +recourse +recover +recoverable +recovered +recoveries +recovering +recovers +recovery +recreant +recreants +recreate +recreated +recreates +recreating +recreation +recreational +recreations +recriminate +recriminated +recriminates +recriminating +recrimination +recriminations +recriminatory +recross +recrossed +recrosses +recrossing +recrudesce +recrudesced +recrudescence +recrudescent +recrudesces +recrudescing +recruit +recruited +recruiter +recruiters +recruiting +recruitment +recruits +recrystallize +recrystallized +recrystallizes +recrystallizing +recta +rectal +rectally +rectangle +rectangles +rectangular +rectifiable +rectification +rectifications +rectified +rectifier +rectifiers +rectifies +rectify +rectifying +rectilinear +rectitude +recto +rector +rectories +rectors +rectory +rectos +rectum +rectums +recumbent +recuperate +recuperated +recuperates +recuperating +recuperation +recuperative +recur +recurred +recurrence +recurrences +recurrent +recurrently +recurring +recurs +recyclable +recyclables +recycle +recycled +recycles +recycling +redact +redacted +redacting +redaction +redactor +redactors +redacts +redbird +redbirds +redbreast +redbreasts +redcap +redcaps +redcoat +redcoats +redden +reddened +reddening +reddens +redder +reddest +reddish +redecorate +redecorated +redecorates +redecorating +redecoration +rededicate +rededicated +rededicates +rededicating +redeem +redeemable +redeemed +redeemer +redeemers +redeeming +redeems +redefine +redefined +redefines +redefining +redefinition +redeliver +redelivered +redelivering +redelivers +redemption +redemptive +redeploy +redeployed +redeploying +redeployment +redeploys +redeposit +redeposited +redepositing +redeposits +redesign +redesigned +redesigning +redesigns +redetermine +redetermined +redetermines +redetermining +redevelop +redeveloped +redeveloping +redevelopment +redevelopments +redevelops +redhead +redheaded +redheads +redial +redialed +redialing +redialled +redialling +redials +redid +redirect +redirected +redirecting +redirects +rediscover +rediscovered +rediscovering +rediscovers +rediscovery +redissolve +redissolved +redissolves +redissolving +redistribute +redistributed +redistributes +redistributing +redistribution +redistrict +redistricted +redistricting +redistricts +redivide +redivided +redivides +redividing +redlining +redneck +rednecks +redness +redo +redoes +redoing +redolence +redolent +redone +redouble +redoubled +redoubles +redoubling +redoubt +redoubtable +redoubtably +redoubts +redound +redounded +redounding +redounds +redraft +redrafted +redrafting +redrafts +redraw +redrawing +redrawn +redraws +redress +redressed +redresses +redressing +redrew +reds +redskin +redskins +reduce +reduced +reducer +reducers +reduces +reducible +reducing +reduction +reductions +reductive +redundancies +redundancy +redundant +redundantly +reduplicate +reduplicated +reduplicates +reduplicating +reduplication +redwood +redwoods +redye +redyed +redyeing +redyes +reecho +reechoed +reechoes +reechoing +reed +reedier +reediest +reediness +reedit +reedited +reediting +reedits +reeds +reeducate +reeducated +reeducates +reeducating +reeducation +reedy +reef +reefed +reefer +reefers +reefing +reefs +reek +reeked +reeking +reeks +reel +reelect +reelected +reelecting +reelection +reelections +reelects +reeled +reeling +reels +reembark +reembarked +reembarking +reembarks +reembodied +reembodies +reembody +reembodying +reemerge +reemerged +reemergence +reemerges +reemerging +reemphasize +reemphasized +reemphasizes +reemphasizing +reemploy +reemployed +reemploying +reemployment +reemploys +reenact +reenacted +reenacting +reenactment +reenactments +reenacts +reenforce +reenforced +reenforces +reenforcing +reengage +reengaged +reengages +reengaging +reenlist +reenlisted +reenlisting +reenlistment +reenlists +reenter +reentered +reentering +reenters +reentries +reentry +reequip +reequipped +reequipping +reequips +reestablish +reestablished +reestablishes +reestablishing +reestablishment +reevaluate +reevaluated +reevaluates +reevaluating +reevaluation +reevaluations +reeve +reeved +reeves +reeving +reexamination +reexaminations +reexamine +reexamined +reexamines +reexamining +reexplain +reexplained +reexplaining +reexplains +reexport +reexported +reexporting +reexports +reface +refaced +refaces +refacing +refashion +refashioned +refashioning +refashions +refasten +refastened +refastening +refastens +refection +refectories +refectory +refer +referable +referee +refereed +refereeing +referees +reference +referenced +references +referencing +referenda +referendum +referendums +referent +referents +referral +referrals +referred +referrer +referrers +referring +refers +reffed +reffing +refile +refiled +refiles +refiling +refill +refillable +refilled +refilling +refills +refinance +refinanced +refinances +refinancing +refine +refined +refinement +refinements +refiner +refineries +refiners +refinery +refines +refining +refinish +refinished +refinishes +refinishing +refit +refits +refitted +refitting +reflect +reflected +reflecting +reflection +reflections +reflective +reflectively +reflector +reflectors +reflects +reflex +reflexes +reflexion +reflexions +reflexive +reflexively +reflexives +refocus +refocused +refocuses +refocusing +refocussed +refocusses +refocussing +refold +refolded +refolding +refolds +reforest +reforestation +reforested +reforesting +reforests +reforge +reforged +reforges +reforging +reform +reformation +reformations +reformative +reformatories +reformatory +reformed +reformer +reformers +reforming +reforms +reformulate +reformulated +reformulates +reformulating +reformulation +reformulations +refortified +refortifies +refortify +refortifying +refract +refracted +refracting +refraction +refractive +refractories +refractory +refracts +refrain +refrained +refraining +refrains +refreeze +refreezes +refreezing +refresh +refreshed +refresher +refreshers +refreshes +refreshing +refreshingly +refreshment +refreshments +refrigerant +refrigerants +refrigerate +refrigerated +refrigerates +refrigerating +refrigeration +refrigerator +refrigerators +refroze +refrozen +refs +refuel +refueled +refueling +refuelled +refuelling +refuels +refuge +refugee +refugees +refuges +refulgence +refulgent +refund +refundable +refunded +refunding +refunds +refurbish +refurbished +refurbishes +refurbishing +refurbishment +refurbishments +refurnish +refurnished +refurnishes +refurnishing +refusal +refusals +refuse +refused +refuses +refusing +refutable +refutation +refutations +refute +refuted +refuter +refuters +refutes +refuting +regain +regained +regaining +regains +regal +regale +regaled +regalement +regales +regalia +regaling +regally +regard +regarded +regarding +regardless +regards +regather +regathered +regathering +regathers +regatta +regattas +regencies +regency +regeneracy +regenerate +regenerated +regenerates +regenerating +regeneration +regenerative +regent +regents +reggae +regicide +regicides +regime +regimen +regimens +regiment +regimental +regimentation +regimented +regimenting +regiments +regimes +region +regional +regionalism +regionalisms +regionally +regions +register +registered +registering +registers +registrant +registrants +registrar +registrars +registration +registrations +registries +registry +regnant +regrade +regraded +regrades +regrading +regress +regressed +regresses +regressing +regression +regressions +regressive +regret +regretful +regretfully +regrets +regrettable +regrettably +regretted +regretting +regrew +regrind +regrinding +regrinds +reground +regroup +regrouped +regrouping +regroups +regrow +regrowing +regrown +regrows +regrowth +regular +regularise +regularised +regularises +regularising +regularity +regularization +regularize +regularized +regularizes +regularizing +regularly +regulars +regulate +regulated +regulates +regulating +regulation +regulations +regulative +regulator +regulators +regulatory +regurgitate +regurgitated +regurgitates +regurgitating +regurgitation +rehab +rehabbed +rehabbing +rehabilitate +rehabilitated +rehabilitates +rehabilitating +rehabilitation +rehabilitative +rehabs +rehang +rehanged +rehanging +rehangs +rehash +rehashed +rehashes +rehashing +rehear +reheard +rehearing +rehearings +rehears +rehearsal +rehearsals +rehearse +rehearsed +rehearses +rehearsing +reheat +reheated +reheating +reheats +rehire +rehired +rehires +rehiring +rehouse +rehoused +rehouses +rehousing +rehung +reign +reigned +reigning +reignite +reignited +reignites +reigniting +reigns +reimbursable +reimburse +reimbursed +reimbursement +reimbursements +reimburses +reimbursing +reimpose +reimposed +reimposes +reimposing +rein +reincarnate +reincarnated +reincarnates +reincarnating +reincarnation +reincarnations +reincorporate +reincorporated +reincorporates +reincorporating +reincorporation +reindeer +reindeers +reined +reinfect +reinfected +reinfecting +reinfection +reinfections +reinfects +reinforce +reinforced +reinforcement +reinforcements +reinforces +reinforcing +reining +reinoculate +reinoculated +reinoculates +reinoculating +reins +reinsert +reinserted +reinserting +reinsertion +reinserts +reinspect +reinspected +reinspecting +reinspects +reinstate +reinstated +reinstatement +reinstates +reinstating +reintegrate +reintegrated +reintegrates +reintegrating +reintegration +reinterpret +reinterpretation +reinterpretations +reinterpreted +reinterpreting +reinterprets +reintroduce +reintroduced +reintroduces +reintroducing +reintroduction +reinvent +reinvented +reinventing +reinvention +reinventions +reinvents +reinvest +reinvested +reinvesting +reinvestment +reinvests +reinvigorate +reinvigorated +reinvigorates +reinvigorating +reissue +reissued +reissues +reissuing +reiterate +reiterated +reiterates +reiterating +reiteration +reiterations +reiterative +reject +rejected +rejecting +rejection +rejections +rejects +rejoice +rejoiced +rejoices +rejoicing +rejoicings +rejoin +rejoinder +rejoinders +rejoined +rejoining +rejoins +rejudge +rejudged +rejudges +rejudging +rejuvenate +rejuvenated +rejuvenates +rejuvenating +rejuvenation +rekindle +rekindled +rekindles +rekindling +relabel +relabeled +relabeling +relabelled +relabelling +relabels +relaid +relapse +relapsed +relapses +relapsing +relate +related +relatedness +relater +relaters +relates +relating +relation +relational +relations +relationship +relationships +relative +relatively +relatives +relativism +relativity +relaunch +relaunched +relaunches +relaunching +relax +relaxant +relaxants +relaxation +relaxations +relaxed +relaxer +relaxers +relaxes +relaxing +relay +relayed +relaying +relays +relearn +relearned +relearning +relearns +release +released +releases +releasing +relegate +relegated +relegates +relegating +relegation +relent +relented +relenting +relentless +relentlessly +relentlessness +relents +relevance +relevancy +relevant +relevantly +reliability +reliable +reliably +reliance +reliant +relic +relics +relied +relief +reliefs +relies +relieve +relieved +reliever +relievers +relieves +relieving +relight +relighted +relighting +relights +religion +religions +religious +religiously +religiousness +reline +relined +relines +relining +relinquish +relinquished +relinquishes +relinquishing +relinquishment +reliquaries +reliquary +relish +relished +relishes +relishing +relit +relivable +relive +relived +relives +reliving +reload +reloaded +reloading +reloads +relocate +relocated +relocates +relocating +relocation +reluctance +reluctant +reluctantly +rely +relying +remade +remain +remainder +remainders +remained +remaining +remains +remake +remakes +remaking +remand +remanded +remanding +remands +remap +remapped +remapping +remaps +remark +remarkable +remarkableness +remarkably +remarked +remarking +remarks +remarriage +remarriages +remarried +remarries +remarry +remarrying +rematch +rematches +remeasure +remeasured +remeasures +remeasuring +remediable +remedial +remedially +remediation +remedied +remedies +remedy +remedying +remelt +remelted +remelting +remelts +remember +remembered +remembering +remembers +remembrance +remembrances +remigrate +remigrated +remigrates +remigrating +remind +reminded +reminder +reminders +reminding +reminds +reminisce +reminisced +reminiscence +reminiscences +reminiscent +reminiscently +reminisces +reminiscing +remiss +remission +remissions +remissly +remissness +remit +remits +remittance +remittances +remitted +remitting +remix +remixed +remixes +remixing +remnant +remnants +remodel +remodeled +remodeling +remodelled +remodelling +remodels +remold +remolded +remolding +remolds +remonstrance +remonstrances +remonstrant +remonstrants +remonstrate +remonstrated +remonstrates +remonstrating +remorse +remorseful +remorsefully +remorseless +remorselessly +remorselessness +remote +remotely +remoteness +remoter +remotes +remotest +remount +remounted +remounting +remounts +removable +removal +removals +remove +removed +remover +removers +removes +removing +rems +remunerate +remunerated +remunerates +remunerating +remuneration +remunerations +remunerative +renaissance +renaissances +renal +rename +renamed +renames +renaming +renascence +renascences +renascent +rend +render +rendered +rendering +renderings +renders +rendezvous +rendezvoused +rendezvouses +rendezvousing +rending +rendition +renditions +rends +renegade +renegades +renege +reneged +reneger +renegers +reneges +reneging +renegotiable +renegotiate +renegotiated +renegotiates +renegotiating +renegotiation +renew +renewable +renewal +renewals +renewed +renewing +renews +rennet +rennin +renominate +renominated +renominates +renominating +renomination +renounce +renounced +renouncement +renounces +renouncing +renovate +renovated +renovates +renovating +renovation +renovations +renovator +renovators +renown +renowned +rent +rental +rentals +rented +renter +renters +renting +rents +renumber +renumbered +renumbering +renumbers +renunciation +renunciations +reoccupation +reoccupied +reoccupies +reoccupy +reoccupying +reoccur +reoccurred +reoccurring +reoccurs +reopen +reopened +reopening +reopens +reorder +reordered +reordering +reorders +reorganization +reorganizations +reorganize +reorganized +reorganizes +reorganizing +reorient +reorientation +reoriented +reorienting +reorients +repack +repackage +repackaged +repackages +repackaging +repacked +repacking +repacks +repaid +repaint +repainted +repainting +repaints +repair +repairable +repaired +repairer +repairers +repairing +repairman +repairmen +repairs +reparable +reparation +reparations +repartee +repast +repasts +repatriate +repatriated +repatriates +repatriating +repatriation +repave +repaved +repaves +repaving +repay +repayable +repaying +repayment +repayments +repays +repeal +repealed +repealing +repeals +repeat +repeatable +repeated +repeatedly +repeater +repeaters +repeating +repeats +repel +repellant +repellants +repelled +repellent +repellents +repelling +repels +repent +repentance +repentant +repentantly +repented +repenting +repents +repercussion +repercussions +repertoire +repertoires +repertories +repertory +repetition +repetitions +repetitious +repetitiously +repetitiousness +repetitive +repetitively +repetitiveness +rephotograph +rephotographed +rephotographing +rephotographs +rephrase +rephrased +rephrases +rephrasing +repine +repined +repines +repining +replace +replaceable +replaced +replacement +replacements +replaces +replacing +replant +replanted +replanting +replants +replay +replayed +replaying +replays +replenish +replenished +replenishes +replenishing +replenishment +replete +repleteness +repletion +replica +replicas +replicate +replicated +replicates +replicating +replication +replications +replied +replies +reply +replying +repopulate +repopulated +repopulates +repopulating +report +reportage +reported +reportedly +reporter +reporters +reporting +reportorial +reports +repose +reposed +reposeful +reposes +reposing +repositories +repository +repossess +repossessed +repossesses +repossessing +repossession +repossessions +reprehend +reprehended +reprehending +reprehends +reprehensibility +reprehensible +reprehensibly +reprehension +represent +representation +representational +representations +representative +representatives +represented +representing +represents +repress +repressed +represses +repressing +repression +repressions +repressive +repressively +reprice +repriced +reprices +repricing +reprieve +reprieved +reprieves +reprieving +reprimand +reprimanded +reprimanding +reprimands +reprint +reprinted +reprinting +reprints +reprisal +reprisals +reprise +reprised +reprises +reprising +reproach +reproachable +reproached +reproaches +reproachful +reproachfully +reproaching +reprobate +reprobates +reprocess +reprocessed +reprocesses +reprocessing +reproduce +reproduced +reproducer +reproducers +reproduces +reproducible +reproducing +reproduction +reproductions +reproductive +reprogram +reprogramed +reprograming +reprogrammed +reprogramming +reprograms +reproof +reproofs +reprove +reproved +reproves +reproving +reprovingly +reps +reptile +reptiles +reptilian +reptilians +republic +republican +republicanism +republicans +republication +republications +republics +republish +republished +republishes +republishing +repudiate +repudiated +repudiates +repudiating +repudiation +repudiations +repudiator +repudiators +repugnance +repugnant +repulse +repulsed +repulses +repulsing +repulsion +repulsive +repulsively +repulsiveness +repurchase +repurchased +repurchases +repurchasing +reputability +reputable +reputably +reputation +reputations +repute +reputed +reputedly +reputes +reputing +request +requested +requesting +requests +requiem +requiems +require +required +requirement +requirements +requires +requiring +requisite +requisites +requisition +requisitioned +requisitioning +requisitions +requital +requite +requited +requiter +requiters +requites +requiting +reran +reread +rereading +rereads +rerecord +rerecorded +rerecording +rerecords +reroute +rerouted +reroutes +rerouting +rerun +rerunning +reruns +resalable +resale +resales +reschedule +rescheduled +reschedules +rescheduling +rescind +rescinded +rescinding +rescinds +rescission +rescue +rescued +rescuer +rescuers +rescues +rescuing +reseal +resealable +resealed +resealing +reseals +research +researched +researcher +researchers +researches +researching +resection +resections +reseed +reseeded +reseeding +reseeds +resell +reselling +resells +resemblance +resemblances +resemble +resembled +resembles +resembling +resent +resented +resentful +resentfully +resentfulness +resenting +resentment +resentments +resents +reserpine +reservation +reservations +reserve +reserved +reservedly +reservedness +reserves +reserving +reservist +reservists +reservoir +reservoirs +reset +resets +resetting +resettle +resettled +resettlement +resettles +resettling +resew +resewed +resewing +resewn +resews +reshape +reshaped +reshapes +reshaping +resharpen +resharpened +resharpening +resharpens +reship +reshipment +reshipped +reshipping +reships +reshuffle +reshuffled +reshuffles +reshuffling +reside +resided +residence +residences +residencies +residency +resident +residential +residents +resides +residing +residual +residuals +residue +residues +residuum +resign +resignation +resignations +resigned +resignedly +resigning +resigns +resilience +resiliency +resilient +resiliently +resin +resinous +resins +resist +resistance +resistances +resistant +resisted +resister +resisters +resistible +resisting +resistless +resistor +resistors +resists +resold +resole +resoled +resoles +resoling +resolute +resolutely +resoluteness +resolution +resolutions +resolvable +resolve +resolved +resolves +resolving +resonance +resonances +resonant +resonantly +resonate +resonated +resonates +resonating +resonator +resonators +resorption +resort +resorted +resorting +resorts +resound +resounded +resounding +resoundingly +resounds +resource +resourced +resourceful +resourcefully +resourcefulness +resources +resourcing +resow +resowed +resowing +resown +resows +respect +respectability +respectable +respectably +respected +respecter +respecters +respectful +respectfully +respectfulness +respecting +respective +respectively +respects +respell +respelled +respelling +respells +respelt +respiration +respirator +respirators +respiratory +respire +respired +respires +respiring +respite +respites +resplendence +resplendent +resplendently +respond +responded +respondent +respondents +responding +responds +response +responses +responsibilities +responsibility +responsible +responsibly +responsive +responsively +responsiveness +respray +resprayed +respraying +resprays +rest +restaff +restaffed +restaffing +restaffs +restart +restarted +restarting +restarts +restate +restated +restatement +restatements +restates +restating +restaurant +restauranteur +restauranteurs +restaurants +restaurateur +restaurateurs +rested +restful +restfuller +restfullest +restfully +restfulness +resting +restitch +restitched +restitches +restitching +restitution +restive +restively +restiveness +restless +restlessly +restlessness +restock +restocked +restocking +restocks +restoration +restorations +restorative +restoratives +restore +restored +restorer +restorers +restores +restoring +restrain +restrained +restrainer +restrainers +restraining +restrains +restraint +restraints +restrengthen +restrengthened +restrengthening +restrengthens +restrict +restricted +restricting +restriction +restrictions +restrictive +restrictively +restrictiveness +restricts +restring +restringing +restrings +restroom +restrooms +restructure +restructured +restructures +restructuring +restructurings +restrung +rests +restudied +restudies +restudy +restudying +restyle +restyled +restyles +restyling +resubmit +resubmits +resubmitted +resubmitting +resubscribe +resubscribed +resubscribes +resubscribing +result +resultant +resultants +resulted +resulting +results +resume +resumed +resumes +resuming +resumption +resumptions +resupplied +resupplies +resupply +resupplying +resurface +resurfaced +resurfaces +resurfacing +resurgence +resurgences +resurgent +resurrect +resurrected +resurrecting +resurrection +resurrections +resurrects +resurvey +resurveyed +resurveying +resurveys +resuscitate +resuscitated +resuscitates +resuscitating +resuscitation +resuscitator +resuscitators +retail +retailed +retailer +retailers +retailing +retails +retain +retained +retainer +retainers +retaining +retains +retake +retaken +retakes +retaking +retaliate +retaliated +retaliates +retaliating +retaliation +retaliations +retaliative +retaliatory +retard +retardant +retardants +retardation +retarded +retarder +retarders +retarding +retards +retaught +retch +retched +retches +retching +reteach +reteaches +reteaching +retell +retelling +retells +retention +retentive +retentively +retentiveness +retest +retested +retesting +retests +rethink +rethinking +rethinks +rethought +reticence +reticent +reticently +reticulation +reticulations +retie +retied +reties +retina +retinae +retinal +retinas +retinue +retinues +retire +retired +retiree +retirees +retirement +retirements +retires +retiring +retold +retook +retool +retooled +retooling +retools +retort +retorted +retorting +retorts +retouch +retouched +retouches +retouching +retrace +retraced +retraces +retracing +retract +retractable +retracted +retractile +retracting +retraction +retractions +retracts +retrain +retrained +retraining +retrains +retread +retreaded +retreading +retreads +retreat +retreated +retreating +retreats +retrench +retrenched +retrenches +retrenching +retrenchment +retrenchments +retrial +retrials +retribution +retributions +retributive +retried +retries +retrievable +retrieval +retrievals +retrieve +retrieved +retriever +retrievers +retrieves +retrieving +retro +retroactive +retroactively +retrod +retrodden +retrofire +retrofired +retrofires +retrofiring +retrofit +retrofits +retrofitted +retrofitting +retrograde +retrograded +retrogrades +retrograding +retrogress +retrogressed +retrogresses +retrogressing +retrogression +retrogressive +retrorocket +retrorockets +retros +retrospect +retrospected +retrospecting +retrospection +retrospective +retrospectively +retrospectives +retrospects +retrovirus +retroviruses +retry +retrying +retsina +return +returnable +returnables +returned +returnee +returnees +returner +returners +returning +returns +retying +retype +retyped +retypes +retyping +reunification +reunified +reunifies +reunify +reunifying +reunion +reunions +reunite +reunited +reunites +reuniting +reupholster +reupholstered +reupholstering +reupholsters +reusable +reuse +reused +reuses +reusing +revaluation +revaluations +revalue +revalued +revalues +revaluing +revamp +revamped +revamping +revampings +revamps +reveal +revealed +revealing +revealingly +reveals +reveille +revel +revelation +revelations +reveled +reveler +revelers +reveling +revelled +reveller +revellers +revelling +revelries +revelry +revels +revenge +revenged +revengeful +revengefully +revenges +revenging +revenue +revenuer +revenuers +revenues +reverberate +reverberated +reverberates +reverberating +reverberation +reverberations +revere +revered +reverence +reverenced +reverences +reverencing +reverend +reverends +reverent +reverential +reverentially +reverently +reveres +reverie +reveries +revering +revers +reversal +reversals +reverse +reversed +reversely +reverses +reversible +reversibly +reversing +reversion +revert +reverted +revertible +reverting +reverts +revery +revetment +revetments +review +reviewed +reviewer +reviewers +reviewing +reviews +revile +reviled +revilement +reviler +revilers +reviles +reviling +revise +revised +reviser +revisers +revises +revising +revision +revisionism +revisionist +revisionists +revisions +revisit +revisited +revisiting +revisits +revitalization +revitalize +revitalized +revitalizes +revitalizing +revival +revivalism +revivalist +revivalists +revivals +revive +revived +revives +revivification +revivified +revivifies +revivify +revivifying +reviving +revocable +revocation +revocations +revokable +revoke +revoked +revokes +revoking +revolt +revolted +revolting +revoltingly +revolts +revolution +revolutionaries +revolutionary +revolutionise +revolutionised +revolutionises +revolutionising +revolutionist +revolutionists +revolutionize +revolutionized +revolutionizes +revolutionizing +revolutions +revolvable +revolve +revolved +revolver +revolvers +revolves +revolving +revs +revue +revues +revulsion +revved +revving +reward +rewarded +rewarding +rewards +rewarm +rewarmed +rewarming +rewarms +rewash +rewashed +rewashes +rewashing +reweave +reweaved +reweaves +reweaving +rewed +rewedded +rewedding +reweds +reweigh +reweighed +reweighing +reweighs +rewind +rewinding +rewinds +rewire +rewired +rewires +rewiring +reword +reworded +rewording +rewords +rework +reworked +reworking +reworks +rewound +rewove +rewoven +rewrite +rewrites +rewriting +rewritten +rewrote +rezone +rezoned +rezones +rezoning +rhapsodic +rhapsodical +rhapsodies +rhapsodize +rhapsodized +rhapsodizes +rhapsodizing +rhapsody +rhea +rheas +rhenium +rheostat +rheostats +rhesus +rhesuses +rhetoric +rhetorical +rhetorically +rhetorician +rhetoricians +rheum +rheumatic +rheumatically +rheumatics +rheumatism +rheumatoid +rheumier +rheumiest +rheumy +rhinestone +rhinestones +rhinitis +rhino +rhinoceri +rhinoceros +rhinoceroses +rhinos +rhizome +rhizomes +rhodium +rhododendron +rhododendrons +rhombi +rhomboid +rhomboidal +rhomboids +rhombus +rhombuses +rhos +rhubarb +rhubarbs +rhyme +rhymed +rhymer +rhymers +rhymes +rhymester +rhymesters +rhyming +rhythm +rhythmic +rhythmical +rhythmically +rhythms +rial +rials +ribald +ribaldry +ribbed +ribber +ribbers +ribbing +ribbon +ribbons +riboflavin +ribs +rice +riced +ricer +ricers +rices +rich +richer +riches +richest +richly +richness +ricing +rick +ricked +ricketier +ricketiest +rickets +rickety +ricking +rickrack +ricks +ricksha +rickshas +rickshaw +rickshaws +ricochet +ricocheted +ricocheting +ricochets +ricochetted +ricochetting +ricotta +riddance +ridded +ridden +ridding +riddle +riddled +riddles +riddling +ride +rider +riderless +riders +ridership +rides +ridge +ridged +ridgepole +ridgepoles +ridges +ridgier +ridgiest +ridging +ridgy +ridicule +ridiculed +ridicules +ridiculing +ridiculous +ridiculously +ridiculousness +riding +rids +rife +rifer +rifest +riff +riffed +riffing +riffle +riffled +riffles +riffling +riffraff +riffs +rifle +rifled +rifleman +riflemen +rifler +riflers +rifles +rifling +rift +rifted +rifting +rifts +rigamarole +rigamaroles +rigatoni +rigged +rigger +riggers +rigging +right +righted +righteous +righteously +righteousness +righter +rightest +rightful +rightfully +rightfulness +righting +rightism +rightist +rightists +rightly +rightmost +rightness +rights +rightsize +rightsized +rightsizes +rightsizing +rightward +rightwards +rigid +rigidity +rigidly +rigidness +rigmarole +rigmaroles +rigor +rigorous +rigorously +rigorousness +rigors +rigour +rigours +rigs +rile +riled +riles +riling +rill +rills +rime +rimed +rimes +riming +rimless +rimmed +rimming +rims +rind +rinds +ring +ringed +ringer +ringers +ringgit +ringgits +ringing +ringleader +ringleaders +ringlet +ringlets +ringlike +ringmaster +ringmasters +rings +ringside +ringworm +rink +rinks +rinse +rinsed +rinses +rinsing +riot +rioted +rioter +rioters +rioting +riotous +riotously +riots +riparian +ripcord +ripcords +ripe +ripely +ripen +ripened +ripeness +ripening +ripens +riper +ripest +ripoff +ripoffs +ripost +riposte +riposted +ripostes +riposting +riposts +ripped +ripper +rippers +ripping +ripple +rippled +ripples +rippling +ripply +rips +ripsaw +ripsaws +riptide +riptides +rise +risen +riser +risers +rises +risibility +risible +rising +risings +risk +risked +riskier +riskiest +riskily +riskiness +risking +risks +risky +risotto +risottos +risque +rite +rites +ritual +ritualism +ritualistic +ritualistically +ritually +rituals +ritzier +ritziest +ritzy +rival +rivaled +rivaling +rivalled +rivalling +rivalries +rivalry +rivals +rive +rived +riven +river +riverbank +riverbanks +riverbed +riverbeds +riverboat +riverboats +rivers +riverside +riversides +rives +rivet +riveted +riveter +riveters +riveting +rivets +rivetted +rivetting +riving +rivulet +rivulets +riyal +riyals +roach +roaches +road +roadbed +roadbeds +roadblock +roadblocked +roadblocking +roadblocks +roadhouse +roadhouses +roadie +roadies +roadkill +roadrunner +roadrunners +roads +roadshow +roadshows +roadside +roadsides +roadster +roadsters +roadway +roadways +roadwork +roadworthy +roam +roamed +roamer +roamers +roaming +roams +roan +roans +roar +roared +roarer +roarers +roaring +roars +roast +roasted +roaster +roasters +roasting +roastings +roasts +robbed +robber +robberies +robbers +robbery +robbing +robe +robed +robes +robin +robing +robins +robot +robotic +robotics +robotize +robotized +robotizes +robotizing +robots +robs +robust +robuster +robustest +robustly +robustness +rock +rockabilly +rockbound +rocked +rocker +rockers +rocket +rocketed +rocketing +rocketry +rockets +rockfall +rockfalls +rockier +rockiest +rockiness +rocking +rocks +rocky +rococo +rode +rodent +rodents +rodeo +rodeos +rods +roebuck +roebucks +roentgen +roentgens +roes +roger +rogered +rogering +rogers +rogue +roguery +rogues +roguish +roguishly +roguishness +roil +roiled +roiling +roils +roister +roistered +roisterer +roisterers +roistering +roisters +role +roles +roll +rollback +rollbacks +rolled +roller +rollers +rollerskating +rollick +rollicked +rollicking +rollicks +rolling +rollover +rollovers +rolls +romaine +roman +romance +romanced +romancer +romancers +romances +romancing +romantic +romantically +romanticism +romanticist +romanticists +romanticize +romanticized +romanticizes +romanticizing +romantics +romeo +romeos +romp +romped +romper +rompers +romping +romps +rondo +rondos +rood +roods +roof +roofed +roofer +roofers +roofing +roofless +roofs +rooftop +rooftops +rook +rooked +rookeries +rookery +rookie +rookies +rooking +rooks +room +roomed +roomer +roomers +roomette +roomettes +roomful +roomfuls +roomier +roomiest +roominess +rooming +roommate +roommates +rooms +roomy +roost +roosted +rooster +roosters +roosting +roosts +root +rooted +rooter +rooters +rooting +rootless +rootlet +rootlets +roots +rope +roped +roper +ropers +ropes +ropier +ropiest +roping +ropy +rosaries +rosary +rose +roseate +rosebud +rosebuds +rosebush +rosebushes +rosemary +roses +rosette +rosettes +rosewater +rosewood +rosewoods +rosier +rosiest +rosily +rosin +rosined +rosiness +rosining +rosins +roster +rosters +rostra +rostrum +rostrums +rosy +rotaries +rotary +rotate +rotated +rotates +rotating +rotation +rotations +rotatory +rote +rotgut +rotisserie +rotisseries +rotogravure +rotogravures +rotor +rotors +rototiller +rototillers +rots +rotted +rotten +rottener +rottenest +rottenly +rottenness +rotting +rotund +rotunda +rotundas +rotundity +rotundness +rouble +roubles +roue +roues +rouge +rouged +rouges +rough +roughage +roughed +roughen +roughened +roughening +roughens +rougher +roughest +roughhouse +roughhoused +roughhouses +roughhousing +roughing +roughly +roughneck +roughnecked +roughnecking +roughnecks +roughness +roughs +roughshod +rouging +roulette +round +roundabout +roundabouts +rounded +roundelay +roundelays +rounder +roundest +roundhouse +roundhouses +rounding +roundish +roundly +roundness +rounds +roundtable +roundtables +roundup +roundups +roundworm +roundworms +rouse +roused +rouses +rousing +roust +roustabout +roustabouts +rousted +rousting +rousts +rout +route +routed +router +routers +routes +routine +routinely +routines +routing +routinize +routinized +routinizes +routinizing +routs +rove +roved +rover +rovers +roves +roving +rowboat +rowboats +rowdier +rowdies +rowdiest +rowdily +rowdiness +rowdy +rowdyism +rowed +rowel +roweled +roweling +rowelled +rowelling +rowels +rower +rowers +rowing +rows +royal +royalist +royalists +royally +royals +royalties +royalty +rubati +rubato +rubatos +rubbed +rubber +rubberier +rubberiest +rubberize +rubberized +rubberizes +rubberizing +rubberneck +rubbernecked +rubbernecker +rubberneckers +rubbernecking +rubbernecks +rubbers +rubbery +rubbing +rubbish +rubbishy +rubble +rubdown +rubdowns +rube +rubella +rubes +rubicund +rubidium +rubier +rubies +rubiest +ruble +rubles +rubric +rubrics +rubs +ruby +rucksack +rucksacks +ruckus +ruckuses +rudder +rudderless +rudders +ruddier +ruddiest +ruddiness +ruddy +rude +rudely +rudeness +ruder +rudest +rudiment +rudimentary +rudiments +rued +rueful +ruefully +ruefulness +rueing +rues +ruff +ruffed +ruffian +ruffianly +ruffians +ruffing +ruffle +ruffled +ruffles +ruffling +ruffly +ruffs +rugby +rugged +ruggeder +ruggedest +ruggedly +ruggedness +rugs +ruin +ruination +ruined +ruing +ruining +ruinous +ruinously +ruins +rule +ruled +ruler +rulers +rules +ruling +rulings +rumba +rumbaed +rumbaing +rumbas +rumble +rumbled +rumbles +rumbling +rumblings +ruminant +ruminants +ruminate +ruminated +ruminates +ruminating +rumination +ruminations +ruminative +rummage +rummaged +rummages +rummaging +rummer +rummest +rummy +rumor +rumored +rumoring +rumormonger +rumormongers +rumors +rumour +rumoured +rumouring +rumours +rump +rumple +rumpled +rumples +rumpling +rumply +rumps +rumpus +rumpuses +rums +runabout +runabouts +runaround +runarounds +runaway +runaways +rundown +rundowns +rune +runes +rung +rungs +runic +runlet +runlets +runnel +runnels +runner +runners +runnier +runniest +running +runny +runoff +runoffs +runs +runt +runtier +runtiest +runts +runty +runway +runways +rupee +rupees +rupiah +rupiahs +rupture +ruptured +ruptures +rupturing +rural +ruse +ruses +rush +rushed +rusher +rushers +rushes +rushing +rushy +rusk +rusks +russet +russets +rust +rusted +rustic +rustically +rusticate +rusticated +rusticates +rusticating +rustication +rusticity +rustics +rustier +rustiest +rustiness +rusting +rustle +rustled +rustler +rustlers +rustles +rustling +rustproof +rustproofed +rustproofing +rustproofs +rusts +rusty +rutabaga +rutabagas +ruthenium +rutherfordium +ruthless +ruthlessly +ruthlessness +ruts +rutted +ruttier +ruttiest +rutting +rutty +sabbath +sabbaths +sabbatical +sabbaticals +saber +sabers +sable +sables +sabot +sabotage +sabotaged +sabotages +sabotaging +saboteur +saboteurs +sabots +sabra +sabras +sabre +sabres +saccharin +saccharine +sacerdotal +sachem +sachems +sachet +sachets +sack +sackcloth +sacked +sacker +sackers +sackful +sackfuls +sacking +sacks +sacra +sacrament +sacramental +sacraments +sacred +sacredly +sacredness +sacrifice +sacrificed +sacrifices +sacrificial +sacrificially +sacrificing +sacrilege +sacrileges +sacrilegious +sacrilegiously +sacristan +sacristans +sacristies +sacristy +sacroiliac +sacroiliacs +sacrosanct +sacrosanctness +sacrum +sacs +sadden +saddened +saddening +saddens +sadder +saddest +saddle +saddlebag +saddlebags +saddled +saddles +saddling +sadism +sadist +sadistic +sadistically +sadists +sadly +sadness +sadomasochism +sadomasochist +sadomasochistic +sadomasochists +safari +safaried +safariing +safaris +safe +safeguard +safeguarded +safeguarding +safeguards +safekeeping +safely +safeness +safer +safes +safest +safeties +safety +safflower +safflowers +saffron +saffrons +saga +sagacious +sagaciously +sagacity +sagas +sage +sagebrush +sagely +sager +sages +sagest +sagged +saggier +saggiest +sagging +saggy +sago +sags +saguaro +saguaros +sahib +sahibs +said +sail +sailboard +sailboarder +sailboarders +sailboarding +sailboards +sailboat +sailboats +sailcloth +sailed +sailfish +sailfishes +sailing +sailings +sailor +sailors +sailplane +sailplanes +sails +saint +sainted +sainthood +saintlier +saintliest +saintlike +saintliness +saintly +saints +saith +sake +saki +salaam +salaamed +salaaming +salaams +salable +salacious +salaciously +salaciousness +salacity +salad +salads +salamander +salamanders +salami +salamis +salaried +salaries +salary +sale +saleable +sales +salesclerk +salesclerks +salesgirl +salesgirls +salesladies +saleslady +salesman +salesmanship +salesmen +salespeople +salesperson +salespersons +saleswoman +saleswomen +salience +salient +saliently +salients +saline +salines +salinity +saliva +salivary +salivate +salivated +salivates +salivating +salivation +sallied +sallies +sallow +sallower +sallowest +sallowness +sally +sallying +salmon +salmonella +salmonellae +salmonellas +salmons +salon +salons +saloon +saloons +salsa +salsas +salt +saltbox +saltboxes +saltcellar +saltcellars +salted +salter +saltest +saltier +saltiest +saltine +saltines +saltiness +salting +saltpeter +saltpetre +salts +saltshaker +saltshakers +saltwater +salty +salubrious +salutary +salutation +salutations +salutatorian +salutatorians +salutatory +salute +saluted +salutes +saluting +salvage +salvageable +salvaged +salvages +salvaging +salvation +salve +salved +salver +salvers +salves +salving +salvo +salvoes +salvos +samarium +samba +sambaed +sambaing +sambas +same +sameness +samovar +samovars +sampan +sampans +sample +sampled +sampler +samplers +samples +sampling +samurai +sanatoria +sanatorium +sanatoriums +sancta +sanctification +sanctified +sanctifies +sanctify +sanctifying +sanctimonious +sanctimoniously +sanctimoniousness +sanctimony +sanction +sanctioned +sanctioning +sanctions +sanctity +sanctuaries +sanctuary +sanctum +sanctums +sand +sandal +sandals +sandalwood +sandbag +sandbagged +sandbagging +sandbags +sandbank +sandbanks +sandbar +sandbars +sandblast +sandblasted +sandblaster +sandblasters +sandblasting +sandblasts +sandbox +sandboxes +sandcastle +sandcastles +sanded +sander +sanders +sandhog +sandhogs +sandier +sandiest +sandiness +sanding +sandlot +sandlots +sandlotter +sandlotters +sandman +sandmen +sandpaper +sandpapered +sandpapering +sandpapers +sandpiper +sandpipers +sands +sandstone +sandstorm +sandstorms +sandwich +sandwiched +sandwiches +sandwiching +sandy +sane +sanely +saneness +saner +sanest +sang +sangfroid +sangria +sanguinary +sanguine +sanguinely +sanitaria +sanitarian +sanitarians +sanitarium +sanitariums +sanitary +sanitation +sanitize +sanitized +sanitizes +sanitizing +sanity +sank +sans +sapience +sapient +sapless +sapling +saplings +sapped +sapphire +sapphires +sappier +sappiest +sappiness +sapping +sappy +saprophyte +saprophytes +saprophytic +saps +sapsucker +sapsuckers +sapwood +saran +sarape +sarapes +sarcasm +sarcasms +sarcastic +sarcastically +sarcoma +sarcomas +sarcomata +sarcophagi +sarcophagus +sarcophaguses +sardine +sardines +sardonic +sardonically +saree +sarees +sarge +sarges +sari +saris +sarong +sarongs +sarsaparilla +sarsaparillas +sartorial +sartorially +sash +sashay +sashayed +sashaying +sashays +sashes +sass +sassafras +sassafrases +sassed +sasses +sassier +sassiest +sassing +sassy +satanic +satanical +satanically +satanism +satanist +satanists +satchel +satchels +sate +sated +sateen +satellite +satellites +sates +satiable +satiate +satiated +satiates +satiating +satiation +satiety +satin +sating +satinwood +satinwoods +satiny +satire +satires +satiric +satirical +satirically +satirist +satirists +satirize +satirized +satirizes +satirizing +satisfaction +satisfactions +satisfactorily +satisfactory +satisfied +satisfies +satisfy +satisfying +satisfyingly +satori +satrap +satraps +saturate +saturated +saturates +saturating +saturation +saturnine +satyr +satyriasis +satyric +satyrs +sauce +sauced +saucepan +saucepans +saucer +saucers +sauces +saucier +sauciest +saucily +sauciness +saucing +saucy +sauerkraut +sauna +saunaed +saunaing +saunas +saunter +sauntered +sauntering +saunters +saurian +sauropod +sauropods +sausage +sausages +saute +sauted +sauteed +sauteing +sauterne +sauternes +sautes +savable +savage +savaged +savagely +savageness +savager +savageries +savagery +savages +savagest +savaging +savanna +savannah +savannahs +savannas +savant +savants +save +saveable +saved +saver +savers +saves +saving +savings +savior +saviors +saviour +saviours +savor +savored +savorier +savories +savoriest +savoriness +savoring +savors +savory +savour +savoured +savourier +savouries +savouriest +savouring +savours +savoury +savoy +savoys +savvied +savvier +savvies +savviest +savvy +savvying +sawbones +sawboneses +sawbuck +sawbucks +sawdust +sawed +sawflies +sawfly +sawhorse +sawhorses +sawing +sawmill +sawmills +sawn +saws +sawyer +sawyers +saxes +saxifrage +saxifrages +saxophone +saxophones +saxophonist +saxophonists +saying +sayings +says +scab +scabbard +scabbards +scabbed +scabbier +scabbiest +scabbiness +scabbing +scabby +scabies +scabrous +scabs +scad +scads +scaffold +scaffolding +scaffolds +scalawag +scalawags +scald +scalded +scalding +scalds +scale +scaled +scaleless +scalene +scales +scalier +scaliest +scaliness +scaling +scallion +scallions +scallop +scalloped +scalloping +scallops +scalp +scalped +scalpel +scalpels +scalper +scalpers +scalping +scalps +scaly +scam +scammed +scamming +scamp +scamper +scampered +scampering +scampers +scampi +scampies +scamps +scams +scan +scandal +scandalize +scandalized +scandalizes +scandalizing +scandalmonger +scandalmongers +scandalous +scandalously +scandals +scandium +scanned +scanner +scanners +scanning +scans +scansion +scant +scanted +scanter +scantest +scantier +scantiest +scantily +scantiness +scanting +scantly +scantness +scants +scanty +scapegoat +scapegoated +scapegoating +scapegoats +scapegrace +scapegraces +scapula +scapulae +scapular +scapulars +scapulas +scar +scarab +scarabs +scarce +scarcely +scarceness +scarcer +scarcest +scarcity +scare +scarecrow +scarecrows +scared +scareder +scaredest +scaremonger +scaremongers +scares +scarf +scarfed +scarfing +scarfs +scarier +scariest +scarification +scarified +scarifies +scarify +scarifying +scarily +scariness +scaring +scarlatina +scarlet +scarp +scarped +scarping +scarps +scarred +scarring +scars +scarves +scary +scat +scathing +scathingly +scatological +scatology +scats +scatted +scatter +scatterbrain +scatterbrained +scatterbrains +scattered +scattering +scatterings +scatters +scatting +scavenge +scavenged +scavenger +scavengers +scavenges +scavenging +scenario +scenarios +scenarist +scenarists +scene +scenery +scenes +scenic +scenically +scent +scented +scenting +scentless +scents +scepter +scepters +sceptic +sceptical +scepticism +sceptics +sceptre +sceptres +schedule +scheduled +schedules +scheduling +schematic +schematically +schematics +scheme +schemed +schemer +schemers +schemes +scheming +scherzi +scherzo +scherzos +schilling +schillings +schism +schismatic +schismatics +schisms +schist +schizo +schizoid +schizoids +schizophrenia +schizophrenic +schizophrenics +schizos +schlemiel +schlemiels +schlep +schlepp +schlepped +schlepping +schlepps +schleps +schlock +schlocky +schmaltz +schmaltzier +schmaltziest +schmaltzy +schmalz +schmo +schmoe +schmoes +schmooze +schmoozed +schmoozes +schmoozing +schmos +schmuck +schmucks +schnapps +schnaps +schnauzer +schnauzers +schnitzel +schnitzels +schnook +schnooks +schnoz +schnozes +schnozzle +schnozzles +scholar +scholarly +scholars +scholarship +scholarships +scholastic +scholastically +school +schoolbag +schoolbags +schoolbook +schoolbooks +schoolboy +schoolboys +schoolchild +schoolchildren +schooled +schoolfellow +schoolfellows +schoolgirl +schoolgirls +schoolhouse +schoolhouses +schooling +schoolmarm +schoolmarmish +schoolmarms +schoolmaster +schoolmasters +schoolmate +schoolmates +schoolmistress +schoolmistresses +schoolroom +schoolrooms +schools +schoolteacher +schoolteachers +schoolwork +schoolyard +schoolyards +schooner +schooners +schrod +schrods +schuss +schussboomer +schussboomers +schussed +schusses +schussing +schwa +schwas +sciatic +sciatica +science +sciences +scientific +scientifically +scientist +scientists +scimitar +scimitars +scintilla +scintillas +scintillate +scintillated +scintillates +scintillating +scintillation +scion +scions +scissor +scissored +scissoring +scissors +sclerosis +sclerotic +scoff +scoffed +scoffer +scoffers +scoffing +scofflaw +scofflaws +scoffs +scold +scolded +scolding +scoldings +scolds +scoliosis +scollop +scolloped +scolloping +scollops +sconce +sconces +scone +scones +scoop +scooped +scoopful +scoopfuls +scooping +scoops +scoot +scooted +scooter +scooters +scooting +scoots +scope +scoped +scopes +scoping +scorbutic +scorch +scorched +scorcher +scorchers +scorches +scorching +score +scoreboard +scoreboards +scorecard +scorecards +scored +scorekeeper +scorekeepers +scoreless +scorer +scorers +scores +scoring +scorn +scorned +scorner +scorners +scornful +scornfully +scorning +scorns +scorpion +scorpions +scotch +scotched +scotches +scotching +scoundrel +scoundrels +scour +scoured +scourer +scourers +scourge +scourged +scourges +scourging +scouring +scours +scout +scouted +scouting +scoutmaster +scoutmasters +scouts +scow +scowl +scowled +scowling +scowls +scows +scrabble +scrabbled +scrabbler +scrabblers +scrabbles +scrabbling +scrag +scraggier +scraggiest +scragglier +scraggliest +scraggly +scraggy +scrags +scram +scramble +scrambled +scrambler +scramblers +scrambles +scrambling +scrammed +scramming +scrams +scrap +scrapbook +scrapbooks +scrape +scraped +scraper +scrapers +scrapes +scrapheap +scrapheaps +scraping +scrapped +scrapper +scrappers +scrappier +scrappiest +scrapping +scrappy +scraps +scrapyard +scrapyards +scratch +scratched +scratches +scratchier +scratchiest +scratchily +scratchiness +scratching +scratchy +scrawl +scrawled +scrawling +scrawls +scrawly +scrawnier +scrawniest +scrawniness +scrawny +scream +screamed +screamer +screamers +screaming +screams +scree +screech +screeched +screeches +screechier +screechiest +screeching +screechy +screen +screened +screening +screenings +screenplay +screenplays +screens +screenwriter +screenwriters +screenwriting +screes +screw +screwball +screwballs +screwdriver +screwdrivers +screwed +screwier +screwiest +screwiness +screwing +screws +screwworm +screwworms +screwy +scribal +scribble +scribbled +scribbler +scribblers +scribbles +scribbling +scribe +scribes +scrim +scrimmage +scrimmaged +scrimmages +scrimmaging +scrimp +scrimped +scrimping +scrimps +scrims +scrimshaw +scrimshawed +scrimshawing +scrimshaws +scrip +scrips +script +scripted +scripting +scripts +scriptural +scripture +scriptures +scriptwriter +scriptwriters +scrivener +scriveners +scrod +scrods +scrofula +scrofulous +scroll +scrolled +scrolling +scrolls +scrooge +scrooges +scrota +scrotal +scrotum +scrotums +scrounge +scrounged +scrounger +scroungers +scrounges +scroungier +scroungiest +scrounging +scroungy +scrub +scrubbed +scrubber +scrubbers +scrubbier +scrubbiest +scrubbing +scrubby +scrubs +scruff +scruffier +scruffiest +scruffily +scruffiness +scruffs +scruffy +scrumptious +scrumptiously +scrunch +scrunched +scrunches +scrunchie +scrunchies +scrunching +scrunchy +scruple +scrupled +scruples +scrupling +scrupulosity +scrupulous +scrupulously +scrupulousness +scrutinize +scrutinized +scrutinizes +scrutinizing +scrutiny +scuba +scubaed +scubaing +scubas +scud +scudded +scudding +scuds +scuff +scuffed +scuffing +scuffle +scuffled +scuffles +scuffling +scuffs +scull +sculled +sculler +sculleries +scullers +scullery +sculling +scullion +scullions +sculls +sculpt +sculpted +sculpting +sculptor +sculptors +sculptress +sculptresses +sculpts +sculptural +sculpture +sculptured +sculptures +sculpturing +scum +scumbag +scumbags +scummed +scummier +scummiest +scumming +scummy +scums +scupper +scuppered +scuppering +scuppers +scurf +scurfier +scurfiest +scurfy +scurried +scurries +scurrility +scurrilous +scurrilously +scurrilousness +scurry +scurrying +scurvier +scurviest +scurvily +scurvy +scutcheon +scutcheons +scuttle +scuttlebutt +scuttled +scuttles +scuttling +scuzzier +scuzziest +scuzzy +scythe +scythed +scythes +scything +seabed +seabeds +seabird +seabirds +seaboard +seaboards +seaborne +seacoast +seacoasts +seafarer +seafarers +seafaring +seafloor +seafloors +seafood +seafront +seafronts +seagoing +seagull +seagulls +seahorse +seahorses +seal +sealant +sealants +sealed +sealer +sealers +sealing +seals +sealskin +seam +seaman +seamanship +seamed +seamen +seamier +seamiest +seaming +seamless +seamlessly +seams +seamstress +seamstresses +seamy +seance +seances +seaplane +seaplanes +seaport +seaports +sear +search +searched +searcher +searchers +searches +searching +searchingly +searchlight +searchlights +seared +searing +sears +seas +seascape +seascapes +seashell +seashells +seashore +seashores +seasick +seasickness +seaside +seasides +season +seasonable +seasonably +seasonal +seasonally +seasoned +seasoning +seasonings +seasons +seat +seated +seating +seatmate +seatmates +seats +seawall +seawalls +seaward +seawards +seawater +seaway +seaways +seaweed +seaworthier +seaworthiest +seaworthiness +seaworthy +sebaceous +seborrhea +seborrhoea +secant +secants +secede +seceded +secedes +seceding +secession +secessionist +secessionists +seclude +secluded +secludes +secluding +seclusion +seclusive +second +secondaries +secondarily +secondary +seconded +seconder +seconders +secondhand +seconding +secondly +seconds +secrecy +secret +secretarial +secretariat +secretariats +secretaries +secretary +secretaryship +secrete +secreted +secretes +secreting +secretion +secretions +secretive +secretively +secretiveness +secretly +secretory +secrets +secs +sect +sectarian +sectarianism +sectarians +sectaries +sectary +section +sectional +sectionalism +sectionals +sectioned +sectioning +sections +sector +sectors +sects +secular +secularism +secularist +secularists +secularization +secularize +secularized +secularizes +secularizing +secure +secured +securely +securer +secures +securest +securing +securities +security +sedan +sedans +sedate +sedated +sedately +sedateness +sedater +sedates +sedatest +sedating +sedation +sedative +sedatives +sedentary +sedge +sedgy +sediment +sedimentary +sedimentation +sediments +sedition +seditious +seduce +seduced +seducer +seducers +seduces +seducing +seduction +seductions +seductive +seductively +seductiveness +seductress +seductresses +sedulous +sedulously +seed +seedbed +seedbeds +seedcase +seedcases +seeded +seeder +seeders +seedier +seediest +seediness +seeding +seedless +seedling +seedlings +seedpod +seedpods +seeds +seedy +seeing +seek +seeker +seekers +seeking +seeks +seem +seemed +seeming +seemingly +seemlier +seemliest +seemliness +seemly +seems +seen +seep +seepage +seeped +seeping +seeps +seer +seers +seersucker +sees +seesaw +seesawed +seesawing +seesaws +seethe +seethed +seethes +seething +segment +segmentation +segmented +segmenting +segments +segregate +segregated +segregates +segregating +segregation +segregationist +segregationists +segue +segued +segueing +segues +seigneur +seigneurs +seignior +seigniorial +seigniors +seine +seined +seiner +seiners +seines +seining +seismic +seismically +seismograph +seismographer +seismographers +seismographic +seismographs +seismography +seismologic +seismological +seismologist +seismologists +seismology +seize +seized +seizes +seizing +seizure +seizures +seldom +select +selected +selecting +selection +selections +selective +selectively +selectivity +selectman +selectmen +selectness +selector +selectors +selects +selenium +selenographer +selenographers +selenography +self +selfish +selfishly +selfishness +selfless +selflessly +selflessness +selfsame +sell +seller +sellers +selling +sellout +sellouts +sells +seltzer +selvage +selvages +selvedge +selvedges +selves +semantic +semantically +semanticist +semanticists +semantics +semaphore +semaphored +semaphores +semaphoring +semblance +semblances +semen +semester +semesters +semi +semiannual +semiannually +semiarid +semiautomatic +semiautomatics +semicircle +semicircles +semicircular +semicolon +semicolons +semiconducting +semiconductor +semiconductors +semiconscious +semidarkness +semidetached +semifinal +semifinalist +semifinalists +semifinals +semigloss +semimonthlies +semimonthly +seminal +seminar +seminarian +seminarians +seminaries +seminars +seminary +semiofficial +semiotic +semiotics +semipermeable +semiprecious +semiprivate +semipro +semiprofessional +semiprofessionals +semipros +semiretired +semis +semiskilled +semisolid +semisweet +semitone +semitones +semitrailer +semitrailers +semitransparent +semitropical +semivowel +semivowels +semiweeklies +semiweekly +semiyearly +semolina +sempstress +sempstresses +senate +senates +senator +senatorial +senators +send +sender +senders +sending +sendoff +sendoffs +sends +senescence +senescent +senile +senility +senior +seniority +seniors +senna +senor +senora +senoras +senorita +senoritas +senors +sensation +sensational +sensationalism +sensationalist +sensationalists +sensationalize +sensationalized +sensationalizes +sensationalizing +sensationally +sensations +sense +sensed +senseless +senselessly +senselessness +senses +sensibilities +sensibility +sensible +sensibleness +sensibly +sensing +sensitive +sensitively +sensitiveness +sensitives +sensitivities +sensitivity +sensitization +sensitize +sensitized +sensitizes +sensitizing +sensor +sensors +sensory +sensual +sensualist +sensualists +sensuality +sensually +sensuous +sensuously +sensuousness +sent +sentence +sentenced +sentences +sentencing +sententious +sententiously +sentience +sentient +sentiment +sentimental +sentimentalism +sentimentalist +sentimentalists +sentimentality +sentimentalization +sentimentalize +sentimentalized +sentimentalizes +sentimentalizing +sentimentally +sentiments +sentinel +sentinels +sentries +sentry +sepal +sepals +separability +separable +separably +separate +separated +separately +separateness +separates +separating +separation +separations +separatism +separatist +separatists +separative +separator +separators +sepia +sepsis +septa +septet +septets +septette +septettes +septic +septicemia +septicemic +septuagenarian +septuagenarians +septum +septums +sepulcher +sepulchered +sepulchering +sepulchers +sepulchral +sepulchre +sepulchred +sepulchres +sepulchring +sequel +sequels +sequence +sequenced +sequences +sequencing +sequential +sequentially +sequester +sequestered +sequestering +sequesters +sequestrate +sequestrated +sequestrates +sequestrating +sequestration +sequestrations +sequin +sequined +sequinned +sequins +sequoia +sequoias +sera +seraglio +seraglios +serape +serapes +seraph +seraphic +seraphim +seraphs +sere +serenade +serenaded +serenades +serenading +serendipitous +serendipity +serene +serenely +sereneness +serener +serenest +serenity +serer +serest +serf +serfdom +serfs +serge +sergeant +sergeants +serial +serialization +serialize +serialized +serializes +serializing +serially +serials +series +serif +serifs +serigraph +serigraphs +serious +seriously +seriousness +sermon +sermonize +sermonized +sermonizes +sermonizing +sermons +serology +serous +serpent +serpentine +serpents +serrate +serrated +serration +serrations +serried +serum +serums +servant +servants +serve +served +server +servers +serves +service +serviceability +serviceable +serviced +serviceman +servicemen +services +servicewoman +servicewomen +servicing +serviette +serviettes +servile +servility +serving +servings +servitor +servitors +servitude +servo +servomechanism +servomechanisms +servomotor +servomotors +servos +sesame +sesames +sesquicentennial +sesquicentennials +session +sessions +setback +setbacks +sets +setscrew +setscrews +settee +settees +setter +setters +setting +settings +settle +settled +settlement +settlements +settler +settlers +settles +settling +setup +setups +seven +sevens +seventeen +seventeens +seventeenth +seventeenths +seventh +sevenths +seventies +seventieth +seventieths +seventy +sever +several +severally +severance +severances +severe +severed +severely +severeness +severer +severest +severing +severity +severs +sewage +sewed +sewer +sewerage +sewers +sewing +sewn +sews +sexagenarian +sexagenarians +sexed +sexes +sexier +sexiest +sexily +sexiness +sexing +sexism +sexist +sexists +sexless +sexologist +sexologists +sexology +sexpot +sexpots +sextant +sextants +sextet +sextets +sextette +sextettes +sexton +sextons +sextuplet +sextuplets +sexual +sexuality +sexually +sexy +shabbier +shabbiest +shabbily +shabbiness +shabby +shack +shackle +shackled +shackles +shackling +shacks +shad +shade +shaded +shades +shadier +shadiest +shadily +shadiness +shading +shadings +shadow +shadowbox +shadowboxed +shadowboxes +shadowboxing +shadowed +shadowier +shadowiest +shadowing +shadows +shadowy +shads +shady +shaft +shafted +shafting +shafts +shag +shagged +shaggier +shaggiest +shagginess +shagging +shaggy +shags +shah +shahs +shake +shakedown +shakedowns +shaken +shakeout +shakeouts +shaker +shakers +shakes +shakeup +shakeups +shakier +shakiest +shakily +shakiness +shaking +shaky +shale +shall +shallot +shallots +shallow +shallower +shallowest +shallowly +shallowness +shallows +shalom +shalt +sham +shaman +shamanic +shamans +shamble +shambled +shambles +shambling +shame +shamed +shamefaced +shamefacedly +shameful +shamefully +shamefulness +shameless +shamelessly +shamelessness +shames +shaming +shammed +shammies +shamming +shammy +shampoo +shampooed +shampooer +shampooers +shampooing +shampoos +shamrock +shamrocks +shams +shanghai +shanghaied +shanghaiing +shanghais +shank +shanks +shanties +shantung +shanty +shantytown +shantytowns +shape +shaped +shapeless +shapelessly +shapelessness +shapelier +shapeliest +shapeliness +shapely +shapes +shaping +shard +shards +share +sharecrop +sharecropped +sharecropper +sharecroppers +sharecropping +sharecrops +shared +shareholder +shareholders +sharer +sharers +shares +shareware +sharia +sharing +shark +sharks +sharkskin +sharp +sharped +sharpen +sharpened +sharpener +sharpeners +sharpening +sharpens +sharper +sharpers +sharpest +sharpie +sharpies +sharping +sharply +sharpness +sharps +sharpshooter +sharpshooters +sharpshooting +sharpy +shat +shatter +shattered +shattering +shatterproof +shatters +shave +shaved +shaven +shaver +shavers +shaves +shaving +shavings +shawl +shawls +shay +shays +sheaf +shear +sheared +shearer +shearers +shearing +shears +sheath +sheathe +sheathed +sheathes +sheathing +sheathings +sheaths +sheave +sheaved +sheaves +sheaving +shebang +shebangs +shed +shedding +sheds +sheen +sheenier +sheeniest +sheeny +sheep +sheepdog +sheepdogs +sheepfold +sheepfolds +sheepherder +sheepherders +sheepish +sheepishly +sheepishness +sheepskin +sheepskins +sheer +sheered +sheerer +sheerest +sheering +sheerness +sheers +sheet +sheeting +sheetlike +sheets +sheik +sheikdom +sheikdoms +sheikh +sheikhdom +sheikhdoms +sheikhs +sheiks +shekel +shekels +shelf +shell +shellac +shellack +shellacked +shellacking +shellackings +shellacks +shellacs +shelled +shellfire +shellfish +shellfishes +shelling +shells +shelter +sheltered +sheltering +shelters +shelve +shelved +shelves +shelving +shenanigan +shenanigans +shepherd +shepherded +shepherdess +shepherdesses +shepherding +shepherds +sherbert +sherberts +sherbet +sherbets +sherd +sherds +sheriff +sheriffs +sherries +sherry +shes +shew +shewed +shewing +shewn +shews +shiatsu +shibboleth +shibboleths +shied +shield +shielded +shielding +shields +shier +shies +shiest +shift +shifted +shiftier +shiftiest +shiftily +shiftiness +shifting +shiftless +shiftlessly +shiftlessness +shifts +shifty +shill +shillalah +shillalahs +shilled +shillelagh +shillelaghs +shilling +shillings +shills +shim +shimmed +shimmer +shimmered +shimmering +shimmers +shimmery +shimmied +shimmies +shimming +shimmy +shimmying +shims +shin +shinbone +shinbones +shindig +shindigs +shine +shined +shiner +shiners +shines +shingle +shingled +shingles +shingling +shinguard +shinguards +shinier +shiniest +shininess +shining +shinned +shinnied +shinnies +shinning +shinny +shinnying +shins +shinsplints +shiny +ship +shipboard +shipboards +shipbuilder +shipbuilders +shipbuilding +shipload +shiploads +shipmate +shipmates +shipment +shipments +shipowner +shipowners +shipped +shipper +shippers +shipping +ships +shipshape +shipwreck +shipwrecked +shipwrecking +shipwrecks +shipwright +shipwrights +shipyard +shipyards +shire +shires +shirk +shirked +shirker +shirkers +shirking +shirks +shirr +shirred +shirring +shirrings +shirrs +shirt +shirtfront +shirtfronts +shirting +shirtless +shirts +shirtsleeve +shirtsleeves +shirttail +shirttails +shirtwaist +shirtwaists +shit +shits +shittier +shittiest +shitting +shitty +shiv +shiver +shivered +shivering +shivers +shivery +shivs +shlemiel +shlemiels +shlep +shlepp +shlepped +shlepping +shlepps +shleps +shlock +shmaltz +shoal +shoaled +shoaling +shoals +shoat +shoats +shock +shocked +shocker +shockers +shocking +shockingly +shockproof +shocks +shod +shodden +shoddier +shoddiest +shoddily +shoddiness +shoddy +shoe +shoed +shoehorn +shoehorned +shoehorning +shoehorns +shoeing +shoelace +shoelaces +shoemaker +shoemakers +shoes +shoeshine +shoeshines +shoestring +shoestrings +shoetree +shoetrees +shogun +shogunate +shoguns +shone +shoo +shooed +shooing +shook +shoon +shoos +shoot +shooter +shooters +shooting +shootings +shootout +shootouts +shoots +shop +shopkeeper +shopkeepers +shoplift +shoplifted +shoplifter +shoplifters +shoplifting +shoplifts +shoppe +shopped +shopper +shoppers +shoppes +shopping +shops +shoptalk +shopworn +shore +shorebird +shorebirds +shored +shoreline +shorelines +shores +shoring +shorn +short +shortage +shortages +shortbread +shortcake +shortcakes +shortchange +shortchanged +shortchanges +shortchanging +shortcoming +shortcomings +shortcut +shortcuts +shorted +shorten +shortened +shortening +shortenings +shortens +shorter +shortest +shortfall +shortfalls +shorthand +shorthanded +shorthorn +shorthorns +shortie +shorties +shorting +shortly +shortness +shorts +shortsighted +shortsightedly +shortsightedness +shortstop +shortstops +shortwave +shortwaves +shorty +shot +shotgun +shotgunned +shotgunning +shotguns +shots +should +shoulder +shouldered +shouldering +shoulders +shout +shouted +shouter +shouters +shouting +shouts +shove +shoved +shovel +shoveled +shovelful +shovelfuls +shoveling +shovelled +shovelling +shovels +shoves +shoving +show +showbiz +showboat +showboated +showboating +showboats +showcase +showcased +showcases +showcasing +showdown +showdowns +showed +shower +showered +showering +showers +showery +showgirl +showgirls +showier +showiest +showily +showiness +showing +showings +showman +showmanship +showmen +shown +showoff +showoffs +showpiece +showpieces +showplace +showplaces +showroom +showrooms +shows +showstopper +showstoppers +showy +shrank +shrapnel +shred +shredded +shredder +shredders +shredding +shreds +shrew +shrewd +shrewder +shrewdest +shrewdly +shrewdness +shrewish +shrews +shriek +shrieked +shrieking +shrieks +shrift +shrike +shrikes +shrill +shrilled +shriller +shrillest +shrilling +shrillness +shrills +shrilly +shrimp +shrimped +shrimping +shrimps +shrine +shrines +shrink +shrinkable +shrinkage +shrinking +shrinks +shrive +shrived +shrivel +shriveled +shriveling +shrivelled +shrivelling +shrivels +shriven +shrives +shriving +shroud +shrouded +shrouding +shrouds +shrove +shrub +shrubberies +shrubbery +shrubbier +shrubbiest +shrubby +shrubs +shrug +shrugged +shrugging +shrugs +shrunk +shrunken +shtick +shticks +shuck +shucked +shucking +shucks +shudder +shuddered +shuddering +shudders +shuffle +shuffleboard +shuffleboards +shuffled +shuffler +shufflers +shuffles +shuffling +shun +shunned +shunning +shuns +shunt +shunted +shunting +shunts +shush +shushed +shushes +shushing +shut +shutdown +shutdowns +shuteye +shutoff +shutoffs +shutout +shutouts +shuts +shutter +shutterbug +shutterbugs +shuttered +shuttering +shutters +shutting +shuttle +shuttlecock +shuttlecocked +shuttlecocking +shuttlecocks +shuttled +shuttles +shuttling +shyer +shyest +shying +shyly +shyness +shyster +shysters +sibilant +sibilants +sibling +siblings +sibyl +sibylline +sibyls +sicced +siccing +sick +sickbed +sickbeds +sicked +sicken +sickened +sickening +sickeningly +sickens +sicker +sickest +sickie +sickies +sicking +sickish +sickle +sickles +sicklier +sickliest +sickly +sickness +sicknesses +sicko +sickos +sickout +sickouts +sickroom +sickrooms +sicks +sics +side +sidearm +sidearms +sidebar +sidebars +sideboard +sideboards +sideburns +sidecar +sidecars +sided +sidekick +sidekicks +sidelight +sidelights +sideline +sidelined +sidelines +sidelining +sidelong +sideman +sidemen +sidepiece +sidepieces +sidereal +sides +sidesaddle +sidesaddles +sideshow +sideshows +sidesplitting +sidestep +sidestepped +sidestepping +sidesteps +sidestroke +sidestroked +sidestrokes +sidestroking +sideswipe +sideswiped +sideswipes +sideswiping +sidetrack +sidetracked +sidetracking +sidetracks +sidewalk +sidewalks +sidewall +sidewalls +sideways +sidewinder +sidewinders +sidewise +siding +sidings +sidle +sidled +sidles +sidling +siege +sieges +sienna +sierra +sierras +siesta +siestas +sieve +sieved +sieves +sieving +sift +sifted +sifter +sifters +sifting +sifts +sigh +sighed +sighing +sighs +sight +sighted +sighting +sightings +sightless +sightlier +sightliest +sightly +sightread +sightreading +sightreads +sights +sightseeing +sightseer +sightseers +sigma +sigmas +sign +signage +signal +signaled +signaler +signalers +signaling +signalization +signalize +signalized +signalizes +signalizing +signalled +signalling +signally +signalman +signalmen +signals +signatories +signatory +signature +signatures +signboard +signboards +signed +signer +signers +signet +signets +significance +significant +significantly +signification +significations +signified +signifies +signify +signifying +signing +signings +signor +signora +signoras +signore +signori +signorina +signorinas +signorine +signors +signpost +signposted +signposting +signposts +signs +silage +silence +silenced +silencer +silencers +silences +silencing +silent +silenter +silentest +silently +silents +silhouette +silhouetted +silhouettes +silhouetting +silica +silicate +silicates +siliceous +silicious +silicon +silicone +silicosis +silk +silken +silkier +silkiest +silkily +silkiness +silks +silkscreen +silkscreened +silkscreening +silkscreens +silkworm +silkworms +silky +sill +sillier +sillies +silliest +silliness +sills +silly +silo +silos +silt +silted +siltier +siltiest +silting +silts +silty +silvan +silver +silvered +silverfish +silverfishes +silvering +silvers +silversmith +silversmiths +silverware +silvery +simian +simians +similar +similarities +similarity +similarly +simile +similes +similitude +simmer +simmered +simmering +simmers +simonize +simonized +simonizes +simonizing +simony +simpatico +simper +simpered +simpering +simpers +simple +simpleminded +simpleness +simpler +simplest +simpleton +simpletons +simplicity +simplification +simplifications +simplified +simplifies +simplify +simplifying +simplistic +simplistically +simply +simulate +simulated +simulates +simulating +simulation +simulations +simulator +simulators +simulcast +simulcasted +simulcasting +simulcasts +simultaneity +simultaneous +simultaneously +since +sincere +sincerely +sincerer +sincerest +sincerity +sine +sinecure +sinecures +sines +sinew +sinews +sinewy +sinful +sinfully +sinfulness +sing +singable +singe +singed +singeing +singer +singers +singes +singing +single +singled +singleness +singles +singleton +singletons +singletree +singletrees +singling +singly +sings +singsong +singsongs +singular +singularities +singularity +singularly +singulars +sinister +sink +sinkable +sinker +sinkers +sinkhole +sinkholes +sinking +sinks +sinless +sinned +sinner +sinners +sinning +sins +sinuosity +sinuous +sinus +sinuses +sinusitis +siphon +siphoned +siphoning +siphons +sipped +sipper +sippers +sipping +sips +sire +sired +siree +siren +sirens +sires +siring +sirloin +sirloins +sirocco +siroccos +sirree +sirs +sirup +sirups +sisal +sises +sissier +sissies +sissiest +sissified +sissy +sister +sisterhood +sisterhoods +sisterliness +sisterly +sisters +sitar +sitarist +sitarists +sitars +sitcom +sitcoms +site +sited +sites +siting +sits +sitter +sitters +sitting +sittings +situate +situated +situates +situating +situation +situations +situp +situps +sixes +sixfold +sixpence +sixpences +sixshooter +sixshooters +sixteen +sixteens +sixteenth +sixteenths +sixth +sixths +sixties +sixtieth +sixtieths +sixty +sizable +size +sizeable +sized +sizes +sizing +sizzle +sizzled +sizzles +sizzling +skate +skateboard +skateboarded +skateboarder +skateboarders +skateboarding +skateboards +skated +skater +skaters +skates +skating +skedaddle +skedaddled +skedaddles +skedaddling +skeet +skein +skeins +skeletal +skeleton +skeletons +skeptic +skeptical +skeptically +skepticism +skeptics +sketch +sketched +sketcher +sketchers +sketches +sketchier +sketchiest +sketchily +sketchiness +sketching +sketchy +skew +skewed +skewer +skewered +skewering +skewers +skewing +skews +skid +skidded +skidding +skids +skied +skier +skiers +skies +skiff +skiffs +skiing +skilful +skill +skilled +skillet +skillets +skillful +skillfully +skillfulness +skills +skim +skimmed +skimmer +skimmers +skimming +skimp +skimped +skimpier +skimpiest +skimpily +skimpiness +skimping +skimps +skimpy +skims +skin +skincare +skinflick +skinflicks +skinflint +skinflints +skinhead +skinheads +skinless +skinned +skinnier +skinniest +skinniness +skinning +skinny +skins +skintight +skip +skipped +skipper +skippered +skippering +skippers +skipping +skips +skirmish +skirmished +skirmishes +skirmishing +skirt +skirted +skirting +skirts +skis +skit +skits +skitter +skittered +skittering +skitters +skittish +skittishly +skittishness +skivvied +skivvies +skivvy +skivvying +skoal +skoals +skulduggery +skulk +skulked +skulker +skulkers +skulking +skulks +skull +skullcap +skullcaps +skullduggery +skulls +skunk +skunked +skunking +skunks +skycap +skycaps +skydive +skydived +skydiver +skydivers +skydives +skydiving +skydove +skyed +skying +skyjack +skyjacked +skyjacker +skyjackers +skyjacking +skyjackings +skyjacks +skylark +skylarked +skylarking +skylarks +skylight +skylights +skyline +skylines +skyrocket +skyrocketed +skyrocketing +skyrockets +skyscraper +skyscrapers +skyward +skywards +skywriter +skywriters +skywriting +slab +slabbed +slabbing +slabs +slack +slacked +slacken +slackened +slackening +slackens +slacker +slackers +slackest +slacking +slackly +slackness +slacks +slag +slain +slake +slaked +slakes +slaking +slalom +slalomed +slaloming +slaloms +slam +slammed +slammer +slammers +slamming +slams +slander +slandered +slanderer +slanderers +slandering +slanderous +slanders +slang +slangier +slangiest +slangy +slant +slanted +slanting +slantingly +slants +slantwise +slap +slapdash +slaphappier +slaphappiest +slaphappy +slapped +slapping +slaps +slapstick +slash +slashed +slasher +slashers +slashes +slashing +slat +slate +slated +slates +slather +slathered +slathering +slathers +slating +slats +slattern +slatternly +slatterns +slaughter +slaughtered +slaughterer +slaughterers +slaughterhouse +slaughterhouses +slaughtering +slaughters +slave +slaved +slaveholder +slaveholders +slaver +slavered +slavering +slavers +slavery +slaves +slaving +slavish +slavishly +slavishness +slaw +slay +slayer +slayers +slaying +slayings +slays +sleaze +sleazes +sleazier +sleaziest +sleazily +sleaziness +sleazy +sled +sledded +sledder +sledders +sledding +sledge +sledged +sledgehammer +sledgehammered +sledgehammering +sledgehammers +sledges +sledging +sleds +sleek +sleeked +sleeker +sleekest +sleeking +sleekly +sleekness +sleeks +sleep +sleeper +sleepers +sleepier +sleepiest +sleepily +sleepiness +sleeping +sleepless +sleeplessly +sleeplessness +sleepover +sleepovers +sleeps +sleepwalk +sleepwalked +sleepwalker +sleepwalkers +sleepwalking +sleepwalks +sleepwear +sleepy +sleepyhead +sleepyheads +sleet +sleeted +sleetier +sleetiest +sleeting +sleets +sleety +sleeve +sleeved +sleeveless +sleeves +sleigh +sleighed +sleighing +sleighs +sleight +sleights +slender +slenderer +slenderest +slenderize +slenderized +slenderizes +slenderizing +slenderness +slept +sleuth +sleuths +slew +slewed +slewing +slews +slice +sliced +slicer +slicers +slices +slicing +slick +slicked +slicker +slickers +slickest +slicking +slickly +slickness +slicks +slid +slide +slider +sliders +slides +sliding +slier +sliest +slight +slighted +slighter +slightest +slighting +slightly +slightness +slights +slily +slim +slime +slimier +slimiest +sliminess +slimmed +slimmer +slimmest +slimming +slimness +slims +slimy +sling +slinging +slings +slingshot +slingshots +slink +slinked +slinkier +slinkiest +slinking +slinks +slinky +slip +slipcase +slipcases +slipcover +slipcovers +slipknot +slipknots +slippage +slippages +slipped +slipper +slipperier +slipperiest +slipperiness +slippers +slippery +slipping +slips +slipshod +slipstream +slipstreams +slipway +slipways +slit +slither +slithered +slithering +slithers +slithery +slits +slitting +sliver +slivered +slivering +slivers +slob +slobber +slobbered +slobbering +slobbers +slobbery +slobs +sloe +sloes +slog +slogan +slogans +slogged +slogging +slogs +sloop +sloops +slop +slope +sloped +slopes +sloping +slopped +sloppier +sloppiest +sloppily +sloppiness +slopping +sloppy +slops +slosh +sloshed +sloshes +sloshing +slot +sloth +slothful +slothfully +slothfulness +sloths +slots +slotted +slotting +slouch +slouched +sloucher +slouchers +slouches +slouchier +slouchiest +slouching +slouchy +slough +sloughed +sloughing +sloughs +sloven +slovenlier +slovenliest +slovenliness +slovenly +slovens +slow +slowdown +slowdowns +slowed +slower +slowest +slowing +slowly +slowness +slowpoke +slowpokes +slows +sludge +sludgier +sludgiest +sludgy +slue +slued +slues +slug +sluggard +sluggards +slugged +slugger +sluggers +slugging +sluggish +sluggishly +sluggishness +slugs +sluice +sluiced +sluices +sluicing +sluing +slum +slumber +slumbered +slumbering +slumberous +slumbers +slumbrous +slumlord +slumlords +slummed +slummier +slummiest +slumming +slummy +slump +slumped +slumping +slumps +slums +slung +slunk +slur +slurp +slurped +slurping +slurps +slurred +slurring +slurry +slurs +slush +slushier +slushiest +slushiness +slushy +slut +sluts +sluttier +sluttiest +sluttish +slutty +slyer +slyest +slyly +slyness +smack +smacked +smacker +smackers +smacking +smacks +small +smaller +smallest +smallish +smallness +smallpox +smalls +smarmier +smarmiest +smarmy +smart +smarted +smarten +smartened +smartening +smartens +smarter +smartest +smarties +smarting +smartly +smartness +smarts +smarty +smartypants +smash +smashed +smasher +smashers +smashes +smashing +smashup +smashups +smattering +smatterings +smear +smeared +smearier +smeariest +smearing +smears +smeary +smell +smelled +smellier +smelliest +smelliness +smelling +smells +smelly +smelt +smelted +smelter +smelters +smelting +smelts +smidgen +smidgens +smidgeon +smidgeons +smidgin +smidgins +smilax +smile +smiled +smiles +smiley +smileys +smiling +smilingly +smirch +smirched +smirches +smirching +smirk +smirked +smirking +smirks +smit +smite +smites +smith +smithereens +smithies +smiths +smithy +smiting +smitten +smock +smocked +smocking +smocks +smog +smoggier +smoggiest +smoggy +smoke +smoked +smokehouse +smokehouses +smokeless +smoker +smokers +smokes +smokescreen +smokescreens +smokestack +smokestacks +smokier +smokiest +smokiness +smoking +smoky +smolder +smoldered +smoldering +smolders +smooch +smooched +smooches +smooching +smooth +smoothed +smoother +smoothes +smoothest +smoothie +smoothies +smoothing +smoothly +smoothness +smooths +smorgasbord +smorgasbords +smote +smother +smothered +smothering +smothers +smoulder +smouldered +smouldering +smoulders +smudge +smudged +smudges +smudgier +smudgiest +smudging +smudgy +smug +smugger +smuggest +smuggle +smuggled +smuggler +smugglers +smuggles +smuggling +smugly +smugness +smut +smuts +smuttier +smuttiest +smuttiness +smutty +snack +snacked +snacking +snacks +snaffle +snaffled +snaffles +snaffling +snafu +snafus +snag +snagged +snagging +snags +snail +snails +snake +snakebite +snakebites +snaked +snakelike +snakes +snakier +snakiest +snaking +snaky +snap +snapdragon +snapdragons +snapped +snapper +snappers +snappier +snappiest +snappily +snappiness +snapping +snappish +snappishly +snappishness +snappy +snaps +snapshot +snapshots +snare +snared +snares +snaring +snarl +snarled +snarlier +snarliest +snarling +snarlingly +snarls +snarly +snatch +snatched +snatcher +snatchers +snatches +snatching +snazzier +snazziest +snazzily +snazzy +sneak +sneaked +sneaker +sneakers +sneakier +sneakiest +sneakily +sneakiness +sneaking +sneakingly +sneaks +sneaky +sneer +sneered +sneering +sneeringly +sneers +sneeze +sneezed +sneezes +sneezing +snicker +snickered +snickering +snickers +snide +snidely +snider +snidest +sniff +sniffed +sniffer +sniffers +sniffing +sniffle +sniffled +sniffles +sniffling +sniffs +snifter +snifters +snigger +sniggered +sniggering +sniggers +snip +snipe +sniped +sniper +snipers +snipes +sniping +snipped +snippet +snippets +snippier +snippiest +snipping +snippy +snips +snit +snitch +snitched +snitches +snitching +snits +snivel +sniveled +sniveler +snivelers +sniveling +snivelled +snivelling +snivels +snob +snobbery +snobbier +snobbiest +snobbish +snobbishly +snobbishness +snobby +snobs +snood +snoods +snooker +snookered +snookering +snookers +snoop +snooped +snooper +snoopers +snoopier +snoopiest +snooping +snoops +snoopy +snoot +snootier +snootiest +snootily +snootiness +snoots +snooty +snooze +snoozed +snoozes +snoozing +snore +snored +snorer +snorers +snores +snoring +snorkel +snorkeled +snorkeler +snorkelers +snorkeling +snorkelled +snorkelling +snorkels +snort +snorted +snorter +snorters +snorting +snorts +snot +snots +snottier +snottiest +snottily +snottiness +snotty +snout +snouts +snow +snowball +snowballed +snowballing +snowballs +snowbank +snowbanks +snowbird +snowbirds +snowboard +snowboarded +snowboarder +snowboarders +snowboarding +snowboards +snowbound +snowdrift +snowdrifts +snowdrop +snowdrops +snowed +snowfall +snowfalls +snowfield +snowfields +snowflake +snowflakes +snowier +snowiest +snowiness +snowing +snowman +snowmen +snowmobile +snowmobiled +snowmobiles +snowmobiling +snowplow +snowplowed +snowplowing +snowplows +snows +snowshoe +snowshoed +snowshoeing +snowshoes +snowstorm +snowstorms +snowsuit +snowsuits +snowy +snub +snubbed +snubbing +snubs +snuck +snuff +snuffbox +snuffboxes +snuffed +snuffer +snuffers +snuffing +snuffle +snuffled +snuffles +snuffling +snuffly +snuffs +snug +snugged +snugger +snuggest +snugging +snuggle +snuggled +snuggles +snuggling +snugly +snugness +snugs +soak +soaked +soaking +soakings +soaks +soap +soapbox +soapboxes +soaped +soapier +soapiest +soapiness +soaping +soaps +soapstone +soapsuds +soapy +soar +soared +soaring +soars +sobbed +sobbing +sobbingly +sober +sobered +soberer +soberest +sobering +soberly +soberness +sobers +sobriety +sobriquet +sobriquets +sobs +soccer +sociability +sociable +sociables +sociably +social +socialism +socialist +socialistic +socialists +socialite +socialites +socialization +socialize +socialized +socializes +socializing +socially +socials +societal +societies +society +socioeconomic +sociological +sociologically +sociologist +sociologists +sociology +sociopath +sociopaths +sock +socked +socket +sockets +sockeye +sockeyes +socking +socks +soda +sodas +sodded +sodden +soddenly +sodding +sodium +sodomite +sodomites +sodomize +sodomized +sodomizes +sodomizing +sodomy +sods +soever +sofa +sofabed +sofabeds +sofas +soft +softball +softballs +softbound +soften +softened +softener +softeners +softening +softens +softer +softest +softhearted +softie +softies +softly +softness +software +softwood +softwoods +softy +soggier +soggiest +soggily +sogginess +soggy +soigne +soignee +soil +soiled +soiling +soils +soiree +soirees +sojourn +sojourned +sojourner +sojourners +sojourning +sojourns +solace +solaced +solaces +solacing +solar +solaria +solarium +solariums +sold +solder +soldered +solderer +solderers +soldering +solders +soldier +soldiered +soldiering +soldierly +soldiers +soldiery +sole +solecism +solecisms +soled +solely +solemn +solemner +solemness +solemnest +solemnified +solemnifies +solemnify +solemnifying +solemnity +solemnization +solemnize +solemnized +solemnizes +solemnizing +solemnly +solemnness +solenoid +solenoids +soles +soli +solicit +solicitation +solicitations +solicited +soliciting +solicitor +solicitors +solicitous +solicitously +solicitousness +solicits +solicitude +solid +solidarity +solider +solidest +solidi +solidification +solidified +solidifies +solidify +solidifying +solidity +solidly +solidness +solids +solidus +soliloquies +soliloquize +soliloquized +soliloquizes +soliloquizing +soliloquy +soling +solipsism +solitaire +solitaires +solitaries +solitariness +solitary +solitude +solo +soloed +soloing +soloist +soloists +solos +sols +solstice +solstices +solubility +soluble +solubles +solute +solutes +solution +solutions +solvable +solve +solved +solvency +solvent +solvents +solver +solvers +solves +solving +somatic +somber +somberer +somberest +somberly +somberness +sombre +sombrer +sombrero +sombreros +sombrest +some +somebodies +somebody +someday +somehow +someone +someplace +somersault +somersaulted +somersaulting +somersaults +somerset +somersets +somersetted +somersetting +something +sometime +sometimes +someway +someways +somewhat +somewhere +somnambulism +somnambulist +somnambulists +somnolence +somnolent +sonar +sonars +sonata +sonatas +sonatina +sonatinas +song +songbird +songbirds +songbook +songbooks +songfest +songfests +songs +songster +songsters +songstress +songstresses +songwriter +songwriters +sonic +sonnet +sonnets +sonnies +sonny +sonogram +sonograms +sonority +sonorous +sonorously +sonorousness +sons +soon +sooner +soonest +soot +sooth +soothe +soothed +soother +soothers +soothes +soothing +soothingly +soothsayer +soothsayers +soothsaying +sootier +sootiest +sooty +sophism +sophist +sophistic +sophistical +sophisticate +sophisticated +sophisticates +sophisticating +sophistication +sophistries +sophistry +sophists +sophomore +sophomores +sophomoric +soporific +soporifically +soporifics +sopped +soppier +soppiest +sopping +soppy +soprano +sopranos +sops +sorbet +sorbets +sorcerer +sorcerers +sorceress +sorceresses +sorcery +sordid +sordidly +sordidness +sore +sorehead +soreheads +sorely +soreness +sorer +sores +sorest +sorghum +sororities +sorority +sorrel +sorrels +sorrier +sorriest +sorrily +sorriness +sorrow +sorrowed +sorrowful +sorrowfully +sorrowfulness +sorrowing +sorrows +sorry +sort +sorta +sorted +sorter +sorters +sortie +sortied +sortieing +sorties +sorting +sorts +sots +sottish +soubriquet +soubriquets +souffle +souffles +sough +soughed +soughing +soughs +sought +soul +soulful +soulfully +soulfulness +soulless +soullessly +souls +sound +soundboard +soundboards +sounded +sounder +sounders +soundest +sounding +soundings +soundless +soundlessly +soundly +soundness +soundproof +soundproofed +soundproofing +soundproofs +sounds +soundtrack +soundtracks +soup +soupcon +soupcons +souped +soupier +soupiest +souping +soups +soupy +sour +source +sourced +sources +sourcing +sourdough +sourdoughs +soured +sourer +sourest +souring +sourish +sourly +sourness +sourpuss +sourpusses +sours +sous +sousaphone +sousaphones +souse +soused +souses +sousing +south +southbound +southeast +southeaster +southeasterly +southeastern +southeasters +southeastward +southeastwards +southerlies +southerly +southern +southerner +southerners +southernmost +southerns +southpaw +southpaws +southward +southwards +southwest +southwester +southwesterly +southwestern +southwesters +southwestward +southwestwards +souvenir +souvenirs +sovereign +sovereigns +sovereignty +soviet +soviets +sowed +sower +sowers +sowing +sown +sows +soya +soybean +soybeans +space +spacecraft +spacecrafts +spaced +spaceflight +spaceflights +spaceman +spacemen +spaceport +spaceports +spacer +spacers +spaces +spaceship +spaceships +spacesuit +spacesuits +spacewalk +spacewalked +spacewalking +spacewalks +spacewoman +spacewomen +spacey +spacier +spaciest +spaciness +spacing +spacious +spaciously +spaciousness +spacy +spade +spaded +spadeful +spadefuls +spades +spadework +spadices +spading +spadix +spadixes +spaghetti +spake +span +spandex +spangle +spangled +spangles +spangling +spaniel +spaniels +spank +spanked +spanking +spankings +spanks +spanned +spanner +spanners +spanning +spans +spar +spare +spared +sparely +spareness +sparer +spareribs +spares +sparest +sparing +sparingly +spark +sparked +sparkier +sparkiest +sparking +sparkle +sparkled +sparkler +sparklers +sparkles +sparkling +sparks +sparky +sparred +sparring +sparrow +sparrows +spars +sparse +sparsely +sparseness +sparser +sparsest +sparsity +spartan +spas +spasm +spasmodic +spasmodically +spasms +spastic +spastics +spat +spate +spates +spathe +spathes +spatial +spatially +spats +spatted +spatter +spattered +spattering +spatters +spatting +spatula +spatulas +spavin +spavined +spawn +spawned +spawning +spawns +spay +spayed +spaying +spays +speak +speakeasies +speakeasy +speaker +speakers +speaking +speaks +spear +speared +spearfish +spearfished +spearfishes +spearfishing +spearhead +spearheaded +spearheading +spearheads +spearing +spearmint +spears +spec +specced +speccing +special +specialist +specialists +specialities +speciality +specialization +specializations +specialize +specialized +specializes +specializing +specially +specials +specialties +specialty +specie +species +specific +specifically +specification +specifications +specificity +specifics +specified +specifies +specify +specifying +specimen +specimens +specious +speciously +speciousness +speck +specked +specking +speckle +speckled +speckles +speckling +specks +specs +spectacle +spectacles +spectacular +spectacularly +spectaculars +spectator +spectators +specter +specters +spectra +spectral +spectre +spectres +spectrometer +spectrometers +spectroscope +spectroscopes +spectroscopic +spectroscopy +spectrum +spectrums +speculate +speculated +speculates +speculating +speculation +speculations +speculative +speculatively +speculator +speculators +sped +speech +speeches +speechless +speechlessly +speechlessness +speed +speedboat +speedboats +speeded +speeder +speeders +speedier +speediest +speedily +speediness +speeding +speedometer +speedometers +speeds +speedster +speedsters +speedup +speedups +speedway +speedways +speedwell +speedy +speleologist +speleologists +speleology +spell +spellbind +spellbinder +spellbinders +spellbinding +spellbinds +spellbound +spelldown +spelldowns +spelled +speller +spellers +spelling +spellings +spells +spelt +spelunker +spelunkers +spelunking +spend +spendable +spender +spenders +spending +spends +spendthrift +spendthrifts +spent +sperm +spermatozoa +spermatozoon +spermicidal +spermicide +spermicides +sperms +spew +spewed +spewer +spewers +spewing +spews +sphagnum +sphagnums +sphere +spheres +spherical +spherically +spheroid +spheroidal +spheroids +sphincter +sphincters +sphinges +sphinx +sphinxes +spice +spiced +spices +spicier +spiciest +spicily +spiciness +spicing +spicule +spicules +spicy +spider +spiders +spiderweb +spiderwebs +spidery +spied +spiel +spieled +spieling +spiels +spies +spiffier +spiffiest +spiffy +spigot +spigots +spike +spiked +spikes +spikier +spikiest +spikiness +spiking +spiky +spill +spillage +spillages +spilled +spilling +spillover +spillovers +spills +spillway +spillways +spilt +spin +spinach +spinal +spinally +spinals +spindle +spindled +spindles +spindlier +spindliest +spindling +spindly +spine +spineless +spinelessly +spines +spinet +spinets +spinier +spiniest +spinnaker +spinnakers +spinner +spinneret +spinnerets +spinners +spinning +spinoff +spinoffs +spins +spinster +spinsterhood +spinsterish +spinsters +spiny +spiracle +spiracles +spiraea +spiraeas +spiral +spiraled +spiraling +spiralled +spiralling +spirally +spirals +spire +spirea +spireas +spires +spirit +spirited +spiriting +spiritless +spirits +spiritual +spiritualism +spiritualist +spiritualistic +spiritualists +spirituality +spiritually +spirituals +spirituous +spirochete +spirochetes +spiry +spit +spitball +spitballs +spite +spited +spiteful +spitefuller +spitefullest +spitefully +spitefulness +spites +spitfire +spitfires +spiting +spits +spitted +spitting +spittle +spittoon +spittoons +splash +splashdown +splashdowns +splashed +splashes +splashier +splashiest +splashily +splashiness +splashing +splashy +splat +splats +splatted +splatter +splattered +splattering +splatters +splatting +splay +splayed +splayfeet +splayfoot +splayfooted +splaying +splays +spleen +spleens +splendid +splendider +splendidest +splendidly +splendor +splendorous +splendour +splenetic +splice +spliced +splicer +splicers +splices +splicing +splint +splinted +splinter +splintered +splintering +splinters +splintery +splinting +splints +split +splits +splitting +splittings +splotch +splotched +splotches +splotchier +splotchiest +splotching +splotchy +splurge +splurged +splurges +splurging +splutter +spluttered +spluttering +splutters +spoil +spoilage +spoiled +spoiler +spoilers +spoiling +spoils +spoilsport +spoilsports +spoilt +spoke +spoken +spokes +spokesman +spokesmen +spokespeople +spokesperson +spokespersons +spokeswoman +spokeswomen +spoliation +sponge +spongecake +spongecakes +sponged +sponger +spongers +sponges +spongier +spongiest +sponginess +sponging +spongy +sponsor +sponsored +sponsoring +sponsors +sponsorship +spontaneity +spontaneous +spontaneously +spoof +spoofed +spoofing +spoofs +spook +spooked +spookier +spookiest +spookiness +spooking +spooks +spooky +spool +spooled +spooling +spools +spoon +spoonbill +spoonbills +spooned +spoonerism +spoonerisms +spoonful +spoonfuls +spooning +spoons +spoonsful +spoor +spoored +spooring +spoors +sporadic +sporadically +spore +spored +spores +sporing +sport +sported +sportier +sportiest +sportiness +sporting +sportingly +sportive +sportively +sports +sportscast +sportscaster +sportscasters +sportscasts +sportsman +sportsmanlike +sportsmanship +sportsmen +sportswear +sportswoman +sportswomen +sportswriter +sportswriters +sporty +spot +spotless +spotlessly +spotlessness +spotlight +spotlighted +spotlighting +spotlights +spotlit +spots +spotted +spotter +spotters +spottier +spottiest +spottily +spottiness +spotting +spotty +spousal +spousals +spouse +spouses +spout +spouted +spouting +spouts +sprain +sprained +spraining +sprains +sprang +sprat +sprats +sprawl +sprawled +sprawling +sprawls +spray +sprayed +sprayer +sprayers +spraying +sprays +spread +spreadable +spreader +spreaders +spreading +spreads +spreadsheet +spreadsheets +spree +sprees +sprier +spriest +sprig +sprightlier +sprightliest +sprightliness +sprightly +sprigs +spring +springboard +springboards +springbok +springboks +springier +springiest +springily +springiness +springing +springlike +springs +springtime +springy +sprinkle +sprinkled +sprinkler +sprinklers +sprinkles +sprinkling +sprinklings +sprint +sprinted +sprinter +sprinters +sprinting +sprints +sprite +sprites +spritz +spritzed +spritzer +spritzers +spritzes +spritzing +sprocket +sprockets +sprout +sprouted +sprouting +sprouts +spruce +spruced +sprucely +spruceness +sprucer +spruces +sprucest +sprucing +sprung +spry +spryer +spryest +spryly +spryness +spud +spuds +spume +spumed +spumes +spumier +spumiest +spuming +spumone +spumoni +spumy +spun +spunk +spunkier +spunkiest +spunky +spur +spurge +spurious +spuriously +spuriousness +spurn +spurned +spurning +spurns +spurred +spurring +spurs +spurt +spurted +spurting +spurts +sputnik +sputniks +sputter +sputtered +sputtering +sputters +sputum +spyglass +spyglasses +spying +squab +squabble +squabbled +squabbler +squabblers +squabbles +squabbling +squabs +squad +squadron +squadrons +squads +squalid +squalider +squalidest +squalidly +squalidness +squall +squalled +squallier +squalliest +squalling +squalls +squally +squalor +squamous +squander +squandered +squandering +squanders +square +squared +squarely +squareness +squarer +squares +squarest +squaring +squarish +squash +squashed +squashes +squashier +squashiest +squashing +squashy +squat +squatness +squats +squatted +squatter +squatters +squattest +squatting +squaw +squawk +squawked +squawker +squawkers +squawking +squawks +squaws +squeak +squeaked +squeaker +squeakers +squeakier +squeakiest +squeakily +squeakiness +squeaking +squeaks +squeaky +squeal +squealed +squealer +squealers +squealing +squeals +squeamish +squeamishly +squeamishness +squeegee +squeegeed +squeegeeing +squeegees +squeezable +squeeze +squeezed +squeezer +squeezers +squeezes +squeezing +squelch +squelched +squelches +squelchier +squelchiest +squelching +squelchy +squib +squibs +squid +squids +squiggle +squiggled +squiggles +squigglier +squiggliest +squiggling +squiggly +squint +squinted +squinter +squintest +squinting +squints +squire +squired +squires +squiring +squirm +squirmed +squirmier +squirmiest +squirming +squirms +squirmy +squirrel +squirreled +squirreling +squirrelled +squirrelling +squirrels +squirt +squirted +squirting +squirts +squish +squished +squishes +squishier +squishiest +squishing +squishy +stab +stabbed +stabber +stabbers +stabbing +stabbings +stability +stabilization +stabilize +stabilized +stabilizer +stabilizers +stabilizes +stabilizing +stable +stabled +stableman +stablemen +stabler +stables +stablest +stabling +stably +stabs +staccati +staccato +staccatos +stack +stacked +stacking +stacks +stadia +stadium +stadiums +staff +staffed +staffer +staffers +staffing +staffs +stag +stage +stagecoach +stagecoaches +stagecraft +staged +stagehand +stagehands +stages +stagestruck +stagflation +stagger +staggered +staggering +staggeringly +staggers +stagier +stagiest +staging +stagings +stagnancy +stagnant +stagnantly +stagnate +stagnated +stagnates +stagnating +stagnation +stags +stagy +staid +staider +staidest +staidly +staidness +stain +stained +staining +stainless +stains +stair +staircase +staircases +stairs +stairway +stairways +stairwell +stairwells +stake +staked +stakeholder +stakeholders +stakeout +stakeouts +stakes +staking +stalactite +stalactites +stalagmite +stalagmites +stale +staled +stalemate +stalemated +stalemates +stalemating +staleness +staler +stales +stalest +staling +stalk +stalked +stalker +stalkers +stalking +stalkings +stalks +stall +stalled +stalling +stallion +stallions +stalls +stalwart +stalwarts +stamen +stamens +stamina +stammer +stammered +stammerer +stammerers +stammering +stammeringly +stammers +stamp +stamped +stampede +stampeded +stampedes +stampeding +stamper +stampers +stamping +stamps +stance +stances +stanch +stanched +stancher +stanches +stanchest +stanching +stanchion +stanchions +stand +standalone +standard +standardization +standardize +standardized +standardizes +standardizing +standards +standby +standbys +standee +standees +stander +standers +standing +standings +standoff +standoffish +standoffs +standout +standouts +standpipe +standpipes +standpoint +standpoints +stands +standstill +standstills +standup +stank +stanza +stanzas +staph +staphylococcal +staphylococci +staphylococcus +staple +stapled +stapler +staplers +staples +stapling +star +starboard +starch +starched +starches +starchier +starchiest +starchily +starchiness +starching +starchy +stardom +stardust +stare +stared +starer +starers +stares +starfish +starfishes +stargaze +stargazed +stargazer +stargazers +stargazes +stargazing +staring +stark +starker +starkest +starkly +starkness +starless +starlet +starlets +starlight +starling +starlings +starlit +starred +starrier +starriest +starring +starry +stars +start +started +starter +starters +starting +startle +startled +startles +startling +starts +starvation +starve +starved +starveling +starvelings +starves +starving +stash +stashed +stashes +stashing +stat +state +statecraft +stated +statehood +statehouse +statehouses +stateless +statelessness +statelier +stateliest +stateliness +stately +statement +statemented +statementing +statements +stateroom +staterooms +states +stateside +statesman +statesmanlike +statesmanship +statesmen +stateswoman +stateswomen +static +statically +stating +station +stationary +stationed +stationer +stationers +stationery +stationing +stations +statistic +statistical +statistically +statistician +statisticians +statistics +stats +statuary +statue +statues +statuesque +statuette +statuettes +stature +statures +status +statuses +statute +statutes +statutorily +statutory +staunch +staunched +stauncher +staunches +staunchest +staunching +staunchly +staunchness +stave +staved +staves +staving +stay +stayed +staying +stays +stead +steadfast +steadfastly +steadfastness +steadied +steadier +steadies +steadiest +steadily +steadiness +steads +steady +steadying +steak +steakhouse +steakhouses +steaks +steal +stealing +steals +stealth +stealthier +stealthiest +stealthily +stealthiness +stealthy +steam +steamboat +steamboats +steamed +steamer +steamers +steamfitter +steamfitters +steamfitting +steamier +steamiest +steaminess +steaming +steamroll +steamrolled +steamroller +steamrollered +steamrollering +steamrollers +steamrolling +steamrolls +steams +steamship +steamships +steamy +steed +steeds +steel +steeled +steelier +steeliest +steeliness +steeling +steels +steelworker +steelworkers +steelworks +steely +steelyard +steelyards +steep +steeped +steepen +steepened +steepening +steepens +steeper +steepest +steeping +steeple +steeplechase +steeplechases +steeplejack +steeplejacks +steeples +steeply +steepness +steeps +steer +steerable +steerage +steered +steering +steers +steersman +steersmen +stegosauri +stegosaurus +stegosauruses +stein +steins +stellar +stem +stemless +stemmed +stemming +stems +stemware +stench +stenches +stencil +stenciled +stenciling +stencilled +stencilling +stencils +steno +stenographer +stenographers +stenographic +stenography +stenos +stentorian +step +stepbrother +stepbrothers +stepchild +stepchildren +stepdaughter +stepdaughters +stepfather +stepfathers +stepladder +stepladders +stepmother +stepmothers +stepparent +stepparents +steppe +stepped +stepper +steppers +steppes +stepping +steppingstone +steppingstones +steps +stepsister +stepsisters +stepson +stepsons +stereo +stereophonic +stereos +stereoscope +stereoscopes +stereoscopic +stereotype +stereotyped +stereotypes +stereotypical +stereotyping +sterile +sterility +sterilization +sterilize +sterilized +sterilizer +sterilizers +sterilizes +sterilizing +sterling +stern +sterna +sterner +sternest +sternly +sternness +sterns +sternum +sternums +steroid +steroidal +steroids +stertorous +stet +stethoscope +stethoscopes +stets +stetson +stetsons +stetted +stetting +stevedore +stevedores +stew +steward +stewarded +stewardess +stewardesses +stewarding +stewards +stewardship +stewed +stewing +stews +stick +sticker +stickers +stickier +stickies +stickiest +stickily +stickiness +sticking +stickleback +sticklebacks +stickler +sticklers +stickpin +stickpins +sticks +stickup +stickups +sticky +sties +stiff +stiffed +stiffen +stiffened +stiffener +stiffeners +stiffening +stiffens +stiffer +stiffest +stiffing +stiffly +stiffness +stiffs +stifle +stifled +stifles +stifling +stiflingly +stigma +stigmas +stigmata +stigmatic +stigmatization +stigmatize +stigmatized +stigmatizes +stigmatizing +stile +stiles +stiletto +stilettoes +stilettos +still +stillbirth +stillbirths +stillborn +stilled +stiller +stillest +stilling +stillness +stills +stilt +stilted +stilts +stimulant +stimulants +stimulate +stimulated +stimulates +stimulating +stimulation +stimulative +stimuli +stimulus +sting +stinger +stingers +stingier +stingiest +stingily +stinginess +stinging +stingray +stingrays +stings +stingy +stink +stinkbug +stinkbugs +stinker +stinkers +stinkier +stinkiest +stinking +stinks +stinky +stint +stinted +stinting +stints +stipend +stipends +stipple +stippled +stipples +stippling +stipulate +stipulated +stipulates +stipulating +stipulation +stipulations +stir +stirred +stirrer +stirrers +stirring +stirringly +stirrings +stirrup +stirrups +stirs +stitch +stitched +stitchery +stitches +stitching +stoat +stoats +stock +stockade +stockaded +stockades +stockading +stockbreeder +stockbreeders +stockbroker +stockbrokers +stockbroking +stocked +stockholder +stockholders +stockier +stockiest +stockily +stockiness +stockinet +stockinette +stocking +stockings +stockpile +stockpiled +stockpiles +stockpiling +stockpot +stockpots +stockroom +stockrooms +stocks +stocktaking +stocky +stockyard +stockyards +stodgier +stodgiest +stodgily +stodginess +stodgy +stogie +stogies +stogy +stoic +stoical +stoically +stoicism +stoics +stoke +stoked +stoker +stokers +stokes +stoking +stole +stolen +stoles +stolid +stolider +stolidest +stolidity +stolidly +stolidness +stolon +stolons +stomach +stomachache +stomachaches +stomached +stomacher +stomachers +stomaching +stomachs +stomp +stomped +stomping +stomps +stone +stoned +stonemason +stonemasons +stones +stonewall +stonewalled +stonewalling +stonewalls +stoneware +stonewashed +stonework +stoney +stonier +stoniest +stonily +stoniness +stoning +stony +stood +stooge +stooges +stool +stools +stoop +stooped +stooping +stoops +stop +stopcock +stopcocks +stopgap +stopgaps +stoplight +stoplights +stopover +stopovers +stoppage +stoppages +stopped +stopper +stoppered +stoppering +stoppers +stopping +stopple +stoppled +stopples +stoppling +stops +stopwatch +stopwatches +storage +store +stored +storefront +storefronts +storehouse +storehouses +storekeeper +storekeepers +storeroom +storerooms +stores +storey +storeys +storied +stories +storing +stork +storks +storm +stormed +stormier +stormiest +stormily +storminess +storming +storms +stormy +story +storyboard +storyboards +storybook +storybooks +storyteller +storytellers +storytelling +stoup +stoups +stout +stouter +stoutest +stouthearted +stoutly +stoutness +stove +stovepipe +stovepipes +stoves +stow +stowage +stowaway +stowaways +stowed +stowing +stows +straddle +straddled +straddler +straddlers +straddles +straddling +strafe +strafed +strafes +strafing +straggle +straggled +straggler +stragglers +straggles +stragglier +straggliest +straggling +straggly +straight +straightaway +straightaways +straightedge +straightedges +straighten +straightened +straightener +straighteners +straightening +straightens +straighter +straightest +straightforward +straightforwardly +straightforwardness +straightforwards +straightjacket +straightjacketed +straightjacketing +straightjackets +straightly +straightness +straights +straightway +strain +strained +strainer +strainers +straining +strains +strait +straiten +straitened +straitening +straitens +straitjacket +straitjacketed +straitjacketing +straitjackets +straitlaced +straits +strand +stranded +stranding +strands +strange +strangely +strangeness +stranger +strangers +strangest +strangle +strangled +stranglehold +strangleholds +strangler +stranglers +strangles +strangling +strangulate +strangulated +strangulates +strangulating +strangulation +strap +strapless +straplesses +strapped +strapping +straps +strata +stratagem +stratagems +strategic +strategical +strategically +strategics +strategies +strategist +strategists +strategy +strati +stratification +stratified +stratifies +stratify +stratifying +stratosphere +stratospheres +stratospheric +stratum +stratums +stratus +straw +strawberries +strawberry +straws +stray +strayed +straying +strays +streak +streaked +streaker +streakers +streakier +streakiest +streaking +streaks +streaky +stream +streamed +streamer +streamers +streaming +streamline +streamlined +streamlines +streamlining +streams +street +streetcar +streetcars +streetlight +streetlights +streets +streetwalker +streetwalkers +streetwise +strength +strengthen +strengthened +strengthener +strengtheners +strengthening +strengthens +strengths +strenuous +strenuously +strenuousness +strep +streptococcal +streptococci +streptococcus +streptomycin +stress +stressed +stresses +stressful +stressing +stretch +stretchable +stretched +stretcher +stretchers +stretches +stretchier +stretchiest +stretching +stretchy +strew +strewed +strewing +strewn +strews +stria +striae +striated +striation +striations +stricken +strict +stricter +strictest +strictly +strictness +stricture +strictures +stridden +stride +stridency +strident +stridently +strides +striding +strife +strike +strikebreaker +strikebreakers +strikeout +strikeouts +striker +strikers +strikes +striking +strikingly +string +stringed +stringency +stringent +stringently +stringer +stringers +stringier +stringiest +stringiness +stringing +strings +stringy +strip +stripe +striped +stripes +stripier +stripiest +striping +stripling +striplings +stripped +stripper +strippers +stripping +strips +stript +striptease +stripteased +stripteaser +stripteasers +stripteases +stripteasing +stripy +strive +strived +striven +strives +striving +strobe +strobes +stroboscope +stroboscopes +stroboscopic +strode +stroke +stroked +strokes +stroking +stroll +strolled +stroller +strollers +strolling +strolls +strong +strongbox +strongboxes +stronger +strongest +stronghold +strongholds +strongly +strongman +strongmen +strontium +strop +strophe +strophes +strophic +stropped +stropping +strops +strove +struck +structural +structurally +structure +structured +structures +structuring +strudel +strudels +struggle +struggled +struggles +struggling +strum +strummed +strumming +strumpet +strumpets +strums +strung +strut +struts +strutted +strutting +strychnine +stub +stubbed +stubbier +stubbiest +stubbing +stubble +stubblier +stubbliest +stubbly +stubborn +stubborner +stubbornest +stubbornly +stubbornness +stubby +stubs +stucco +stuccoed +stuccoes +stuccoing +stuccos +stuck +stud +studbook +studbooks +studded +studding +student +students +studied +studiedly +studies +studio +studios +studious +studiously +studiousness +studs +study +studying +stuff +stuffed +stuffier +stuffiest +stuffily +stuffiness +stuffing +stuffings +stuffs +stuffy +stultification +stultified +stultifies +stultify +stultifying +stumble +stumbled +stumbler +stumblers +stumbles +stumbling +stump +stumped +stumpier +stumpiest +stumping +stumps +stumpy +stun +stung +stunk +stunned +stunning +stunningly +stuns +stunt +stunted +stunting +stunts +stupefaction +stupefied +stupefies +stupefy +stupefying +stupendous +stupendously +stupid +stupider +stupidest +stupidities +stupidity +stupidly +stupids +stupor +stupors +sturdier +sturdiest +sturdily +sturdiness +sturdy +sturgeon +sturgeons +stutter +stuttered +stutterer +stutterers +stuttering +stutters +stye +styes +style +styled +styles +styli +styling +stylish +stylishly +stylishness +stylist +stylistic +stylistically +stylists +stylize +stylized +stylizes +stylizing +stylus +styluses +stymie +stymied +stymieing +stymies +stymy +stymying +styptic +styptics +suasion +suave +suavely +suaveness +suaver +suavest +suavity +subaltern +subalterns +subarctic +subarea +subareas +subatomic +subbasement +subbasements +subbed +subbing +subbranch +subbranches +subcategories +subcategory +subcommittee +subcommittees +subcompact +subcompacts +subconscious +subconsciously +subconsciousness +subcontinent +subcontinental +subcontinents +subcontract +subcontracted +subcontracting +subcontractor +subcontractors +subcontracts +subculture +subcultures +subcutaneous +subcutaneously +subdivide +subdivided +subdivides +subdividing +subdivision +subdivisions +subdue +subdued +subdues +subduing +subfamilies +subfamily +subfreezing +subgroup +subgroups +subhead +subheading +subheadings +subheads +subhuman +subhumans +subject +subjected +subjecting +subjection +subjective +subjectively +subjectivity +subjects +subjoin +subjoined +subjoining +subjoins +subjugate +subjugated +subjugates +subjugating +subjugation +subjunctive +subjunctives +sublease +subleased +subleases +subleasing +sublet +sublets +subletting +sublimate +sublimated +sublimates +sublimating +sublimation +sublime +sublimed +sublimely +sublimer +sublimes +sublimest +subliminal +subliming +sublimity +submarginal +submarine +submariner +submariners +submarines +submerge +submerged +submergence +submerges +submerging +submerse +submersed +submerses +submersible +submersibles +submersing +submersion +submicroscopic +submission +submissions +submissive +submissively +submissiveness +submit +submits +submitted +submitting +subnormal +suborbital +suborder +suborders +subordinate +subordinated +subordinates +subordinating +subordination +suborn +subornation +suborned +suborning +suborns +subpena +subpenaed +subpenaing +subpenas +subplot +subplots +subpoena +subpoenaed +subpoenaing +subpoenas +subprofessional +subprofessionals +subroutine +subroutines +subs +subscribe +subscribed +subscriber +subscribers +subscribes +subscribing +subscript +subscription +subscriptions +subscripts +subsection +subsections +subsequent +subsequently +subservience +subservient +subserviently +subset +subsets +subside +subsided +subsidence +subsides +subsidiaries +subsidiary +subsidies +subsiding +subsidization +subsidize +subsidized +subsidizer +subsidizers +subsidizes +subsidizing +subsidy +subsist +subsisted +subsistence +subsisting +subsists +subsoil +subsonic +subspecies +substance +substances +substandard +substantial +substantially +substantiate +substantiated +substantiates +substantiating +substantiation +substantiations +substantive +substantively +substantives +substation +substations +substitute +substituted +substitutes +substituting +substitution +substitutions +substrata +substrate +substrates +substratum +substratums +substructure +substructures +subsume +subsumed +subsumes +subsuming +subsurface +subsystem +subsystems +subteen +subteens +subtenancy +subtenant +subtenants +subterfuge +subterfuges +subterranean +subtext +subtexts +subtitle +subtitled +subtitles +subtitling +subtle +subtler +subtlest +subtleties +subtlety +subtly +subtopic +subtopics +subtotal +subtotaled +subtotaling +subtotalled +subtotalling +subtotals +subtract +subtracted +subtracting +subtraction +subtractions +subtracts +subtrahend +subtrahends +subtropic +subtropical +subtropics +suburb +suburban +suburbanite +suburbanites +suburbans +suburbia +suburbs +subvention +subventions +subversion +subversive +subversively +subversiveness +subversives +subvert +subverted +subverting +subverts +subway +subways +subzero +succeed +succeeded +succeeding +succeeds +success +successes +successful +successfully +succession +successions +successive +successively +successor +successors +succinct +succincter +succinctest +succinctly +succinctness +succor +succored +succoring +succors +succotash +succour +succoured +succouring +succours +succulence +succulency +succulent +succulents +succumb +succumbed +succumbing +succumbs +such +suchlike +suck +sucked +sucker +suckered +suckering +suckers +sucking +suckle +suckled +suckles +suckling +sucklings +sucks +sucrose +suction +suctioned +suctioning +suctions +sudden +suddenly +suddenness +suds +sudsier +sudsiest +sudsy +sued +suede +sues +suet +suety +suffer +sufferance +suffered +sufferer +sufferers +suffering +sufferings +suffers +suffice +sufficed +suffices +sufficiency +sufficient +sufficiently +sufficing +suffix +suffixation +suffixed +suffixes +suffixing +suffocate +suffocated +suffocates +suffocating +suffocation +suffragan +suffragans +suffrage +suffragette +suffragettes +suffragist +suffragists +suffuse +suffused +suffuses +suffusing +suffusion +sugar +sugarcane +sugarcoat +sugarcoated +sugarcoating +sugarcoats +sugared +sugarier +sugariest +sugaring +sugarless +sugarplum +sugarplums +sugars +sugary +suggest +suggested +suggestibility +suggestible +suggesting +suggestion +suggestions +suggestive +suggestively +suggestiveness +suggests +suicidal +suicide +suicides +suing +suit +suitability +suitable +suitableness +suitably +suitcase +suitcases +suite +suited +suites +suiting +suitor +suitors +suits +sukiyaki +sulfa +sulfate +sulfates +sulfide +sulfides +sulfur +sulfuric +sulfurous +sulk +sulked +sulkier +sulkies +sulkiest +sulkily +sulkiness +sulking +sulks +sulky +sullen +sullener +sullenest +sullenly +sullenness +sullied +sullies +sully +sullying +sulphur +sulphured +sulphuring +sulphurous +sulphurs +sultan +sultana +sultanas +sultanate +sultanates +sultans +sultrier +sultriest +sultrily +sultriness +sultry +sumac +sumach +summaries +summarily +summarize +summarized +summarizes +summarizing +summary +summation +summations +summed +summer +summered +summerhouse +summerhouses +summering +summers +summertime +summery +summing +summit +summitry +summits +summon +summoned +summoner +summoners +summoning +summons +summonsed +summonses +summonsing +sumo +sump +sumps +sumptuous +sumptuously +sumptuousness +sums +sunbath +sunbathe +sunbathed +sunbather +sunbathers +sunbathes +sunbathing +sunbaths +sunbeam +sunbeams +sunbelt +sunbelts +sunblock +sunblocks +sunbonnet +sunbonnets +sunburn +sunburned +sunburning +sunburns +sunburnt +sunburst +sunbursts +sundae +sundaes +sunder +sundered +sundering +sunders +sundial +sundials +sundown +sundowns +sundries +sundry +sunfish +sunfishes +sunflower +sunflowers +sung +sunglasses +sunk +sunken +sunlamp +sunlamps +sunless +sunlight +sunlit +sunned +sunnier +sunniest +sunniness +sunning +sunny +sunrise +sunrises +sunroof +sunroofs +suns +sunscreen +sunscreens +sunset +sunsets +sunshade +sunshades +sunshine +sunshiny +sunspot +sunspots +sunstroke +suntan +suntanned +suntanning +suntans +sunup +super +superabundance +superabundances +superabundant +superannuate +superannuated +superannuates +superannuating +superannuation +superb +superber +superbest +superbly +supercargo +supercargoes +supercargos +supercharge +supercharged +supercharger +superchargers +supercharges +supercharging +supercilious +superciliously +superciliousness +supercities +supercity +supercomputer +supercomputers +superconducting +superconductive +superconductivity +superconductor +superconductors +superego +superegos +supererogation +supererogatory +superficial +superficiality +superficially +superfine +superfluity +superfluous +superfluously +superfluousness +superhero +superheroes +superhighway +superhighways +superhuman +superimpose +superimposed +superimposes +superimposing +superimposition +superintend +superintended +superintendence +superintendency +superintendent +superintendents +superintending +superintends +superior +superiority +superiors +superlative +superlatively +superlatives +superman +supermarket +supermarkets +supermen +supermom +supermoms +supernal +supernatural +supernaturally +supernova +supernovae +supernovas +supernumeraries +supernumerary +superpose +superposed +superposes +superposing +superposition +superpower +superpowers +supers +supersaturate +supersaturated +supersaturates +supersaturating +supersaturation +superscribe +superscribed +superscribes +superscribing +superscript +superscription +superscripts +supersede +superseded +supersedes +superseding +supersonic +superstar +superstars +superstition +superstitions +superstitious +superstitiously +superstore +superstores +superstructure +superstructures +supertanker +supertankers +supervene +supervened +supervenes +supervening +supervention +supervise +supervised +supervises +supervising +supervision +supervisor +supervisors +supervisory +superwoman +superwomen +supine +supped +supper +suppers +supping +supplant +supplanted +supplanting +supplants +supple +supplement +supplemental +supplementary +supplementation +supplemented +supplementing +supplements +suppleness +suppler +supplest +suppliant +suppliants +supplicant +supplicants +supplicate +supplicated +supplicates +supplicating +supplication +supplications +supplied +supplier +suppliers +supplies +supply +supplying +support +supportable +supported +supporter +supporters +supporting +supportive +supports +suppose +supposed +supposedly +supposes +supposing +supposition +suppositions +suppositories +suppository +suppress +suppressant +suppressants +suppressed +suppresses +suppressible +suppressing +suppression +suppressor +suppressors +suppurate +suppurated +suppurates +suppurating +suppuration +supra +supranational +supremacist +supremacists +supremacy +supreme +supremely +sups +surcease +surceased +surceases +surceasing +surcharge +surcharged +surcharges +surcharging +surcingle +surcingles +sure +surefire +surefooted +surely +sureness +surer +surest +sureties +surety +surf +surface +surfaced +surfaces +surfacing +surfboard +surfboarded +surfboarding +surfboards +surfed +surfeit +surfeited +surfeiting +surfeits +surfer +surfers +surfing +surfs +surge +surged +surgeon +surgeons +surgeries +surgery +surges +surgical +surgically +surging +surlier +surliest +surliness +surly +surmise +surmised +surmises +surmising +surmount +surmountable +surmounted +surmounting +surmounts +surname +surnames +surpass +surpassed +surpasses +surpassing +surplice +surplices +surplus +surplused +surpluses +surplusing +surplussed +surplussing +surprise +surprised +surprises +surprising +surprisingly +surreal +surrealism +surrealist +surrealistic +surrealistically +surrealists +surrender +surrendered +surrendering +surrenders +surreptitious +surreptitiously +surreptitiousness +surrey +surreys +surrogacy +surrogate +surrogates +surround +surrounded +surrounding +surroundings +surrounds +surtax +surtaxed +surtaxes +surtaxing +surveillance +survey +surveyed +surveying +surveyor +surveyors +surveys +survival +survivalist +survivalists +survivals +survive +survived +survives +surviving +survivor +survivors +susceptibility +susceptible +sushi +suspect +suspected +suspecting +suspects +suspend +suspended +suspender +suspenders +suspending +suspends +suspense +suspenseful +suspension +suspensions +suspicion +suspicions +suspicious +suspiciously +sustain +sustainable +sustained +sustaining +sustains +sustenance +sutler +sutlers +suture +sutured +sutures +suturing +suzerain +suzerains +suzerainty +svelte +svelter +sveltest +swab +swabbed +swabbing +swabs +swaddle +swaddled +swaddles +swaddling +swag +swagged +swagger +swaggered +swaggering +swaggers +swagging +swags +swain +swains +swallow +swallowed +swallowing +swallows +swallowtail +swallowtails +swam +swami +swamis +swamp +swamped +swampier +swampiest +swamping +swampland +swamps +swampy +swan +swank +swanked +swanker +swankest +swankier +swankiest +swankily +swankiness +swanking +swanks +swanky +swans +swansdown +swap +swapped +swapping +swaps +sward +swards +swarm +swarmed +swarming +swarms +swarthier +swarthiest +swarthy +swash +swashbuckler +swashbucklers +swashbuckling +swashed +swashes +swashing +swastika +swastikas +swat +swatch +swatches +swath +swathe +swathed +swathes +swathing +swaths +swats +swatted +swatter +swatters +swatting +sway +swayback +swaybacked +swayed +swaying +sways +swear +swearer +swearers +swearing +swears +swearword +swearwords +sweat +sweatband +sweatbands +sweated +sweater +sweaters +sweatier +sweatiest +sweating +sweatpants +sweats +sweatshirt +sweatshirts +sweatshop +sweatshops +sweaty +swede +swedes +sweep +sweeper +sweepers +sweeping +sweepingly +sweepings +sweeps +sweepstake +sweepstakes +sweet +sweetbread +sweetbreads +sweetbriar +sweetbriars +sweetbrier +sweetbriers +sweeten +sweetened +sweetener +sweeteners +sweetening +sweetens +sweeter +sweetest +sweetheart +sweethearts +sweetie +sweeties +sweetish +sweetly +sweetmeat +sweetmeats +sweetness +sweets +swell +swelled +sweller +swellest +swellhead +swellheaded +swellheads +swelling +swellings +swells +swelter +sweltered +sweltering +swelters +swept +sweptback +swerve +swerved +swerves +swerving +swift +swifter +swiftest +swiftly +swiftness +swifts +swig +swigged +swigging +swigs +swill +swilled +swilling +swills +swim +swimmer +swimmers +swimming +swimmingly +swims +swimsuit +swimsuits +swindle +swindled +swindler +swindlers +swindles +swindling +swine +swineherd +swineherds +swines +swing +swinger +swingers +swinging +swings +swinish +swipe +swiped +swipes +swiping +swirl +swirled +swirlier +swirliest +swirling +swirls +swirly +swish +swished +swisher +swishes +swishest +swishing +switch +switchback +switchbacks +switchblade +switchblades +switchboard +switchboards +switched +switcher +switchers +switches +switching +swivel +swiveled +swiveling +swivelled +swivelling +swivels +swob +swobbed +swobbing +swobs +swollen +swoon +swooned +swooning +swoons +swoop +swooped +swooping +swoops +swoosh +swooshed +swooshes +swooshing +swop +swopped +swopping +swops +sword +swordfish +swordfishes +swordplay +swords +swordsman +swordsmanship +swordsmen +swore +sworn +swum +swung +sybarite +sybarites +sybaritic +sycamore +sycamores +sycophancy +sycophant +sycophantic +sycophants +syllabi +syllabic +syllabicate +syllabicated +syllabicates +syllabicating +syllabication +syllabification +syllabified +syllabifies +syllabify +syllabifying +syllable +syllables +syllabus +syllabuses +syllogism +syllogisms +syllogistic +sylph +sylphic +sylphlike +sylphs +sylvan +symbioses +symbiosis +symbiotic +symbol +symbolic +symbolical +symbolically +symbolism +symbolization +symbolize +symbolized +symbolizes +symbolizing +symbols +symmetric +symmetrical +symmetrically +symmetry +sympathetic +sympathetically +sympathies +sympathize +sympathized +sympathizer +sympathizers +sympathizes +sympathizing +sympathy +symphonic +symphonies +symphony +symposia +symposium +symposiums +symptom +symptomatic +symptomatically +symptoms +synagog +synagogal +synagogs +synagogue +synagogues +synapse +synapses +synaptic +sync +synced +synch +synched +synching +synchronization +synchronizations +synchronize +synchronized +synchronizes +synchronizing +synchronous +synchs +syncing +syncopate +syncopated +syncopates +syncopating +syncopation +syncope +syncs +syndicate +syndicated +syndicates +syndicating +syndication +syndrome +syndromes +synergism +synergistic +synergy +synfuel +synfuels +synod +synods +synonym +synonymous +synonyms +synonymy +synopses +synopsis +synoptic +syntactic +syntactical +syntactically +syntax +syntheses +synthesis +synthesize +synthesized +synthesizer +synthesizers +synthesizes +synthesizing +synthetic +synthetically +synthetics +syphilis +syphilitic +syphilitics +syphon +syphoned +syphoning +syphons +syringe +syringed +syringes +syringing +syrup +syrups +syrupy +system +systematic +systematical +systematically +systematization +systematize +systematized +systematizes +systematizing +systemic +systemically +systemics +systems +systole +systoles +systolic +tabbed +tabbies +tabbing +tabbouleh +tabby +tabernacle +tabernacles +tabla +tablas +table +tableau +tableaus +tableaux +tablecloth +tablecloths +tabled +tableland +tablelands +tables +tablespoon +tablespoonful +tablespoonfuls +tablespoons +tablespoonsful +tablet +tabletop +tabletops +tablets +tableware +tabling +tabloid +tabloids +taboo +tabooed +tabooing +taboos +tabor +tabors +tabs +tabu +tabued +tabuing +tabular +tabulate +tabulated +tabulates +tabulating +tabulation +tabulator +tabulators +tabus +tachometer +tachometers +tachycardia +tacit +tacitly +tacitness +taciturn +taciturnity +taciturnly +tack +tacked +tacker +tackers +tackier +tackiest +tackiness +tacking +tackle +tackled +tackler +tacklers +tackles +tackling +tacks +tacky +taco +tacos +tact +tactful +tactfully +tactfulness +tactic +tactical +tactically +tactician +tacticians +tactics +tactile +tactility +tactless +tactlessly +tactlessness +tadpole +tadpoles +tads +taffeta +taffies +taffrail +taffrails +taffy +tagged +tagger +taggers +tagging +tags +taiga +taigas +tail +tailback +tailbacks +tailcoat +tailcoats +tailed +tailgate +tailgated +tailgater +tailgaters +tailgates +tailgating +tailing +tailless +taillight +taillights +tailor +tailored +tailoring +tailors +tailpipe +tailpipes +tails +tailspin +tailspins +tailwind +tailwinds +taint +tainted +tainting +taints +take +taken +takeoff +takeoffs +takeout +takeouts +takeover +takeovers +taker +takers +takes +taking +takings +talc +talcum +tale +talebearer +talebearers +talent +talented +talents +tales +tali +talisman +talismans +talk +talkative +talkatively +talkativeness +talked +talker +talkers +talkie +talkier +talkies +talkiest +talking +talks +talky +tall +tallboy +tallboys +taller +tallest +tallied +tallier +talliers +tallies +tallish +tallness +tallow +tallowy +tally +tallyho +tallyhoed +tallyhoing +tallyhos +tallying +talon +talons +talus +taluses +tamable +tamale +tamales +tamarack +tamaracks +tamarind +tamarinds +tambourine +tambourines +tame +tameable +tamed +tamely +tameness +tamer +tamers +tames +tamest +taming +tamp +tamped +tamper +tampered +tamperer +tamperers +tampering +tampers +tamping +tampon +tampons +tamps +tams +tanager +tanagers +tanbark +tandem +tandems +tandoori +tang +tangelo +tangelos +tangent +tangential +tangentially +tangents +tangerine +tangerines +tangibility +tangible +tangibleness +tangibles +tangibly +tangier +tangiest +tangle +tangled +tangles +tangling +tango +tangoed +tangoing +tangos +tangs +tangy +tank +tankard +tankards +tanked +tanker +tankers +tankful +tankfuls +tanking +tanks +tanned +tanner +tanneries +tanners +tannery +tannest +tannin +tanning +tans +tansy +tantalise +tantalised +tantalises +tantalising +tantalization +tantalize +tantalized +tantalizer +tantalizers +tantalizes +tantalizing +tantalizingly +tantalum +tantamount +tantra +tantrum +tantrums +tape +taped +tapeline +tapelines +taper +tapered +tapering +tapers +tapes +tapestries +tapestry +tapeworm +tapeworms +taping +tapioca +tapir +tapirs +tapped +tapper +tappers +tappet +tappets +tapping +taproom +taprooms +taproot +taproots +taps +tarantella +tarantellas +tarantula +tarantulae +tarantulas +tardier +tardiest +tardily +tardiness +tardy +tare +tared +tares +target +targeted +targeting +targets +tariff +tariffs +taring +tarmac +tarmacked +tarmacking +tarmacs +tarn +tarnish +tarnished +tarnishes +tarnishing +tarns +taro +taros +tarot +tarots +tarp +tarpaulin +tarpaulins +tarpon +tarpons +tarps +tarragon +tarragons +tarred +tarried +tarrier +tarries +tarriest +tarring +tarry +tarrying +tars +tarsal +tarsals +tarsi +tarsus +tart +tartan +tartans +tartar +tartaric +tartars +tarter +tartest +tartly +tartness +tarts +task +tasked +tasking +taskmaster +taskmasters +taskmistress +taskmistresses +tasks +tassel +tasseled +tasseling +tasselled +tasselling +tassels +taste +tasted +tasteful +tastefully +tastefulness +tasteless +tastelessly +tastelessness +taster +tasters +tastes +tastier +tastiest +tastily +tastiness +tasting +tastings +tasty +tatami +tatamis +tater +taters +tats +tatted +tatter +tatterdemalion +tatterdemalions +tattered +tattering +tatters +tatting +tattle +tattled +tattler +tattlers +tattles +tattletale +tattletales +tattling +tattoo +tattooed +tattooer +tattooers +tattooing +tattooist +tattooists +tattoos +taught +taunt +taunted +taunter +taunters +taunting +tauntingly +taunts +taupe +taus +taut +tauten +tautened +tautening +tautens +tauter +tautest +tautly +tautness +tautological +tautologically +tautologies +tautologous +tautology +tavern +taverns +tawdrier +tawdriest +tawdrily +tawdriness +tawdry +tawnier +tawniest +tawny +taxable +taxation +taxed +taxer +taxers +taxes +taxi +taxicab +taxicabs +taxidermist +taxidermists +taxidermy +taxied +taxies +taxiing +taximeter +taximeters +taxing +taxis +taxonomic +taxonomical +taxonomies +taxonomist +taxonomists +taxonomy +taxpayer +taxpayers +taxpaying +taxying +teacake +teacakes +teach +teachable +teacher +teachers +teaches +teaching +teachings +teacup +teacupful +teacupfuls +teacups +teak +teakettle +teakettles +teaks +teal +teals +team +teamed +teaming +teammate +teammates +teams +teamster +teamsters +teamwork +teapot +teapots +tear +teardrop +teardrops +teared +tearful +tearfully +teargas +teargases +teargassed +teargasses +teargassing +tearier +teariest +tearing +tearjerker +tearjerkers +tearoom +tearooms +tears +teary +teas +tease +teased +teasel +teasels +teaser +teasers +teases +teasing +teaspoon +teaspoonful +teaspoonfuls +teaspoons +teaspoonsful +teat +teats +tech +technetium +technical +technicalities +technicality +technically +technician +technicians +technique +techniques +technocracy +technocrat +technocratic +technocrats +technological +technologically +technologies +technologist +technologists +technology +techs +tectonic +tectonics +tedious +tediously +tediousness +tedium +teed +teeing +teem +teemed +teeming +teems +teen +teenage +teenaged +teenager +teenagers +teenier +teeniest +teens +teensier +teensiest +teensy +teeny +teenybopper +teenyboppers +teepee +teepees +tees +teeter +teetered +teetering +teeters +teeth +teethe +teethed +teethes +teething +teetotal +teetotaler +teetotalers +teetotalism +teetotaller +teetotallers +tektite +tektites +telecast +telecasted +telecaster +telecasters +telecasting +telecasts +telecommunication +telecommunications +telecommute +telecommuted +telecommuter +telecommuters +telecommutes +telecommuting +teleconference +teleconferenced +teleconferences +teleconferencing +telegenic +telegram +telegrams +telegraph +telegraphed +telegrapher +telegraphers +telegraphic +telegraphically +telegraphing +telegraphist +telegraphists +telegraphs +telegraphy +telekinesis +telekinetic +telemarketer +telemarketers +telemarketing +telemeter +telemeters +telemetries +telemetry +telepathic +telepathically +telepathy +telephone +telephoned +telephoner +telephoners +telephones +telephonic +telephoning +telephony +telephoto +telephotography +telephotos +teleplay +teleplays +teleprinter +teleprinters +teleprocessing +teleprompter +teleprompters +telescope +telescoped +telescopes +telescopic +telescopically +telescoping +teletext +teletexts +telethon +telethons +teletypewriter +teletypewriters +televangelism +televangelist +televangelists +televise +televised +televises +televising +television +televisions +telex +telexed +telexes +telexing +tell +teller +tellers +tellies +telling +tellingly +tells +telltale +telltales +tellurium +telly +temblor +temblors +temerity +temp +temped +temper +tempera +temperament +temperamental +temperamentally +temperaments +temperance +temperas +temperate +temperately +temperateness +temperature +temperatures +tempered +tempering +tempers +tempest +tempests +tempestuous +tempestuously +tempestuousness +tempi +temping +template +templates +temple +temples +tempo +temporal +temporally +temporaries +temporarily +temporariness +temporary +temporize +temporized +temporizer +temporizers +temporizes +temporizing +tempos +temps +tempt +temptation +temptations +tempted +tempter +tempters +tempting +temptingly +temptress +temptresses +tempts +tempura +tenability +tenable +tenably +tenacious +tenaciously +tenaciousness +tenacity +tenancies +tenancy +tenant +tenanted +tenanting +tenantry +tenants +tend +tended +tendencies +tendency +tendentious +tendentiously +tendentiousness +tender +tendered +tenderer +tenderest +tenderfeet +tenderfoot +tenderfoots +tenderhearted +tenderheartedness +tendering +tenderize +tenderized +tenderizer +tenderizers +tenderizes +tenderizing +tenderloin +tenderloins +tenderly +tenderness +tenders +tending +tendinitis +tendon +tendonitis +tendons +tendril +tendrils +tends +tenement +tenements +tenet +tenets +tenfold +tennis +tenon +tenoned +tenoning +tenons +tenor +tenors +tenpin +tenpins +tens +tense +tensed +tensely +tenseness +tenser +tenses +tensest +tensile +tensing +tension +tensions +tensity +tent +tentacle +tentacled +tentacles +tentative +tentatively +tentativeness +tented +tenterhook +tenterhooks +tenth +tenthly +tenths +tenting +tents +tenuity +tenuous +tenuously +tenuousness +tenure +tenured +tenures +tenuring +tepee +tepees +tepid +tepider +tepidest +tepidity +tepidly +tepidness +tequila +tequilas +terabyte +terabytes +terbium +tercentenaries +tercentenary +tercentennial +tercentennials +term +termagant +termagants +termed +terminable +terminal +terminally +terminals +terminate +terminated +terminates +terminating +termination +terminations +terming +termini +terminological +terminologically +terminologies +terminology +terminus +terminuses +termite +termites +termly +terms +tern +ternaries +ternary +terns +terrace +terraced +terraces +terracing +terracotta +terrain +terrains +terrapin +terrapins +terraria +terrarium +terrariums +terrazzo +terrazzos +terrestrial +terrestrially +terrestrials +terrible +terribleness +terribly +terrier +terriers +terrific +terrifically +terrified +terrifies +terrify +terrifying +terrifyingly +territorial +territorials +territories +territory +terror +terrorism +terrorist +terrorists +terrorize +terrorized +terrorizes +terrorizing +terrors +terry +terrycloth +terse +tersely +terseness +terser +tersest +tertiary +tessellate +tessellated +tessellates +tessellating +tessellation +tessellations +test +testament +testamentary +testaments +testate +testator +testators +testatrices +testatrix +tested +tester +testers +testes +testicle +testicles +testier +testiest +testified +testifier +testifiers +testifies +testify +testifying +testily +testimonial +testimonials +testimonies +testimony +testiness +testing +testis +testosterone +tests +testy +tetanus +tetchier +tetchiest +tetchy +tether +tethered +tethering +tethers +tetra +tetracycline +tetrahedra +tetrahedral +tetrahedron +tetrahedrons +tetrameter +tetrameters +tetras +text +textbook +textbooks +textile +textiles +texts +textual +textually +textural +texture +textured +textures +texturing +thalami +thalamus +thalidomide +thallium +than +thane +thanes +thank +thanked +thankful +thankfully +thankfulness +thanking +thankless +thanklessly +thanklessness +thanks +thanksgiving +thanksgivings +that +thatch +thatched +thatcher +thatchers +thatches +thatching +thaw +thawed +thawing +thaws +theater +theatergoer +theatergoers +theaters +theatre +theatres +theatrical +theatricality +theatrically +theatricals +theatrics +thee +theft +thefts +their +theirs +theism +theist +theistic +theists +them +thematic +thematically +theme +themes +themselves +then +thence +thenceforth +thenceforward +theocracies +theocracy +theocratic +theologian +theologians +theological +theologically +theologies +theology +theorem +theorems +theoretic +theoretical +theoretically +theoretician +theoreticians +theories +theorist +theorists +theorize +theorized +theorizes +theorizing +theory +theosophic +theosophical +theosophist +theosophists +theosophy +therapeutic +therapeutically +therapeutics +therapies +therapist +therapists +therapy +there +thereabout +thereabouts +thereafter +thereat +thereby +therefor +therefore +therein +thereof +thereon +thereto +theretofore +thereunto +thereupon +therewith +therm +thermal +thermally +thermals +thermodynamic +thermodynamics +thermometer +thermometers +thermometric +thermonuclear +thermoplastic +thermoplastics +thermos +thermoses +thermostat +thermostatic +thermostatically +thermostats +therms +thesauri +thesaurus +thesauruses +these +theses +thesis +thespian +thespians +theta +thetas +thew +thews +they +thiamin +thiamine +thick +thicken +thickened +thickener +thickeners +thickening +thickenings +thickens +thicker +thickest +thicket +thickets +thickheaded +thickly +thickness +thicknesses +thickset +thief +thieve +thieved +thievery +thieves +thieving +thievish +thigh +thighbone +thighbones +thighs +thimble +thimbleful +thimblefuls +thimbles +thin +thine +thing +thingamabob +thingamabobs +thingamajig +thingamajigs +things +think +thinkable +thinker +thinkers +thinking +thinks +thinly +thinned +thinner +thinners +thinness +thinnest +thinning +thins +third +thirdly +thirds +thirst +thirsted +thirstier +thirstiest +thirstily +thirstiness +thirsting +thirsts +thirsty +thirteen +thirteens +thirteenth +thirteenths +thirties +thirtieth +thirtieths +thirty +this +thistle +thistledown +thistles +thither +thole +tholes +thong +thongs +thoraces +thoracic +thorax +thoraxes +thorium +thorn +thornier +thorniest +thorniness +thorns +thorny +thorough +thoroughbred +thoroughbreds +thorougher +thoroughest +thoroughfare +thoroughfares +thoroughgoing +thoroughly +thoroughness +those +thou +though +thought +thoughtful +thoughtfully +thoughtfulness +thoughtless +thoughtlessly +thoughtlessness +thoughts +thous +thousand +thousandfold +thousands +thousandth +thousandths +thraldom +thrall +thralldom +thralled +thralling +thralls +thrash +thrashed +thrasher +thrashers +thrashes +thrashing +thrashings +thread +threadbare +threaded +threader +threaders +threadier +threadiest +threading +threadlike +threads +thready +threat +threaten +threatened +threatening +threateningly +threatens +threats +three +threefold +threepence +threepences +threes +threescore +threescores +threesome +threesomes +threnodies +threnody +thresh +threshed +thresher +threshers +threshes +threshing +threshold +thresholds +threw +thrice +thrift +thriftier +thriftiest +thriftily +thriftiness +thriftless +thrifts +thrifty +thrill +thrilled +thriller +thrillers +thrilling +thrillingly +thrills +thrive +thrived +thriven +thrives +thriving +throat +throatier +throatiest +throatily +throatiness +throats +throaty +throb +throbbed +throbbing +throbs +throe +throes +thrombi +thromboses +thrombosis +thrombotic +thrombus +throne +thrones +throng +thronged +thronging +throngs +throttle +throttled +throttler +throttlers +throttles +throttling +through +throughout +throughput +throughway +throughways +throve +throw +throwaway +throwaways +throwback +throwbacks +thrower +throwers +throwing +thrown +throws +thru +thrum +thrummed +thrumming +thrums +thrush +thrushes +thrust +thrusting +thrusts +thruway +thruways +thud +thudded +thudding +thuds +thug +thuggery +thuggish +thugs +thulium +thumb +thumbed +thumbing +thumbnail +thumbnails +thumbprint +thumbprints +thumbs +thumbscrew +thumbscrews +thumbtack +thumbtacks +thump +thumped +thumping +thumpings +thumps +thunder +thunderbolt +thunderbolts +thunderclap +thunderclaps +thundercloud +thunderclouds +thundered +thunderer +thunderers +thunderhead +thunderheads +thundering +thunderous +thunderously +thunders +thundershower +thundershowers +thunderstorm +thunderstorms +thunderstricken +thunderstruck +thus +thwack +thwacked +thwacker +thwackers +thwacking +thwacks +thwart +thwarted +thwarting +thwarts +thyme +thymi +thymine +thymus +thymuses +thyroid +thyroidal +thyroids +thyself +tiara +tiaras +tibia +tibiae +tibial +tibias +tick +ticked +ticker +tickers +ticket +ticketed +ticketing +tickets +ticking +tickle +tickled +tickler +ticklers +tickles +tickling +ticklish +ticklishly +ticklishness +ticks +ticktacktoe +ticktock +ticktocks +tics +tidal +tidally +tidbit +tidbits +tiddlywinks +tide +tided +tideland +tidelands +tides +tidewater +tidewaters +tideway +tideways +tidied +tidier +tidies +tidiest +tidily +tidiness +tiding +tidings +tidy +tidying +tieback +tiebacks +tiebreaker +tiebreakers +tied +tieing +tier +tiered +tiers +ties +tiff +tiffed +tiffing +tiffs +tiger +tigerish +tigers +tight +tighten +tightened +tightener +tighteners +tightening +tightens +tighter +tightest +tightfisted +tightly +tightness +tightrope +tightropes +tights +tightwad +tightwads +tigress +tigresses +tike +tikes +tilde +tildes +tile +tiled +tiler +tilers +tiles +tiling +till +tillable +tillage +tilled +tiller +tillers +tilling +tills +tilt +tilted +tilting +tilts +timber +timbered +timbering +timberland +timberline +timberlines +timbers +timbre +timbrel +timbrels +timbres +time +timed +timekeeper +timekeepers +timekeeping +timeless +timelessly +timelessness +timelier +timeliest +timeliness +timely +timeout +timeouts +timepiece +timepieces +timer +timers +times +timeserver +timeservers +timeserving +timetable +timetabled +timetables +timetabling +timeworn +timid +timider +timidest +timidity +timidly +timidness +timing +timorous +timorously +timorousness +timothy +timpani +timpanist +timpanists +tincture +tinctured +tinctures +tincturing +tinder +tinderbox +tinderboxes +tine +tines +tinfoil +ting +tinge +tinged +tingeing +tinges +tinging +tingle +tingled +tingles +tinglier +tingliest +tingling +tinglings +tingly +tings +tinier +tiniest +tininess +tinker +tinkered +tinkerer +tinkerers +tinkering +tinkers +tinkle +tinkled +tinkles +tinkling +tinned +tinnier +tinniest +tinniness +tinning +tinnitus +tinny +tinplate +tins +tinsel +tinseled +tinseling +tinselled +tinselling +tinsels +tinsmith +tinsmiths +tint +tinted +tinting +tintinnabulation +tintinnabulations +tints +tintype +tintypes +tinware +tiny +tipi +tipis +tipped +tipper +tippers +tippet +tippets +tipping +tipple +tippled +tippler +tipplers +tipples +tippling +tips +tipsier +tipsiest +tipsily +tipsiness +tipster +tipsters +tipsy +tiptoe +tiptoed +tiptoeing +tiptoes +tiptop +tiptops +tirade +tirades +tire +tired +tireder +tiredest +tiredly +tiredness +tireless +tirelessly +tirelessness +tires +tiresome +tiresomely +tiresomeness +tiring +tiro +tiros +tissue +tissues +titan +titanic +titanium +titans +titbit +titbits +tithe +tithed +tither +tithers +tithes +tithing +titian +titillate +titillated +titillates +titillating +titillatingly +titillation +titivate +titivated +titivates +titivating +titivation +title +titled +titleholder +titleholders +titles +titling +titlist +titlists +titmice +titmouse +tits +titter +tittered +tittering +titters +tittivate +tittivated +tittivates +tittivating +tittle +tittles +titular +tizzies +tizzy +toad +toadied +toadies +toads +toadstool +toadstools +toady +toadying +toadyism +toast +toasted +toaster +toasters +toastier +toastiest +toasting +toastmaster +toastmasters +toastmistress +toastmistresses +toasts +toasty +tobacco +tobaccoes +tobacconist +tobacconists +tobaccos +toboggan +tobogganed +tobogganer +tobogganers +tobogganing +toboggans +tocsin +tocsins +today +toddies +toddle +toddled +toddler +toddlers +toddles +toddling +toddy +toecap +toecaps +toed +toehold +toeholds +toeing +toenail +toenails +toes +toffee +toffees +toffies +toffy +tofu +toga +togae +togaed +togas +together +togetherness +togged +togging +toggle +toggled +toggles +toggling +togs +toil +toiled +toiler +toilers +toilet +toileted +toileting +toiletries +toiletry +toilets +toilette +toiling +toils +toilsome +toke +toked +token +tokenism +tokens +tokes +toking +told +tole +tolerable +tolerably +tolerance +tolerances +tolerant +tolerantly +tolerate +tolerated +tolerates +tolerating +toleration +toll +tollbooth +tollbooths +tolled +tollgate +tollgates +tolling +tolls +tollway +tollways +toluene +tomahawk +tomahawked +tomahawking +tomahawks +tomato +tomatoes +tomb +tombed +tombing +tomboy +tomboyish +tomboys +tombs +tombstone +tombstones +tomcat +tomcats +tome +tomes +tomfooleries +tomfoolery +tomographic +tomography +tomorrow +tomorrows +toms +tomtit +tomtits +tonal +tonalities +tonality +tonally +tone +tonearm +tonearms +toned +toneless +tonelessly +toner +tones +tong +tonged +tonging +tongs +tongue +tongued +tongueless +tongues +tonguing +tonic +tonics +tonier +toniest +tonight +toning +tonnage +tonnages +tonne +tonnes +tons +tonsil +tonsillectomies +tonsillectomy +tonsillitis +tonsils +tonsorial +tonsure +tonsured +tonsures +tonsuring +tony +took +tool +toolbox +toolboxes +tooled +tooling +toolmaker +toolmakers +tools +toot +tooted +tooter +tooters +tooth +toothache +toothaches +toothbrush +toothbrushes +toothed +toothier +toothiest +toothily +toothless +toothpaste +toothpastes +toothpick +toothpicks +toothsome +toothy +tooting +tootle +tootled +tootles +tootling +toots +topaz +topazes +topcoat +topcoats +topdressing +topdressings +topflight +topiary +topic +topical +topicality +topically +topics +topknot +topknots +topless +topmast +topmasts +topmost +topnotch +topographer +topographers +topographic +topographical +topographically +topographies +topography +topped +topper +toppers +topping +toppings +topple +toppled +topples +toppling +tops +topsail +topsails +topside +topsides +topsoil +topspin +toque +toques +torah +torahs +torch +torchbearer +torchbearers +torched +torches +torching +torchlight +tore +toreador +toreadors +torment +tormented +tormenter +tormenters +tormenting +tormentingly +tormentor +tormentors +torments +torn +tornado +tornadoes +tornados +torpedo +torpedoed +torpedoes +torpedoing +torpid +torpidity +torpidly +torpor +torque +torqued +torques +torquing +torrent +torrential +torrents +torrid +torridity +torridly +torridness +tors +torsi +torsion +torsional +torso +torsos +tort +torte +tortellini +tortes +tortilla +tortillas +tortoise +tortoises +tortoiseshell +tortoiseshells +tortoni +torts +tortuous +tortuously +tortuousness +torture +tortured +torturer +torturers +tortures +torturing +torturous +toss +tossed +tosses +tossing +tossup +tossups +tost +total +totaled +totaling +totalisator +totalisators +totalitarian +totalitarianism +totalitarians +totalities +totality +totalizator +totalizators +totalled +totalling +totally +totals +tote +toted +totem +totemic +totems +totes +toting +tots +totted +totter +tottered +totterer +totterers +tottering +totters +totting +toucan +toucans +touch +touchable +touchdown +touchdowns +touche +touched +touches +touchier +touchiest +touchily +touchiness +touching +touchingly +touchscreen +touchscreens +touchstone +touchstones +touchy +tough +toughen +toughened +toughener +tougheners +toughening +toughens +tougher +toughest +toughie +toughies +toughly +toughness +toughs +toupee +toupees +tour +toured +touring +tourism +tourist +tourists +tourmaline +tournament +tournaments +tourney +tourneys +tourniquet +tourniquets +tours +tousle +tousled +tousles +tousling +tout +touted +touting +touts +toward +towards +towboat +towboats +towed +towel +toweled +towelette +towelettes +toweling +towelled +towelling +towels +tower +towered +towering +towers +towhead +towheaded +towheads +towhee +towhees +towing +towline +towlines +town +townhouse +townhouses +townie +townies +towns +townsfolk +township +townships +townsman +townsmen +townspeople +townswoman +townswomen +towpath +towpaths +towrope +towropes +tows +toxemia +toxic +toxicity +toxicological +toxicologist +toxicologists +toxicology +toxin +toxins +toyed +toying +toys +trace +traceable +traced +tracer +traceries +tracers +tracery +traces +trachea +tracheae +tracheal +tracheas +tracheotomies +tracheotomy +tracing +tracings +track +trackball +trackballs +tracked +tracker +trackers +tracking +trackless +tracks +tract +tractability +tractable +tractably +traction +tractor +tractors +tracts +trade +traded +trademark +trademarked +trademarking +trademarks +tradeoff +tradeoffs +trader +traders +trades +tradesman +tradesmen +tradespeople +tradeswoman +tradeswomen +trading +tradings +tradition +traditional +traditionalism +traditionalist +traditionalists +traditionally +traditions +traduce +traduced +traducer +traducers +traduces +traducing +traffic +trafficked +trafficker +traffickers +trafficking +traffics +tragedian +tragedians +tragedienne +tragediennes +tragedies +tragedy +tragic +tragically +tragicomedies +tragicomedy +tragicomic +trail +trailblazer +trailblazers +trailblazing +trailed +trailer +trailers +trailing +trails +train +trainable +trained +trainee +trainees +trainer +trainers +training +trainload +trainloads +trainman +trainmen +trains +traipse +traipsed +traipses +traipsing +trait +traitor +traitorous +traitorously +traitors +traits +trajectories +trajectory +tram +trammed +trammel +trammeled +trammeling +trammelled +trammelling +trammels +tramming +tramp +tramped +tramper +trampers +tramping +trample +trampled +trampler +tramplers +tramples +trampling +trampoline +trampolined +trampolines +trampolining +tramps +trams +trance +trances +tranquil +tranquiler +tranquilest +tranquility +tranquilize +tranquilized +tranquilizer +tranquilizers +tranquilizes +tranquilizing +tranquiller +tranquillest +tranquillity +tranquillize +tranquillized +tranquillizer +tranquillizers +tranquillizes +tranquillizing +tranquilly +transact +transacted +transacting +transaction +transactions +transactor +transactors +transacts +transatlantic +transceiver +transceivers +transcend +transcended +transcendence +transcendent +transcendental +transcendentalism +transcendentalist +transcendentalists +transcendentally +transcending +transcends +transcontinental +transcribe +transcribed +transcriber +transcribers +transcribes +transcribing +transcript +transcription +transcriptions +transcripts +transducer +transducers +transect +transected +transecting +transects +transept +transepts +transfer +transferable +transferal +transferals +transference +transferred +transferring +transfers +transfiguration +transfigure +transfigured +transfigures +transfiguring +transfix +transfixed +transfixes +transfixing +transfixt +transform +transformable +transformation +transformations +transformed +transformer +transformers +transforming +transforms +transfuse +transfused +transfuses +transfusing +transfusion +transfusions +transgender +transgendered +transgenders +transgress +transgressed +transgresses +transgressing +transgression +transgressions +transgressor +transgressors +transience +transiency +transient +transiently +transients +transistor +transistorize +transistorized +transistorizes +transistorizing +transistors +transit +transited +transiting +transition +transitional +transitionally +transitioned +transitioning +transitions +transitive +transitively +transitiveness +transitives +transitivity +transitory +transits +translatable +translate +translated +translates +translating +translation +translations +translator +translators +transliterate +transliterated +transliterates +transliterating +transliteration +transliterations +translucence +translucency +translucent +translucently +transmigrate +transmigrated +transmigrates +transmigrating +transmigration +transmissible +transmission +transmissions +transmit +transmits +transmittable +transmittal +transmittance +transmitted +transmitter +transmitters +transmitting +transmogrification +transmogrified +transmogrifies +transmogrify +transmogrifying +transmutable +transmutation +transmutations +transmute +transmuted +transmutes +transmuting +transnational +transnationals +transoceanic +transom +transoms +transpacific +transparencies +transparency +transparent +transparently +transpiration +transpire +transpired +transpires +transpiring +transplant +transplantation +transplanted +transplanting +transplants +transpolar +transponder +transponders +transport +transportable +transportation +transported +transporter +transporters +transporting +transports +transpose +transposed +transposes +transposing +transposition +transpositions +transsexual +transsexualism +transsexuals +transship +transshipment +transshipped +transshipping +transships +transubstantiation +transverse +transversely +transverses +transvestism +transvestite +transvestites +trap +trapdoor +trapdoors +trapeze +trapezes +trapezia +trapezium +trapeziums +trapezoid +trapezoidal +trapezoids +trapped +trapper +trappers +trapping +trappings +traps +trapshooting +trash +trashed +trashes +trashier +trashiest +trashiness +trashing +trashy +trauma +traumas +traumata +traumatic +traumatically +traumatize +traumatized +traumatizes +traumatizing +travail +travailed +travailing +travails +travel +traveled +traveler +travelers +traveling +travelled +traveller +travellers +travelling +travelog +travelogs +travelogue +travelogues +travels +traversal +traversals +traverse +traversed +traverses +traversing +travestied +travesties +travesty +travestying +trawl +trawled +trawler +trawlers +trawling +trawls +tray +trays +treacheries +treacherous +treacherously +treacherousness +treachery +treacle +treacly +tread +treading +treadle +treadled +treadles +treadling +treadmill +treadmills +treads +treason +treasonable +treasonous +treasure +treasured +treasurer +treasurers +treasures +treasuries +treasuring +treasury +treat +treatable +treated +treaties +treating +treatise +treatises +treatment +treatments +treats +treaty +treble +trebled +trebles +trebling +tree +treed +treeing +treeless +treelike +trees +treetop +treetops +trefoil +trefoils +trek +trekked +trekker +trekkers +trekking +treks +trellis +trellised +trellises +trellising +trematode +trematodes +tremble +trembled +trembles +trembling +tremendous +tremendously +tremolo +tremolos +tremor +tremors +tremulous +tremulously +tremulousness +trench +trenchancy +trenchant +trenchantly +trenched +trencher +trencherman +trenchermen +trenchers +trenches +trenching +trend +trended +trendier +trendies +trendiest +trendily +trendiness +trending +trends +trendy +trepidation +trespass +trespassed +trespasser +trespassers +trespasses +trespassing +tress +tresses +trestle +trestles +trey +treys +triad +triads +triage +trial +trialled +trialling +trials +triangle +triangles +triangular +triangularly +triangulate +triangulated +triangulates +triangulating +triangulation +triathlon +triathlons +tribal +tribalism +tribe +tribes +tribesman +tribesmen +tribeswoman +tribeswomen +tribulation +tribulations +tribunal +tribunals +tribune +tribunes +tributaries +tributary +tribute +tributes +trice +tricentennial +tricentennials +triceps +tricepses +triceratops +triceratopses +trichina +trichinae +trichinas +trichinosis +trick +tricked +trickery +trickier +trickiest +trickily +trickiness +tricking +trickle +trickled +trickles +trickling +tricks +trickster +tricksters +tricky +tricolor +tricolors +tricolour +tricolours +tricycle +tricycles +trident +tridents +tried +triennial +triennially +triennials +trier +triers +tries +trifle +trifled +trifler +triflers +trifles +trifling +trifocals +trig +trigger +triggered +triggering +triggers +triglyceride +triglycerides +trigonometric +trigonometrical +trigonometry +trike +trikes +trilateral +trilbies +trilby +trill +trilled +trilling +trillion +trillions +trillionth +trillionths +trillium +trills +trilobite +trilobites +trilogies +trilogy +trim +trimaran +trimarans +trimester +trimesters +trimly +trimmed +trimmer +trimmers +trimmest +trimming +trimmings +trimness +trimonthly +trims +trinities +trinitrotoluene +trinity +trinket +trinkets +trio +trios +trip +tripartite +tripe +triple +tripled +triples +triplet +triplets +triplex +triplexes +triplicate +triplicated +triplicates +triplicating +tripling +triply +tripod +tripodal +tripods +tripped +tripper +trippers +tripping +trips +triptych +triptychs +trireme +triremes +trisect +trisected +trisecting +trisection +trisects +trite +tritely +triteness +triter +tritest +tritium +triumph +triumphal +triumphant +triumphantly +triumphed +triumphing +triumphs +triumvir +triumvirate +triumvirates +triumvirs +trivalent +trivet +trivets +trivia +trivial +trivialities +triviality +trivialization +trivialize +trivialized +trivializes +trivializing +trivially +trivium +trochaic +trochee +trochees +trod +trodden +troglodyte +troglodytes +troika +troikas +troll +trolled +trolley +trolleybus +trolleybuses +trolleybusses +trolleys +trollies +trolling +trollop +trollops +trolls +trolly +trombone +trombones +trombonist +trombonists +tromp +tromped +tromping +tromps +troop +trooped +trooper +troopers +trooping +troops +troopship +troopships +trope +tropes +trophies +trophy +tropic +tropical +tropically +tropics +tropism +tropisms +troposphere +tropospheres +trot +troth +trots +trotted +trotter +trotters +trotting +troubadour +troubadours +trouble +troubled +troublemaker +troublemakers +troubles +troubleshoot +troubleshooted +troubleshooter +troubleshooters +troubleshooting +troubleshoots +troubleshot +troublesome +troublesomely +troubling +trough +troughs +trounce +trounced +trouncer +trouncers +trounces +trouncing +troupe +trouped +trouper +troupers +troupes +trouping +trouser +trousers +trousseau +trousseaus +trousseaux +trout +trouts +trove +troves +trow +trowed +trowel +troweled +troweling +trowelled +trowelling +trowels +trowing +trows +troy +truancy +truant +truanted +truanting +truants +truce +truces +truck +trucked +trucker +truckers +trucking +truckle +truckled +truckles +truckling +truckload +truckloads +trucks +truculence +truculent +truculently +trudge +trudged +trudges +trudging +true +trued +trueing +truelove +trueloves +truer +trues +truest +truffle +truffles +truing +truism +truisms +truly +trump +trumped +trumpery +trumpet +trumpeted +trumpeter +trumpeters +trumpeting +trumpets +trumping +trumps +truncate +truncated +truncates +truncating +truncation +truncheon +truncheons +trundle +trundled +trundler +trundlers +trundles +trundling +trunk +trunks +truss +trussed +trusses +trussing +trust +trusted +trustee +trustees +trusteeship +trusteeships +trustful +trustfully +trustfulness +trustier +trusties +trustiest +trusting +trustingly +trusts +trustworthier +trustworthiest +trustworthiness +trustworthy +trusty +truth +truthful +truthfully +truthfulness +truths +trying +tryingly +tryout +tryouts +tryst +trysted +trysting +trysts +tsar +tsarina +tsarinas +tsars +tsetse +tsetses +tsunami +tsunamis +tuba +tubal +tubas +tubbier +tubbiest +tubby +tube +tubed +tubeless +tuber +tubercle +tubercles +tubercular +tuberculin +tuberculosis +tuberculous +tuberose +tuberous +tubers +tubes +tubful +tubfuls +tubing +tubs +tubular +tubule +tubules +tuck +tucked +tucker +tuckered +tuckering +tuckers +tucking +tucks +tuft +tufted +tufter +tufters +tufting +tufts +tugboat +tugboats +tugged +tugging +tugs +tuition +tularemia +tulip +tulips +tulle +tumble +tumbled +tumbledown +tumbler +tumblers +tumbles +tumbleweed +tumbleweeds +tumbling +tumbrel +tumbrels +tumbril +tumbrils +tumescence +tumescent +tumid +tumidity +tummies +tummy +tumor +tumorous +tumors +tumour +tumours +tumult +tumults +tumultuous +tumultuously +tuna +tunas +tundra +tundras +tune +tuned +tuneful +tunefully +tunefulness +tuneless +tunelessly +tuner +tuners +tunes +tuneup +tuneups +tungsten +tunic +tunics +tuning +tunnel +tunneled +tunneler +tunnelers +tunneling +tunnelled +tunneller +tunnellers +tunnelling +tunnels +tunnies +tunny +tuns +tuque +tuques +turban +turbans +turbid +turbidity +turbine +turbines +turbo +turbocharge +turbocharged +turbocharger +turbochargers +turbocharges +turbocharging +turbofan +turbofans +turbojet +turbojets +turboprop +turboprops +turbos +turbot +turbots +turbulence +turbulent +turbulently +turd +turds +tureen +tureens +turf +turfed +turfing +turfs +turfy +turgid +turgidity +turgidly +turkey +turkeys +turmeric +turmerics +turmoil +turmoils +turn +turnabout +turnabouts +turnaround +turnarounds +turnbuckle +turnbuckles +turncoat +turncoats +turned +turner +turners +turning +turnings +turnip +turnips +turnkey +turnkeys +turnoff +turnoffs +turnout +turnouts +turnover +turnovers +turnpike +turnpikes +turns +turnstile +turnstiles +turntable +turntables +turpentine +turpitude +turquoise +turquoises +turret +turreted +turrets +turtle +turtledove +turtledoves +turtleneck +turtlenecked +turtlenecks +turtles +turves +tush +tushes +tusk +tusked +tusks +tussle +tussled +tussles +tussling +tussock +tussocks +tussocky +tutelage +tutelary +tutor +tutored +tutorial +tutorials +tutoring +tutors +tutorship +tuts +tutted +tutti +tutting +tuttis +tutu +tutus +tuxedo +tuxedoes +tuxedos +tuxes +twaddle +twaddled +twaddler +twaddlers +twaddles +twaddling +twain +twang +twanged +twangier +twangiest +twanging +twangs +twangy +twas +tweak +tweaked +tweaking +tweaks +tweed +tweedier +tweediest +tweeds +tweedy +tween +tweet +tweeted +tweeter +tweeters +tweeting +tweets +tweezers +twelfth +twelfths +twelve +twelvemonth +twelvemonths +twelves +twenties +twentieth +twentieths +twenty +twerp +twerps +twice +twiddle +twiddled +twiddles +twiddlier +twiddliest +twiddling +twiddly +twig +twigged +twiggier +twiggiest +twigging +twiggy +twigs +twilight +twilit +twill +twilled +twin +twine +twined +twiner +twiners +twines +twinge +twinged +twingeing +twinges +twinging +twinight +twining +twinkle +twinkled +twinkles +twinkling +twinklings +twinkly +twinned +twinning +twins +twirl +twirled +twirler +twirlers +twirlier +twirliest +twirling +twirls +twirly +twist +twisted +twister +twisters +twistier +twistiest +twisting +twists +twisty +twit +twitch +twitched +twitches +twitchier +twitchiest +twitching +twitchy +twits +twitted +twitter +twittered +twittering +twitters +twittery +twitting +twixt +twofer +twofers +twofold +twopence +twopences +twopenny +twos +twosome +twosomes +tycoon +tycoons +tying +tyke +tykes +tympana +tympani +tympanist +tympanists +tympanum +tympanums +type +typecast +typecasting +typecasts +typed +typeface +typefaces +types +typescript +typescripts +typeset +typesets +typesetter +typesetters +typesetting +typewrite +typewriter +typewriters +typewrites +typewriting +typewritten +typewrote +typhoid +typhoon +typhoons +typhus +typical +typicality +typically +typification +typified +typifies +typify +typifying +typing +typist +typists +typo +typographer +typographers +typographic +typographical +typographically +typography +typology +typos +tyrannic +tyrannical +tyrannically +tyrannies +tyrannize +tyrannized +tyrannizes +tyrannizing +tyrannosaur +tyrannosaurs +tyrannosaurus +tyrannosauruses +tyrannous +tyranny +tyrant +tyrants +tyre +tyres +tyro +tyros +tzar +tzarina +tzarinas +tzars +ubiquitous +ubiquitously +ubiquity +udder +udders +ufologist +ufologists +ufology +uglier +ugliest +ugliness +ugly +ukase +ukases +ukelele +ukeleles +ukulele +ukuleles +ulcer +ulcerate +ulcerated +ulcerates +ulcerating +ulceration +ulcerations +ulcerous +ulcers +ulna +ulnae +ulnar +ulnas +ulster +ulsters +ulterior +ultimata +ultimate +ultimately +ultimatum +ultimatums +ultimo +ultra +ultraconservative +ultraconservatives +ultrahigh +ultralight +ultralights +ultramarine +ultramodern +ultras +ultrasonic +ultrasonically +ultrasound +ultrasounds +ultraviolet +ululate +ululated +ululates +ululating +ululation +ululations +umbel +umbels +umber +umbilical +umbilici +umbilicus +umbilicuses +umbra +umbrae +umbrage +umbras +umbrella +umbrellas +umiak +umiaks +umlaut +umlauts +umped +umping +umpire +umpired +umpires +umpiring +umps +umpteen +umpteenth +unabashed +unabashedly +unabated +unable +unabridged +unabridgeds +unaccented +unacceptable +unacceptably +unaccommodating +unaccompanied +unaccomplished +unaccountable +unaccountably +unaccounted +unaccredited +unaccustomed +unacknowledged +unacquainted +unadorned +unadulterated +unadventurous +unadvertised +unadvised +unadvisedly +unaesthetic +unaffected +unaffectedly +unaffiliated +unafraid +unaided +unalienable +unaligned +unalike +unalloyed +unalterable +unalterably +unaltered +unambiguous +unambiguously +unambitious +unanimity +unanimous +unanimously +unannounced +unanswerable +unanswered +unanticipated +unapologetic +unapparent +unappealing +unappealingly +unappetizing +unappreciated +unappreciative +unapproachable +unappropriated +unapproved +unarguable +unarguably +unarmed +unarmored +unashamed +unashamedly +unasked +unassailable +unassertive +unassisted +unassuming +unassumingly +unattached +unattainable +unattended +unattested +unattractive +unattractively +unauthentic +unauthorized +unavailability +unavailable +unavailing +unavailingly +unavoidable +unavoidably +unaware +unawareness +unawares +unbaked +unbalanced +unbaptized +unbar +unbarred +unbarring +unbars +unbearable +unbearably +unbeatable +unbeaten +unbecoming +unbecomingly +unbeknown +unbeknownst +unbelief +unbelievable +unbelievably +unbeliever +unbelievers +unbelieving +unbend +unbending +unbends +unbent +unbiased +unbiassed +unbid +unbidden +unbind +unbinding +unbinds +unbleached +unblemished +unblinking +unblock +unblocked +unblocking +unblocks +unblushing +unblushingly +unbolt +unbolted +unbolting +unbolts +unborn +unbosom +unbosomed +unbosoming +unbosoms +unbound +unbounded +unbowed +unbreakable +unbridgeable +unbridled +unbroken +unbuckle +unbuckled +unbuckles +unbuckling +unburden +unburdened +unburdening +unburdens +unbutton +unbuttoned +unbuttoning +unbuttons +uncannier +uncanniest +uncannily +uncanny +uncap +uncapped +uncapping +uncaps +uncaring +uncaught +unceasing +unceasingly +uncensored +unceremonious +unceremoniously +uncertain +uncertainly +uncertainties +uncertainty +unchain +unchained +unchaining +unchains +unchallenged +unchangeable +unchanged +unchanging +unchaperoned +uncharacteristic +uncharacteristically +uncharged +uncharitable +uncharitably +uncharted +unchaste +unchaster +unchastest +unchecked +unchristian +uncial +uncircumcised +uncivil +uncivilized +uncivilly +unclad +unclaimed +unclasp +unclasped +unclasping +unclasps +unclassified +uncle +unclean +uncleaned +uncleaner +uncleanest +uncleanlier +uncleanliest +uncleanliness +uncleanly +uncleanness +unclear +uncleared +unclearer +unclearest +uncles +uncloak +uncloaked +uncloaking +uncloaks +unclog +unclogged +unclogging +unclogs +unclothe +unclothed +unclothes +unclothing +unclouded +uncluttered +uncoil +uncoiled +uncoiling +uncoils +uncollected +uncolored +uncombed +uncombined +uncomfortable +uncomfortably +uncommitted +uncommon +uncommoner +uncommonest +uncommonly +uncommonness +uncommunicative +uncompensated +uncomplaining +uncomplainingly +uncompleted +uncomplicated +uncomplimentary +uncompounded +uncomprehending +uncomprehendingly +uncompromising +uncompromisingly +unconcealed +unconcern +unconcerned +unconcernedly +unconditional +unconditionally +unconditioned +unconfined +unconfirmed +unconformable +uncongenial +unconnected +unconquerable +unconquered +unconscionable +unconscionably +unconscious +unconsciously +unconsciousness +unconsecrated +unconsidered +unconsolidated +unconstitutional +unconstitutionality +unconstitutionally +unconstrained +unconsumed +unconsummated +uncontaminated +uncontested +uncontrollable +uncontrollably +uncontrolled +unconventional +unconventionality +unconventionally +unconverted +unconvinced +unconvincing +unconvincingly +uncooked +uncool +uncooperative +uncoordinated +uncork +uncorked +uncorking +uncorks +uncorrected +uncorroborated +uncountable +uncounted +uncouple +uncoupled +uncouples +uncoupling +uncouth +uncouthly +uncover +uncovered +uncovering +uncovers +uncritical +uncritically +uncross +uncrossed +uncrosses +uncrossing +uncrowded +uncrowned +unction +unctions +unctuous +unctuously +unctuousness +uncultivated +uncultured +uncured +uncurl +uncurled +uncurling +uncurls +uncustomary +uncut +undamaged +undated +undaunted +undauntedly +undeceive +undeceived +undeceives +undeceiving +undecided +undecideds +undecipherable +undeclared +undefeated +undefended +undefinable +undefined +undemanding +undemocratic +undemonstrative +undemonstratively +undeniable +undeniably +undependable +under +underachieve +underachieved +underachiever +underachievers +underachieves +underachieving +underact +underacted +underacting +underacts +underage +underarm +underarms +underbellies +underbelly +underbid +underbidding +underbids +underbrush +undercarriage +undercarriages +undercharge +undercharged +undercharges +undercharging +underclass +underclassman +underclassmen +underclothes +underclothing +undercoat +undercoated +undercoating +undercoatings +undercoats +undercover +undercurrent +undercurrents +undercut +undercuts +undercutting +underdeveloped +underdevelopment +underdog +underdogs +underdone +underemployed +underemployment +underestimate +underestimated +underestimates +underestimating +underestimation +underestimations +underexpose +underexposed +underexposes +underexposing +underexposure +underexposures +underfed +underfeed +underfeeding +underfeeds +underfoot +underfur +undergarment +undergarments +undergo +undergoes +undergoing +undergone +undergraduate +undergraduates +underground +undergrounds +undergrowth +underhand +underhanded +underhandedly +underhandedness +underlain +underlay +underlays +underlie +underlies +underline +underlined +underlines +underling +underlings +underlining +underlip +underlips +underlying +undermanned +undermentioned +undermine +undermined +undermines +undermining +undermost +underneath +underneaths +undernourished +undernourishment +underpaid +underpants +underpart +underparts +underpass +underpasses +underpay +underpaying +underpayment +underpayments +underpays +underpin +underpinned +underpinning +underpinnings +underpins +underplay +underplayed +underplaying +underplays +underpopulated +underprivileged +underproduction +underrate +underrated +underrates +underrating +underrepresented +underscore +underscored +underscores +underscoring +undersea +underseas +undersecretaries +undersecretary +undersell +underselling +undersells +undersexed +undershirt +undershirts +undershoot +undershooting +undershoots +undershorts +undershot +underside +undersides +undersign +undersigned +undersigning +undersigns +undersize +undersized +underskirt +underskirts +undersold +understaffed +understand +understandable +understandably +understanding +understandingly +understandings +understands +understate +understated +understatement +understatements +understates +understating +understood +understudied +understudies +understudy +understudying +undertake +undertaken +undertaker +undertakers +undertakes +undertaking +undertakings +underthings +undertone +undertones +undertook +undertow +undertows +undervaluation +undervalue +undervalued +undervalues +undervaluing +underwater +underway +underwear +underweight +underwent +underwhelm +underwhelmed +underwhelming +underwhelms +underworld +underworlds +underwrite +underwriter +underwriters +underwrites +underwriting +underwritten +underwrote +undeserved +undeservedly +undeserving +undesirability +undesirable +undesirables +undesirably +undesired +undetectable +undetected +undetermined +undeterred +undeveloped +undeviating +undid +undies +undifferentiated +undigested +undignified +undiluted +undiminished +undimmed +undiplomatic +undischarged +undisciplined +undisclosed +undiscovered +undiscriminating +undisguised +undismayed +undisputed +undissolved +undistinguished +undistributed +undisturbed +undivided +undo +undocumented +undoes +undoing +undoings +undomesticated +undone +undoubted +undoubtedly +undramatic +undreamed +undreamt +undress +undressed +undresses +undressing +undrinkable +undue +undulant +undulate +undulated +undulates +undulating +undulation +undulations +unduly +undying +unearned +unearth +unearthed +unearthing +unearthlier +unearthliest +unearthliness +unearthly +unearths +unease +uneasier +uneasiest +uneasily +uneasiness +uneasy +uneatable +uneaten +uneconomic +uneconomical +uneconomically +unedifying +unedited +uneducated +unembarrassed +unemotional +unemphatic +unemployable +unemployed +unemployment +unenclosed +unencumbered +unending +unendurable +unenforced +unenlightened +unenterprising +unenthusiastic +unenviable +unequal +unequaled +unequalled +unequally +unequipped +unequivocal +unequivocally +unerring +unerringly +unessential +unethical +unethically +uneven +unevenly +unevenness +uneventful +uneventfully +unexampled +unexceptionable +unexceptionably +unexceptional +unexceptionally +unexcited +unexciting +unexcused +unexpected +unexpectedly +unexpectedness +unexpired +unexplained +unexploited +unexplored +unexposed +unexpressed +unexpurgated +unfading +unfailing +unfailingly +unfair +unfairer +unfairest +unfairly +unfairness +unfaithful +unfaithfully +unfaithfulness +unfaltering +unfamiliar +unfamiliarity +unfashionable +unfashionably +unfasten +unfastened +unfastening +unfastens +unfathomable +unfathomably +unfavorable +unfavorably +unfeasible +unfed +unfeeling +unfeelingly +unfeigned +unfeminine +unfertilized +unfetter +unfettered +unfettering +unfetters +unfilled +unfiltered +unfinished +unfit +unfitness +unfits +unfitted +unfitter +unfittest +unfitting +unfix +unfixed +unfixes +unfixing +unflagging +unflaggingly +unflappability +unflappable +unflappably +unflattering +unflavored +unfledged +unflinching +unflinchingly +unfocused +unfold +unfolded +unfolding +unfolds +unforced +unforeseeable +unforeseen +unforgettable +unforgettably +unforgivable +unforgivably +unforgiving +unforgotten +unformed +unformulated +unfortified +unfortunate +unfortunately +unfortunates +unfounded +unframed +unfreeze +unfreezes +unfreezing +unfrequented +unfriendlier +unfriendliest +unfriendliness +unfriendly +unfrock +unfrocked +unfrocking +unfrocks +unfroze +unfrozen +unfruitful +unfulfilled +unfunded +unfunny +unfurl +unfurled +unfurling +unfurls +unfurnished +ungainlier +ungainliest +ungainliness +ungainly +ungenerous +ungentle +ungentlemanly +unglued +ungodlier +ungodliest +ungodliness +ungodly +ungovernable +ungoverned +ungraceful +ungracefully +ungracious +ungraciously +ungraded +ungrammatical +ungrammatically +ungrateful +ungratefully +ungratefulness +ungrudging +unguarded +unguent +unguents +unguided +ungulate +ungulates +unhallowed +unhampered +unhand +unhanded +unhandier +unhandiest +unhanding +unhands +unhandy +unhappier +unhappiest +unhappily +unhappiness +unhappy +unhardened +unharmed +unharness +unharnessed +unharnesses +unharnessing +unharvested +unhatched +unhealed +unhealthful +unhealthier +unhealthiest +unhealthily +unhealthiness +unhealthy +unheard +unheated +unheeded +unhelpful +unhelpfully +unheralded +unhesitating +unhesitatingly +unhindered +unhinge +unhinged +unhinges +unhinging +unhistorical +unhitch +unhitched +unhitches +unhitching +unholier +unholiest +unholiness +unholy +unhook +unhooked +unhooking +unhooks +unhorse +unhorsed +unhorses +unhorsing +unhurried +unhurriedly +unhurt +unicameral +unicellular +unicorn +unicorns +unicycle +unicycles +unidentifiable +unidentified +unidiomatic +unification +unified +unifies +uniform +uniformed +uniforming +uniformity +uniformly +uniforms +unify +unifying +unilateral +unilaterally +unimaginable +unimaginative +unimaginatively +unimpaired +unimpeachable +unimpeded +unimportant +unimposing +unimpressed +unimpressive +unimproved +unincorporated +uninfected +uninfluenced +uninformative +uninformed +uninhabitable +uninhabited +uninhibited +uninhibitedly +uninitiated +uninjured +uninspired +uninspiring +uninstructed +uninsured +unintelligent +unintelligible +unintelligibly +unintended +unintentional +unintentionally +uninterested +uninteresting +uninterrupted +uninvited +uninviting +union +unionism +unionist +unionists +unionization +unionize +unionized +unionizes +unionizing +unions +unique +uniquely +uniqueness +uniquer +uniquest +unisex +unison +unit +unitary +unite +united +unitedly +unites +unities +uniting +unitize +unitized +unitizes +unitizing +units +unity +univalent +univalve +univalves +universal +universality +universalize +universalized +universalizes +universalizing +universally +universals +universe +universes +universities +university +unjust +unjustifiable +unjustifiably +unjustified +unjustly +unkempt +unkind +unkinder +unkindest +unkindlier +unkindliest +unkindly +unkindness +unknowable +unknowing +unknowingly +unknown +unknowns +unlabeled +unlace +unlaced +unlaces +unlacing +unladen +unladylike +unlatch +unlatched +unlatches +unlatching +unlawful +unlawfully +unlawfulness +unleaded +unlearn +unlearned +unlearning +unlearns +unleash +unleashed +unleashes +unleashing +unleavened +unless +unlettered +unlicensed +unlighted +unlikable +unlike +unlikelier +unlikeliest +unlikelihood +unlikeliness +unlikely +unlikeness +unlimber +unlimbered +unlimbering +unlimbers +unlimited +unlined +unlisted +unlit +unlivable +unload +unloaded +unloading +unloads +unlock +unlocked +unlocking +unlocks +unloose +unloosed +unloosen +unloosened +unloosening +unloosens +unlooses +unloosing +unlovable +unloved +unlovelier +unloveliest +unlovely +unloving +unluckier +unluckiest +unluckily +unluckiness +unlucky +unmade +unmake +unmakes +unmaking +unman +unmanageable +unmanlier +unmanliest +unmanly +unmanned +unmannerly +unmanning +unmans +unmarked +unmarketable +unmarred +unmarried +unmask +unmasked +unmasking +unmasks +unmatched +unmeaning +unmeant +unmeasured +unmediated +unmentionable +unmentionables +unmentioned +unmerciful +unmercifully +unmerited +unmindful +unmistakable +unmistakably +unmitigated +unmixed +unmodified +unmolested +unmoral +unmorality +unmotivated +unmounted +unmovable +unmoved +unmusical +unnameable +unnamed +unnatural +unnaturally +unnaturalness +unnecessarily +unnecessary +unneeded +unnerve +unnerved +unnerves +unnerving +unnoticeable +unnoticed +unnumbered +unobjectionable +unobservant +unobserved +unobstructed +unobtainable +unobtrusive +unobtrusively +unobtrusiveness +unoccupied +unoffensive +unofficial +unofficially +unopened +unopposed +unorganized +unoriginal +unorthodox +unpack +unpacked +unpacking +unpacks +unpaid +unpainted +unpaired +unpalatable +unparalleled +unparallelled +unpardonable +unpardonably +unpasteurized +unpatriotic +unpaved +unpeeled +unperceived +unperceptive +unperformed +unperson +unpersons +unpersuaded +unpersuasive +unperturbed +unpin +unpinned +unpinning +unpins +unplanned +unpleasant +unpleasantly +unpleasantness +unpleasing +unplug +unplugged +unplugging +unplugs +unplumbed +unpolished +unpolitical +unpolluted +unpopular +unpopularity +unpractical +unpracticed +unprecedented +unprecedentedly +unpredictability +unpredictable +unpredictably +unprejudiced +unpremeditated +unprepared +unpreparedness +unprepossessing +unpressed +unpretentious +unpretentiously +unpreventable +unprincipled +unprintable +unprocessed +unproductive +unproductively +unprofessional +unprofessionally +unprofitable +unprofitably +unpromising +unprompted +unpronounceable +unpropitious +unprotected +unproved +unproven +unprovided +unprovoked +unpublished +unpunished +unqualified +unquenchable +unquestionable +unquestionably +unquestioned +unquestioning +unquestioningly +unquiet +unquieter +unquietest +unquote +unquoted +unquotes +unquoting +unrated +unravel +unraveled +unraveling +unravelled +unravelling +unravels +unread +unreadable +unready +unreal +unrealistic +unrealistically +unreality +unrealized +unreasonable +unreasonableness +unreasonably +unreasoning +unrecognizable +unrecognized +unreconstructed +unrecorded +unrecoverable +unreel +unreeled +unreeling +unreels +unrefined +unreformed +unregenerate +unregistered +unregulated +unrehearsed +unrelated +unrelenting +unrelentingly +unreliability +unreliable +unreliably +unrelieved +unremarkable +unremembered +unremitting +unremittingly +unrepentant +unreported +unrepresentative +unrepresented +unrequited +unreserved +unreservedly +unresistant +unresolved +unresponsive +unresponsively +unresponsiveness +unrest +unrestrained +unrestricted +unrewarded +unrewarding +unrighteous +unrighteousness +unripe +unripened +unriper +unripest +unrivaled +unrivalled +unroll +unrolled +unrolling +unrolls +unromantic +unruffled +unrulier +unruliest +unruliness +unruly +unsaddle +unsaddled +unsaddles +unsaddling +unsafe +unsafely +unsafer +unsafest +unsaid +unsalable +unsalted +unsanctioned +unsanitary +unsatisfactorily +unsatisfactory +unsatisfied +unsatisfying +unsaturated +unsaved +unsavory +unsavoury +unsay +unsaying +unsays +unscathed +unscented +unscheduled +unschooled +unscientific +unscientifically +unscramble +unscrambled +unscrambles +unscrambling +unscratched +unscrew +unscrewed +unscrewing +unscrews +unscripted +unscrupulous +unscrupulously +unscrupulousness +unseal +unsealed +unsealing +unseals +unsearchable +unseasonable +unseasonably +unseasoned +unseat +unseated +unseating +unseats +unseeing +unseeingly +unseemlier +unseemliest +unseemliness +unseemly +unseen +unsegmented +unsegregated +unselfish +unselfishly +unselfishness +unsentimental +unsettle +unsettled +unsettles +unsettling +unshackle +unshackled +unshackles +unshackling +unshakable +unshakably +unshakeable +unshaken +unshaped +unshapely +unshaven +unsheathe +unsheathed +unsheathes +unsheathing +unshod +unshorn +unsifted +unsightlier +unsightliest +unsightliness +unsightly +unsigned +unsinkable +unskilled +unskillful +unskillfully +unsmiling +unsnap +unsnapped +unsnapping +unsnaps +unsnarl +unsnarled +unsnarling +unsnarls +unsociable +unsocial +unsoiled +unsold +unsolicited +unsolvable +unsolved +unsophisticated +unsorted +unsought +unsound +unsounder +unsoundest +unsoundly +unsoundness +unsparing +unsparingly +unspeakable +unspeakably +unspecific +unspecified +unspectacular +unspent +unspoiled +unspoken +unsportsmanlike +unstable +unstabler +unstablest +unstably +unstained +unstated +unsteadier +unsteadiest +unsteadily +unsteadiness +unsteady +unstinting +unstintingly +unstop +unstoppable +unstopped +unstopping +unstops +unstrap +unstrapped +unstrapping +unstraps +unstressed +unstructured +unstrung +unstuck +unstudied +unsubstantial +unsubstantiated +unsuccessful +unsuccessfully +unsuitability +unsuitable +unsuitably +unsuited +unsullied +unsung +unsupervised +unsupported +unsure +unsurpassed +unsurprising +unsurprisingly +unsuspected +unsuspecting +unsuspectingly +unsustainable +unswayed +unsweetened +unswerving +unsymmetrical +unsympathetic +unsympathetically +unsystematic +untactful +untainted +untalented +untamed +untangle +untangled +untangles +untangling +untanned +untapped +untarnished +untasted +untaught +unteachable +untenable +untenanted +untended +untested +unthinkable +unthinkably +unthinking +unthinkingly +untidier +untidiest +untidily +untidiness +untidy +untie +untied +unties +until +untimelier +untimeliest +untimeliness +untimely +untiring +untiringly +untitled +unto +untold +untouchable +untouchables +untouched +untoward +untraceable +untrained +untrammeled +untrammelled +untranslatable +untranslated +untraveled +untreated +untried +untrimmed +untrod +untroubled +untrue +untruer +untruest +untruly +untrustworthy +untruth +untruthful +untruthfully +untruthfulness +untruths +untutored +untwist +untwisted +untwisting +untwists +untying +untypical +unusable +unused +unusual +unusually +unutterable +unutterably +unvaried +unvarnished +unvarying +unveil +unveiled +unveiling +unveils +unverifiable +unverified +unversed +unvoiced +unwanted +unwarier +unwariest +unwarily +unwariness +unwarrantable +unwarranted +unwary +unwashed +unwavering +unwearable +unwearied +unwed +unwelcome +unwell +unwholesome +unwholesomeness +unwieldier +unwieldiest +unwieldiness +unwieldy +unwilling +unwillingly +unwillingness +unwind +unwinding +unwinds +unwise +unwisely +unwiser +unwisest +unwitting +unwittingly +unwonted +unworkable +unworldlier +unworldliest +unworldliness +unworldly +unworn +unworried +unworthier +unworthiest +unworthily +unworthiness +unworthy +unwound +unwoven +unwrap +unwrapped +unwrapping +unwraps +unwrinkled +unwritten +unyielding +unyoke +unyoked +unyokes +unyoking +unzip +unzipped +unzipping +unzips +upbeat +upbeats +upbraid +upbraided +upbraiding +upbraids +upbringing +upbringings +upchuck +upchucked +upchucking +upchucks +upcoming +upcountry +update +updated +updates +updating +updraft +updrafts +upend +upended +upending +upends +upfront +upgrade +upgraded +upgrades +upgrading +upheaval +upheavals +upheld +uphill +uphills +uphold +upholder +upholders +upholding +upholds +upholster +upholstered +upholsterer +upholsterers +upholstering +upholsters +upholstery +upkeep +upland +uplands +uplift +uplifted +uplifting +uplifts +upload +uploaded +uploading +uploads +upmarket +upmost +upon +upped +upper +uppercase +upperclassman +upperclassmen +uppercut +uppercuts +uppercutting +uppermost +uppers +upping +uppish +uppity +upraise +upraised +upraises +upraising +uprear +upreared +uprearing +uprears +upright +uprightly +uprightness +uprights +uprising +uprisings +upriver +uproar +uproarious +uproariously +uproars +uproot +uprooted +uprooting +uproots +upscale +upset +upsets +upsetting +upshot +upshots +upside +upsides +upsilon +upsilons +upstage +upstaged +upstages +upstaging +upstairs +upstanding +upstart +upstarted +upstarting +upstarts +upstate +upstream +upstroke +upstrokes +upsurge +upsurged +upsurges +upsurging +upswing +upswings +uptake +uptakes +upthrust +upthrusting +upthrusts +uptick +upticks +uptight +uptown +upturn +upturned +upturning +upturns +upward +upwardly +upwards +upwind +uracil +uranium +urban +urbane +urbanely +urbaner +urbanest +urbanity +urbanization +urbanize +urbanized +urbanizes +urbanizing +urbanologist +urbanologists +urbanology +urchin +urchins +urea +uremia +uremic +ureter +ureters +urethane +urethra +urethrae +urethral +urethras +urge +urged +urgency +urgent +urgently +urges +urging +uric +urinal +urinals +urinalyses +urinalysis +urinary +urinate +urinated +urinates +urinating +urination +urine +urns +urogenital +urological +urologist +urologists +urology +ursine +urticaria +usability +usable +usage +usages +useability +useable +used +useful +usefully +usefulness +useless +uselessly +uselessness +user +users +uses +usher +ushered +usherette +usherettes +ushering +ushers +using +usual +usually +usurer +usurers +usurious +usurp +usurpation +usurped +usurper +usurpers +usurping +usurps +usury +utensil +utensils +uteri +uterine +uterus +uteruses +utilitarian +utilitarianism +utilitarians +utilities +utility +utilization +utilize +utilized +utilizes +utilizing +utmost +utopia +utopian +utopians +utopias +utter +utterance +utterances +uttered +uttering +utterly +uttermost +utters +uvula +uvulae +uvular +uvulars +uvulas +uxorious +vacancies +vacancy +vacant +vacantly +vacate +vacated +vacates +vacating +vacation +vacationed +vacationer +vacationers +vacationing +vacationist +vacationists +vacations +vaccinate +vaccinated +vaccinates +vaccinating +vaccination +vaccinations +vaccine +vaccines +vacillate +vacillated +vacillates +vacillating +vacillation +vacillations +vacua +vacuity +vacuole +vacuoles +vacuous +vacuously +vacuousness +vacuum +vacuumed +vacuuming +vacuums +vagabond +vagabondage +vagabonds +vagaries +vagarious +vagary +vagina +vaginae +vaginal +vaginally +vaginas +vagrancy +vagrant +vagrants +vague +vaguely +vagueness +vaguer +vaguest +vain +vainer +vainest +vainglorious +vaingloriously +vainglory +vainly +valance +valances +vale +valediction +valedictions +valedictorian +valedictorians +valedictories +valedictory +valence +valences +valencies +valency +valentine +valentines +vales +valet +valeted +valeting +valets +valetudinarian +valetudinarianism +valetudinarians +valiance +valiant +valiantly +valid +validate +validated +validates +validating +validation +validations +validity +validly +validness +valise +valises +valley +valleys +valor +valorous +valorously +valour +valuable +valuables +valuate +valuated +valuates +valuating +valuation +valuations +value +valued +valueless +valuer +valuers +values +valuing +valve +valved +valveless +valves +valving +valvular +vamoose +vamoosed +vamooses +vamoosing +vamp +vamped +vamping +vampire +vampires +vamps +vanadium +vandal +vandalise +vandalised +vandalises +vandalising +vandalism +vandalize +vandalized +vandalizes +vandalizing +vandals +vane +vanes +vanguard +vanguards +vanilla +vanillas +vanish +vanished +vanishes +vanishing +vanities +vanity +vanned +vanning +vanquish +vanquished +vanquisher +vanquishers +vanquishes +vanquishing +vans +vantage +vantages +vapid +vapidity +vapidly +vapidness +vapor +vaporise +vaporised +vaporises +vaporising +vaporization +vaporize +vaporized +vaporizer +vaporizers +vaporizes +vaporizing +vaporous +vapors +vapory +vapour +vapours +vaquero +vaqueros +variability +variable +variables +variably +variance +variances +variant +variants +variation +variations +varicolored +varicose +varied +variegate +variegated +variegates +variegating +variegation +varies +varietal +varietals +varieties +variety +various +variously +varlet +varlets +varmint +varmints +varnish +varnished +varnishes +varnishing +varsities +varsity +vary +varying +vascular +vase +vasectomies +vasectomy +vases +vasomotor +vassal +vassalage +vassals +vast +vaster +vastest +vastly +vastness +vasts +vats +vatted +vatting +vaudeville +vaudevillian +vaudevillians +vault +vaulted +vaulter +vaulters +vaulting +vaults +vaunt +vaunted +vaunting +vaunts +veal +vector +vectored +vectoring +vectors +veejay +veejays +veep +veeps +veer +veered +veering +veers +vegan +vegans +veges +vegetable +vegetables +vegetarian +vegetarianism +vegetarians +vegetate +vegetated +vegetates +vegetating +vegetation +vegetative +vegged +vegges +veggie +veggies +vegging +vegs +vehemence +vehemency +vehement +vehemently +vehicle +vehicles +vehicular +veil +veiled +veiling +veils +vein +veined +veining +veins +vela +velar +velars +veld +velds +veldt +veldts +vellum +velocipede +velocipedes +velocities +velocity +velour +velours +velum +velvet +velveteen +velvety +venal +venality +venally +venation +vend +vended +vender +venders +vendetta +vendettas +vendible +vending +vendor +vendors +vends +veneer +veneered +veneering +veneers +venerability +venerable +venerate +venerated +venerates +venerating +veneration +venereal +vengeance +vengeful +vengefully +venial +venireman +veniremen +venison +venom +venomous +venomously +venous +vent +vented +ventilate +ventilated +ventilates +ventilating +ventilation +ventilator +ventilators +venting +ventral +ventricle +ventricles +ventricular +ventriloquism +ventriloquist +ventriloquists +ventriloquy +vents +venture +ventured +ventures +venturesome +venturesomely +venturesomeness +venturing +venturous +venturously +venturousness +venue +venues +veracious +veraciously +veracity +veranda +verandah +verandahs +verandas +verb +verbal +verbalization +verbalize +verbalized +verbalizes +verbalizing +verbally +verbals +verbatim +verbena +verbenas +verbiage +verbose +verbosely +verbosity +verboten +verbs +verdant +verdantly +verdict +verdicts +verdigris +verdure +verge +verged +verger +vergers +verges +verging +verier +veriest +verifiable +verification +verified +verifies +verify +verifying +verily +verisimilitude +veritable +veritably +verities +verity +vermicelli +vermiculite +vermiform +vermilion +vermillion +vermin +verminous +vermouth +vernacular +vernaculars +vernal +vernier +verniers +veronica +verruca +verrucae +verrucas +versatile +versatility +verse +versed +verses +versification +versified +versifier +versifiers +versifies +versify +versifying +versing +version +versions +verso +versos +versus +vertebra +vertebrae +vertebral +vertebras +vertebrate +vertebrates +vertex +vertexes +vertical +vertically +verticals +vertices +vertiginous +vertigo +verve +very +vesicle +vesicles +vesicular +vesiculate +vesper +vespers +vessel +vessels +vest +vestal +vestals +vested +vestibule +vestibules +vestige +vestiges +vestigial +vestigially +vesting +vestment +vestments +vestries +vestry +vestryman +vestrymen +vests +vetch +vetches +veteran +veterans +veterinarian +veterinarians +veterinaries +veterinary +veto +vetoed +vetoes +vetoing +vets +vetted +vetting +vexation +vexations +vexatious +vexatiously +vexed +vexes +vexing +viability +viable +viably +viaduct +viaducts +vial +vials +viand +viands +vibe +vibes +vibraharp +vibraharps +vibrancy +vibrant +vibrantly +vibraphone +vibraphones +vibraphonist +vibraphonists +vibrate +vibrated +vibrates +vibrating +vibration +vibrations +vibrato +vibrator +vibrators +vibratory +vibratos +viburnum +viburnums +vicar +vicarage +vicarages +vicarious +vicariously +vicariousness +vicars +vice +viced +vicegerent +vicegerents +vicennial +viceregal +viceroy +viceroys +vices +vichyssoise +vicing +vicinity +vicious +viciously +viciousness +vicissitude +vicissitudes +victim +victimization +victimize +victimized +victimizes +victimizing +victims +victor +victories +victorious +victoriously +victors +victory +victual +victualed +victualing +victualled +victualling +victuals +vicuna +vicunas +videlicet +video +videocassette +videocassettes +videodisc +videodiscs +videodisk +videodisks +videoed +videoing +videophone +videophones +videos +videotape +videotaped +videotapes +videotaping +vied +vies +view +viewed +viewer +viewers +viewership +viewfinder +viewfinders +viewing +viewings +viewpoint +viewpoints +views +vigesimal +vigil +vigilance +vigilant +vigilante +vigilantes +vigilantism +vigilantist +vigilantists +vigilantly +vigils +vignette +vignetted +vignettes +vignetting +vignettist +vignettists +vigor +vigorous +vigorously +vigour +viking +vikings +vile +vilely +vileness +viler +vilest +vilification +vilified +vilifies +vilify +vilifying +villa +village +villager +villagers +villages +villain +villainies +villainous +villains +villainy +villas +villein +villeinage +villeins +villi +villus +vinaigrette +vincible +vindicate +vindicated +vindicates +vindicating +vindication +vindications +vindicator +vindicators +vindictive +vindictively +vindictiveness +vine +vinegar +vinegary +vines +vineyard +vineyards +vino +vinous +vintage +vintages +vintner +vintners +vinyl +vinyls +viol +viola +violable +violas +violate +violated +violates +violating +violation +violations +violator +violators +violence +violent +violently +violet +violets +violin +violinist +violinists +violins +violist +violists +violoncellist +violoncellists +violoncello +violoncellos +viols +viper +viperous +vipers +virago +viragoes +viragos +viral +vireo +vireos +virgin +virginal +virginals +virginity +virgins +virgule +virgules +virile +virility +virologist +virologists +virology +virtual +virtually +virtue +virtues +virtuosi +virtuosity +virtuoso +virtuosos +virtuous +virtuously +virtuousness +virulence +virulent +virulently +virus +viruses +visa +visaed +visage +visages +visaing +visas +viscera +visceral +viscerally +viscid +viscose +viscosity +viscount +viscountcies +viscountcy +viscountess +viscountesses +viscounts +viscous +viscus +vise +vised +vises +visibility +visible +visibly +vising +vision +visionaries +visionary +visioned +visioning +visions +visit +visitant +visitants +visitation +visitations +visited +visiting +visitor +visitors +visits +visor +visors +vista +vistas +visual +visualization +visualize +visualized +visualizer +visualizers +visualizes +visualizing +visually +visuals +vita +vitae +vital +vitality +vitalization +vitalize +vitalized +vitalizes +vitalizing +vitally +vitals +vitamin +vitamins +vitas +vitiate +vitiated +vitiates +vitiating +vitiation +viticulture +viticulturist +viticulturists +vitreous +vitrifaction +vitrification +vitrified +vitrifies +vitrify +vitrifying +vitrine +vitrines +vitriol +vitriolic +vittles +vituperate +vituperated +vituperates +vituperating +vituperation +vituperative +viva +vivace +vivacious +vivaciously +vivaciousness +vivacity +vivaria +vivarium +vivariums +vivas +vivid +vivider +vividest +vividly +vividness +vivified +vivifies +vivify +vivifying +viviparous +vivisect +vivisected +vivisecting +vivisection +vivisectional +vivisectionist +vivisectionists +vivisects +vixen +vixenish +vixenishly +vixens +vizier +viziers +vizir +vizirs +vizor +vizors +vocable +vocables +vocabularies +vocabulary +vocal +vocalic +vocalist +vocalists +vocalization +vocalizations +vocalize +vocalized +vocalizes +vocalizing +vocally +vocals +vocation +vocational +vocations +vocative +vocatives +vociferate +vociferated +vociferates +vociferating +vociferation +vociferous +vociferously +vociferousness +vodka +vogue +vogues +voguish +voice +voiced +voiceless +voicelessly +voicelessness +voices +voicing +void +voidable +voided +voiding +voids +voila +voile +volatile +volatility +volatilize +volatilized +volatilizes +volatilizing +volcanic +volcano +volcanoes +volcanos +vole +voles +volition +volitional +volley +volleyball +volleyballs +volleyed +volleying +volleys +volt +voltage +voltages +voltaic +voltmeter +voltmeters +volts +volubility +voluble +volubly +volume +volumes +voluminous +voluminously +voluminousness +voluntaries +voluntarily +voluntarism +voluntary +volunteer +volunteered +volunteering +volunteerism +volunteers +voluptuaries +voluptuary +voluptuous +voluptuously +voluptuousness +volute +volutes +vomit +vomited +vomiting +vomits +voodoo +voodooed +voodooing +voodooism +voodoos +voracious +voraciously +voraciousness +voracity +vortex +vortexes +vortices +votaries +votary +vote +voted +voter +voters +votes +voting +votive +vouch +vouched +voucher +vouchers +vouches +vouching +vouchsafe +vouchsafed +vouchsafes +vouchsafing +vowed +vowel +vowels +vowing +vows +voyage +voyaged +voyager +voyagers +voyages +voyageur +voyageurs +voyaging +voyeur +voyeurism +voyeuristic +voyeurs +vulcanization +vulcanize +vulcanized +vulcanizes +vulcanizing +vulgar +vulgarer +vulgarest +vulgarian +vulgarians +vulgarism +vulgarisms +vulgarities +vulgarity +vulgarization +vulgarize +vulgarized +vulgarizer +vulgarizers +vulgarizes +vulgarizing +vulgarly +vulnerabilities +vulnerability +vulnerable +vulnerably +vulpine +vulture +vultures +vulturous +vulva +vulvae +vulvas +vying +wackier +wackiest +wackiness +wacko +wackos +wacky +wadded +wadding +waddle +waddled +waddles +waddling +wade +waded +wader +waders +wades +wadi +wading +wadis +wads +wafer +wafers +waffle +waffled +waffler +wafflers +waffles +waffling +waft +wafted +wafting +wafts +wage +waged +wager +wagered +wagerer +wagerers +wagering +wagers +wages +wagged +waggeries +waggery +wagging +waggish +waggishly +waggishness +waggle +waggled +waggles +waggling +waggon +waggons +waging +wagon +wagoner +wagoners +wagons +wags +wagtail +wagtails +waif +waifs +wail +wailed +wailer +wailers +wailing +wails +wain +wains +wainscot +wainscoted +wainscoting +wainscotings +wainscots +wainscotted +wainscotting +wainscottings +wainwright +wainwrights +waist +waistband +waistbands +waistcoat +waistcoats +waistline +waistlines +waists +wait +waited +waiter +waiters +waiting +waitperson +waitpersons +waitress +waitresses +waits +waitstaff +waive +waived +waiver +waivers +waives +waiving +wake +waked +wakeful +wakefully +wakefulness +waken +wakened +wakening +wakens +wakes +waking +wale +waled +wales +waling +walk +walkaway +walkaways +walked +walker +walkers +walking +walkout +walkouts +walkover +walkovers +walks +walkway +walkways +wall +wallabies +wallaby +wallboard +walled +wallet +wallets +walleye +walleyed +walleyes +wallflower +wallflowers +walling +wallop +walloped +walloping +wallopings +wallops +wallow +wallowed +wallowing +wallows +wallpaper +wallpapered +wallpapering +wallpapers +walls +walnut +walnuts +walrus +walruses +waltz +waltzed +waltzer +waltzers +waltzes +waltzing +wampum +wand +wander +wandered +wanderer +wanderers +wandering +wanderings +wanderlust +wanderlusts +wanders +wands +wane +waned +wanes +wangle +wangled +wangler +wanglers +wangles +wangling +waning +wanly +wanna +wannabe +wannabes +wanner +wanness +wannest +want +wanted +wanting +wanton +wantoned +wantoning +wantonly +wantonness +wantons +wants +wapiti +wapitis +warble +warbled +warbler +warblers +warbles +warbling +warbonnet +warbonnets +ward +warded +warden +wardens +warder +warders +warding +wardrobe +wardrobes +wardroom +wardrooms +wards +ware +warehouse +warehoused +warehouses +warehousing +wares +warfare +warhead +warheads +warhorse +warhorses +warier +wariest +warily +wariness +warlike +warlock +warlocks +warlord +warlords +warm +warmblooded +warmed +warmer +warmers +warmest +warmhearted +warmheartedness +warming +warmish +warmly +warmness +warmonger +warmongering +warmongers +warms +warmth +warmup +warmups +warn +warned +warning +warnings +warns +warp +warpath +warpaths +warped +warping +warplane +warplanes +warps +warrant +warranted +warrantied +warranties +warranting +warrants +warranty +warrantying +warred +warren +warrens +warring +warrior +warriors +wars +warship +warships +wart +warthog +warthogs +wartier +wartiest +wartime +warts +warty +wary +wash +washable +washables +washbasin +washbasins +washboard +washboards +washbowl +washbowls +washcloth +washcloths +washed +washer +washers +washerwoman +washerwomen +washes +washier +washiest +washing +washings +washout +washouts +washrag +washrags +washroom +washrooms +washstand +washstands +washtub +washtubs +washy +wasp +waspish +waspishly +waspishness +wasps +wassail +wassailed +wassailing +wassails +wast +wastage +waste +wastebasket +wastebaskets +wasted +wasteful +wastefully +wastefulness +wasteland +wastelands +wastepaper +waster +wasters +wastes +wasting +wastrel +wastrels +watch +watchband +watchbands +watchdog +watchdogs +watched +watcher +watchers +watches +watchful +watchfully +watchfulness +watching +watchmaker +watchmakers +watchmaking +watchman +watchmen +watchtower +watchtowers +watchword +watchwords +water +waterbed +waterbeds +waterbird +waterbirds +waterborne +watercolor +watercolors +watercourse +watercourses +watercraft +watercress +watered +waterfall +waterfalls +waterfowl +waterfowls +waterfront +waterfronts +waterhole +waterholes +waterier +wateriest +wateriness +watering +waterlilies +waterlily +waterline +waterlines +waterlogged +watermark +watermarked +watermarking +watermarks +watermelon +watermelons +watermill +watermills +waterpower +waterproof +waterproofed +waterproofing +waterproofs +waters +watershed +watersheds +waterside +watersides +waterspout +waterspouts +watertight +waterway +waterways +waterwheel +waterwheels +waterworks +watery +watt +wattage +wattle +wattled +wattles +wattling +watts +wave +waved +wavelength +wavelengths +wavelet +wavelets +wavelike +waver +wavered +waverer +waverers +wavering +waveringly +wavers +waves +wavier +waviest +waviness +waving +wavy +waxed +waxen +waxes +waxier +waxiest +waxiness +waxing +waxwing +waxwings +waxwork +waxworks +waxy +waybill +waybills +wayfarer +wayfarers +wayfaring +wayfarings +waylaid +waylay +waylayer +waylayers +waylaying +waylays +ways +wayside +waysides +wayward +waywardly +waywardness +weak +weaken +weakened +weakener +weakeners +weakening +weakens +weaker +weakest +weakfish +weakfishes +weakling +weaklings +weakly +weakness +weaknesses +weal +weals +wealth +wealthier +wealthiest +wealthiness +wealthy +wean +weaned +weaning +weans +weapon +weaponless +weaponry +weapons +wear +wearable +wearer +wearers +wearied +wearier +wearies +weariest +wearily +weariness +wearing +wearisome +wearisomely +wears +weary +wearying +weasel +weaseled +weaseling +weaselled +weaselling +weaselly +weasels +weather +weathercock +weathercocks +weathered +weathering +weatherization +weatherize +weatherized +weatherizes +weatherizing +weatherman +weathermen +weatherperson +weatherpersons +weatherproof +weatherproofed +weatherproofing +weatherproofs +weathers +weatherstrip +weatherstripped +weatherstripping +weatherstrips +weave +weaved +weaver +weavers +weaves +weaving +webbed +webbing +webfeet +webfoot +webs +website +websites +wedded +wedding +weddings +wedge +wedged +wedges +wedgie +wedgies +wedging +wedlock +weds +weed +weeded +weeder +weeders +weedier +weediest +weeding +weedless +weeds +weedy +weeing +week +weekday +weekdays +weekend +weekended +weekending +weekends +weeklies +weekly +weeknight +weeknights +weeks +ween +weened +weenie +weenier +weenies +weeniest +weening +weens +weensier +weensiest +weensy +weeny +weep +weeper +weepers +weepier +weepies +weepiest +weeping +weeps +weepy +weer +wees +weest +weevil +weevils +weft +wefts +weigh +weighed +weighing +weighs +weight +weighted +weightier +weightiest +weightily +weightiness +weighting +weightless +weightlessly +weightlessness +weightlifter +weightlifters +weightlifting +weights +weighty +weir +weird +weirder +weirdest +weirdie +weirdies +weirdly +weirdness +weirdo +weirdos +weirs +welch +welched +welches +welching +welcome +welcomed +welcomes +welcoming +weld +weldable +welded +welder +welders +welding +welds +welfare +welkin +well +welled +wellhead +wellheads +welling +wellington +wellingtons +wellness +wells +wellspring +wellsprings +welsh +welshed +welsher +welshers +welshes +welshing +welt +welted +welter +weltered +weltering +welters +welterweight +welterweights +welting +welts +wench +wenches +wend +wended +wending +wends +wens +went +wept +were +werewolf +werewolves +werwolf +werwolves +west +westbound +westerlies +westerly +western +westerner +westerners +westernization +westernize +westernized +westernizes +westernizing +westernmost +westerns +westward +westwards +wetback +wetbacks +wetland +wetlands +wetly +wetness +wets +wetted +wetter +wetters +wettest +wetting +whack +whacked +whacker +whackers +whackier +whackiest +whacking +whacks +whacky +whale +whaleboat +whaleboats +whalebone +whaled +whaler +whalers +whales +whaling +wham +whammed +whammies +whamming +whammy +whams +wharf +wharfs +wharves +what +whatchamacallit +whatchamacallits +whatever +whatnot +whats +whatsoever +wheal +wheals +wheat +wheaten +whee +wheedle +wheedled +wheedler +wheedlers +wheedles +wheedling +wheel +wheelbarrow +wheelbarrows +wheelbase +wheelbases +wheelchair +wheelchairs +wheeled +wheelhouse +wheelhouses +wheelie +wheelies +wheeling +wheels +wheelwright +wheelwrights +wheeze +wheezed +wheezes +wheezier +wheeziest +wheezily +wheeziness +wheezing +wheezy +whelk +whelks +whelm +whelmed +whelming +whelms +whelp +whelped +whelping +whelps +when +whence +whenever +whens +whensoever +where +whereabouts +whereas +whereat +whereby +wherefore +wherefores +wherein +whereof +whereon +wheres +wheresoever +whereto +whereupon +wherever +wherewith +wherewithal +wherries +wherry +whet +whether +whets +whetstone +whetstones +whetted +whetting +whew +whey +which +whichever +whiff +whiffed +whiffing +whiffletree +whiffletrees +whiffs +while +whiled +whiles +whiling +whilom +whilst +whim +whimper +whimpered +whimpering +whimpers +whims +whimsey +whimseys +whimsical +whimsicality +whimsically +whimsies +whimsy +whine +whined +whiner +whiners +whines +whinier +whiniest +whining +whinnied +whinnies +whinny +whinnying +whiny +whip +whipcord +whiplash +whiplashes +whipped +whipper +whippers +whippersnapper +whippersnappers +whippet +whippets +whipping +whippings +whippletree +whippletrees +whippoorwill +whippoorwills +whips +whipsaw +whipsawed +whipsawing +whipsawn +whipsaws +whir +whirl +whirled +whirligig +whirligigs +whirling +whirlpool +whirlpools +whirls +whirlwind +whirlwinds +whirlybird +whirlybirds +whirr +whirred +whirring +whirrs +whirs +whisk +whisked +whisker +whiskered +whiskers +whiskery +whiskey +whiskeys +whiskies +whisking +whisks +whisky +whisper +whispered +whisperer +whisperers +whispering +whispers +whist +whistle +whistled +whistler +whistlers +whistles +whistling +whit +white +whitecap +whitecaps +whitefish +whitefishes +whitehead +whiteheads +whiten +whitened +whitener +whiteners +whiteness +whitening +whitenings +whitens +whiteout +whiteouts +whiter +whites +whitest +whitetail +whitetails +whitewall +whitewalls +whitewash +whitewashed +whitewashes +whitewashing +whitewater +whitey +whiteys +whither +whiting +whitings +whitish +whits +whittle +whittled +whittler +whittlers +whittles +whittling +whiz +whizkid +whizkids +whizz +whizzbang +whizzbangs +whizzed +whizzes +whizzing +whoa +whodunit +whodunits +whodunnit +whodunnits +whoever +whole +wholehearted +wholeheartedly +wholeheartedness +wholeness +wholes +wholesale +wholesaled +wholesaler +wholesalers +wholesales +wholesaling +wholesome +wholesomely +wholesomeness +wholesomer +wholesomest +wholly +whom +whomever +whomsoever +whoop +whooped +whoopee +whooper +whoopers +whooping +whoops +whoosh +whooshed +whooshes +whooshing +whopper +whoppers +whopping +whore +whorehouse +whorehouses +whoreish +whores +whorish +whorl +whorled +whorls +whose +whoso +whosoever +whys +wick +wicked +wickeder +wickedest +wickedly +wickedness +wicker +wickers +wickerwork +wicket +wickets +wicking +wicks +wide +widely +widemouthed +widen +widened +widener +wideners +wideness +widening +widens +wider +widespread +widest +widgeon +widgeons +widow +widowed +widower +widowers +widowhood +widowing +widows +width +widths +wield +wielded +wielder +wielders +wielding +wields +wiener +wieners +wienie +wienies +wife +wifeless +wifely +wigeon +wigeons +wigged +wigging +wiggle +wiggled +wiggler +wigglers +wiggles +wigglier +wiggliest +wiggling +wiggly +wight +wights +wiglet +wiglets +wigs +wigwag +wigwagged +wigwagging +wigwags +wigwam +wigwams +wild +wildcat +wildcats +wildcatted +wildcatter +wildcatters +wildcatting +wildebeest +wildebeests +wilder +wilderness +wildernesses +wildest +wildfire +wildfires +wildflower +wildflowers +wildfowl +wildfowls +wildlife +wildly +wildness +wilds +wile +wiled +wiles +wilful +wilfully +wilfulness +wilier +wiliest +wiliness +wiling +will +willed +willful +willfully +willfulness +willies +willing +willingly +willingness +williwaw +williwaws +willow +willowier +willowiest +willows +willowy +willpower +wills +wilt +wilted +wilting +wilts +wily +wimp +wimpier +wimpiest +wimpish +wimple +wimpled +wimples +wimpling +wimps +wimpy +wince +winced +winces +winch +winched +winches +winching +wincing +wind +windbag +windbags +windblown +windbreak +windbreaker +windbreakers +windbreaks +windburn +windburned +windchill +winded +winder +winders +windfall +windfalls +windflower +windflowers +windier +windiest +windily +windiness +winding +windjammer +windjammers +windlass +windlasses +windless +windmill +windmilled +windmilling +windmills +window +windowless +windowpane +windowpanes +windows +windowsill +windowsills +windpipe +windpipes +windproof +windrow +windrows +winds +windshield +windshields +windsock +windsocks +windstorm +windstorms +windsurf +windsurfed +windsurfer +windsurfers +windsurfing +windsurfs +windswept +windup +windups +windward +windy +wine +wined +wineglass +wineglasses +winegrower +winegrowers +winemaker +winemakers +wineries +winery +wines +wing +wingding +wingdings +winged +winging +wingless +winglike +wings +wingspan +wingspans +wingspread +wingspreads +wingtip +wingtips +winier +winiest +wining +wink +winked +winker +winkers +winking +winkle +winkled +winkles +winkling +winks +winnable +winner +winners +winning +winningly +winnings +winnow +winnowed +winnower +winnowers +winnowing +winnows +wino +winos +wins +winsome +winsomely +winsomeness +winsomer +winsomest +winter +wintered +wintergreen +winterier +winteriest +wintering +winterize +winterized +winterizes +winterizing +winters +wintertime +wintery +wintrier +wintriest +wintry +winy +wipe +wiped +wiper +wipers +wipes +wiping +wire +wired +wirehair +wirehairs +wireless +wirelesses +wires +wiretap +wiretapped +wiretapper +wiretappers +wiretapping +wiretaps +wirier +wiriest +wiriness +wiring +wiry +wisdom +wise +wiseacre +wiseacres +wisecrack +wisecracked +wisecracking +wisecracks +wisely +wiser +wises +wisest +wish +wishbone +wishbones +wished +wisher +wishers +wishes +wishful +wishfully +wishing +wisp +wispier +wispiest +wisps +wispy +wist +wistaria +wistarias +wisteria +wisterias +wistful +wistfully +wistfulness +witch +witchcraft +witched +witchery +witches +witching +with +withal +withdraw +withdrawal +withdrawals +withdrawing +withdrawn +withdraws +withdrew +withe +withed +wither +withered +withering +witheringly +withers +withes +withheld +withhold +withholding +withholds +within +withing +without +withstand +withstanding +withstands +withstood +witless +witlessly +witlessness +witness +witnessed +witnesses +witnessing +wits +witted +witticism +witticisms +wittier +wittiest +wittily +wittiness +witting +wittingly +witty +wive +wived +wives +wiving +wizard +wizardry +wizards +wizened +wizes +wizzes +woad +wobble +wobbled +wobbles +wobblier +wobbliest +wobbliness +wobbling +wobbly +woebegone +woeful +woefuller +woefullest +woefully +woefulness +woes +woke +woken +woks +wold +wolds +wolf +wolfed +wolfhound +wolfhounds +wolfing +wolfish +wolfram +wolfs +wolverine +wolverines +wolves +woman +womanhood +womanish +womanize +womanized +womanizer +womanizers +womanizes +womanizing +womankind +womanlier +womanliest +womanlike +womanliness +womanly +womb +wombat +wombats +wombs +women +womenfolk +womenfolks +wonder +wondered +wonderful +wonderfully +wonderfulness +wondering +wonderingly +wonderland +wonderlands +wonderment +wonders +wondrous +wondrously +wonk +wonkier +wonkiest +wonks +wonky +wont +wonted +wonton +wontons +wood +woodbine +woodblock +woodblocks +woodcarver +woodcarvers +woodcarving +woodcarvings +woodchuck +woodchucks +woodcock +woodcocks +woodcraft +woodcut +woodcuts +woodcutter +woodcutters +woodcutting +wooded +wooden +woodener +woodenest +woodenly +woodenness +woodier +woodies +woodiest +woodiness +wooding +woodland +woodlands +woodlot +woodlots +woodman +woodmen +woodpecker +woodpeckers +woodpile +woodpiles +woods +woodshed +woodsheds +woodsier +woodsiest +woodsiness +woodsman +woodsmen +woodsy +woodwind +woodwinds +woodwork +woodworker +woodworkers +woodworking +woody +wooed +wooer +wooers +woof +woofed +woofer +woofers +woofing +woofs +wooing +wool +woolen +woolens +woolgathering +woolie +woolier +woolies +wooliest +woollen +woollens +woollier +woollies +woolliest +woolliness +woolly +wooly +woos +woozier +wooziest +woozily +wooziness +woozy +word +wordage +wordbook +wordbooks +worded +wordier +wordiest +wordily +wordiness +wording +wordings +wordless +wordlessly +wordplay +words +wordy +wore +work +workable +workaday +workaholic +workaholics +workbench +workbenches +workbook +workbooks +workday +workdays +worked +worker +workers +workfare +workforce +workhorse +workhorses +workhouse +workhouses +working +workingman +workingmen +workings +workingwoman +workingwomen +workload +workloads +workman +workmanlike +workmanship +workmen +workout +workouts +workplace +workplaces +workroom +workrooms +works +worksheet +worksheets +workshop +workshops +workstation +workstations +worktable +worktables +workup +workups +workweek +workweeks +world +worldlier +worldliest +worldliness +worldly +worlds +worldview +worldviews +worldwide +worm +wormed +wormhole +wormholes +wormier +wormiest +worming +worms +wormwood +wormy +worn +worried +worrier +worriers +worries +worriment +worrisome +worry +worrying +worryingly +worrywart +worrywarts +worse +worsen +worsened +worsening +worsens +worship +worshiped +worshiper +worshipers +worshipful +worshiping +worshipped +worshipper +worshippers +worshipping +worships +worst +worsted +worsting +worsts +wort +worth +worthier +worthies +worthiest +worthily +worthiness +worthless +worthlessly +worthlessness +worthwhile +worthy +would +wouldst +wound +wounded +wounding +wounds +wove +woven +wowed +wowing +wows +wrack +wraith +wraiths +wrangle +wrangled +wrangler +wranglers +wrangles +wrangling +wrap +wraparound +wraparounds +wrapped +wrapper +wrappers +wrapping +wrappings +wraps +wrapt +wrasse +wrasses +wrath +wrathful +wrathfully +wreak +wreaked +wreaking +wreaks +wreath +wreathe +wreathed +wreathes +wreathing +wreaths +wreck +wreckage +wrecked +wrecker +wreckers +wrecking +wrecks +wren +wrench +wrenched +wrenches +wrenching +wrens +wrest +wrested +wresting +wrestle +wrestled +wrestler +wrestlers +wrestles +wrestling +wrests +wretch +wretched +wretcheder +wretchedest +wretchedly +wretchedness +wretches +wrier +wriest +wriggle +wriggled +wriggler +wrigglers +wriggles +wrigglier +wriggliest +wriggling +wriggly +wright +wrights +wring +wringer +wringers +wringing +wrings +wrinkle +wrinkled +wrinkles +wrinklier +wrinklies +wrinkliest +wrinkling +wrinkly +wrist +wristband +wristbands +wrists +wristwatch +wristwatches +writ +write +writer +writers +writes +writhe +writhed +writhes +writhing +writing +writings +writs +written +wrong +wrongdoer +wrongdoers +wrongdoing +wrongdoings +wronged +wronger +wrongest +wrongful +wrongfully +wrongfulness +wrongheaded +wrongheadedly +wrongheadedness +wronging +wrongly +wrongness +wrongs +wrote +wroth +wrought +wrung +wryer +wryest +wryly +wryness +wurst +wursts +wuss +wusses +wussier +wussies +wussiest +wussy +xenon +xenophobe +xenophobes +xenophobia +xenophobic +xerographic +xerography +xerox +xeroxed +xeroxes +xeroxing +xylem +xylophone +xylophones +xylophonist +xylophonists +yacht +yachted +yachting +yachts +yachtsman +yachtsmen +yachtswoman +yachtswomen +yack +yacked +yacking +yacks +yahoo +yahoos +yakked +yakking +yaks +yammer +yammered +yammerer +yammerers +yammering +yammers +yams +yang +yank +yanked +yanking +yanks +yapped +yapping +yaps +yard +yardage +yardages +yardarm +yardarms +yardman +yardmaster +yardmasters +yardmen +yards +yardstick +yardsticks +yarmelke +yarmelkes +yarmulke +yarmulkes +yarn +yarns +yarrow +yawed +yawing +yawl +yawls +yawn +yawned +yawner +yawners +yawning +yawns +yaws +yeah +yeahs +year +yearbook +yearbooks +yearlies +yearling +yearlings +yearlong +yearly +yearn +yearned +yearning +yearnings +yearns +years +yeas +yeast +yeastier +yeastiest +yeasts +yeasty +yegg +yeggs +yell +yelled +yelling +yellow +yellowed +yellower +yellowest +yellowing +yellowish +yellowness +yellows +yellowy +yells +yelp +yelped +yelping +yelps +yens +yeoman +yeomanry +yeomen +yeps +yeses +yeshiva +yeshivah +yeshivahs +yeshivas +yeshivoth +yessed +yessing +yesterday +yesterdays +yesteryear +yeti +yetis +yews +yield +yielded +yielding +yields +yikes +yipe +yipped +yippee +yipping +yips +yodel +yodeled +yodeler +yodelers +yodeling +yodelled +yodeller +yodellers +yodelling +yodels +yoga +yoghourt +yoghourts +yoghurt +yoghurts +yogi +yogin +yogins +yogis +yogurt +yogurts +yoke +yoked +yokel +yokels +yokes +yoking +yolk +yolked +yolks +yonder +yore +young +younger +youngest +youngish +youngster +youngsters +your +yours +yourself +yourselves +yous +youth +youthful +youthfully +youthfulness +youths +yowl +yowled +yowling +yowls +ytterbium +yttrium +yuan +yucca +yuccas +yuck +yucked +yuckier +yuckiest +yucking +yucks +yucky +yukked +yukking +yuks +yule +yuletide +yummier +yummiest +yummy +yuppie +yuppies +yuppy +yups +yurt +yurts +zanier +zanies +zaniest +zaniness +zany +zapped +zapper +zappers +zapping +zaps +zeal +zealot +zealotry +zealots +zealous +zealously +zealousness +zebra +zebras +zebu +zebus +zeds +zeitgeist +zeitgeists +zenith +zeniths +zephyr +zephyrs +zeppelin +zeppelins +zero +zeroed +zeroes +zeroing +zeros +zest +zestful +zestfully +zestfulness +zestier +zestiest +zests +zesty +zeta +zetas +zigzag +zigzagged +zigzagging +zigzags +zilch +zillion +zillions +zinc +zinced +zincing +zincked +zincking +zincs +zinfandel +zing +zinged +zinger +zingers +zingier +zingiest +zinging +zings +zingy +zinnia +zinnias +zipped +zipper +zippered +zippering +zippers +zippier +zippiest +zipping +zippy +zips +zircon +zirconium +zircons +zither +zithers +zits +zloty +zlotys +zodiac +zodiacal +zodiacs +zombi +zombie +zombies +zombis +zonal +zonally +zone +zoned +zones +zoning +zonked +zookeeper +zookeepers +zoological +zoologically +zoologist +zoologists +zoology +zoom +zoomed +zooming +zooms +zoophyte +zoophytes +zoophytic +zoos +zounds +zucchini +zucchinis +zwieback +zydeco +zygote +zygotes +zygotic +zymurgy From 6c6f9c01c7cbcf8cbeb5f3da9025b2c055f7b277 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 6 Apr 2022 23:40:50 +0200 Subject: [PATCH 160/174] lightswitch: Correct default touchOn Change settings.js and widget.js: - Correct default value of touchOn according to value in README.md --- apps/lightswitch/settings.js | 2 +- apps/lightswitch/widget.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lightswitch/settings.js b/apps/lightswitch/settings.js index a502324d9..5ac70bc28 100644 --- a/apps/lightswitch/settings.js +++ b/apps/lightswitch/settings.js @@ -6,7 +6,7 @@ var settings = Object.assign({ colors: "011", image: "default", - touchOn: "clock,launch", + touchOn: "always", oversize: 20, dragDelay: 500, minValue: 0.1, diff --git a/apps/lightswitch/widget.js b/apps/lightswitch/widget.js index 53f86ee9a..829f75102 100644 --- a/apps/lightswitch/widget.js +++ b/apps/lightswitch/widget.js @@ -3,7 +3,7 @@ var settings = Object.assign({ colors: "011", image: "default", - touchOn: "clock,launch", + touchOn: "always", oversize: 20, dragDelay: 500, minValue: 0.1, From 80d35e4e33646a7395de1451c218b84cab081f63 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 01:22:52 +0200 Subject: [PATCH 161/174] massages: Add option to disable icon flashing Update ChangeLog, metadata.json, README.md and settigns.js: - Add option to toggle icon flashing. Update widget.js: - Add option to toggle icon flashing. - Correct clearRect y2 value. - Moved icon 1px up to be more centered. --- apps/messages/ChangeLog | 1 + apps/messages/README.md | 1 + apps/messages/metadata.json | 2 +- apps/messages/settings.js | 6 ++++++ apps/messages/widget.js | 11 +++++++---- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 092a38eb6..3e676c21e 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -43,3 +43,4 @@ 0.28: Option to auto-unlock the watch when a new message arrives 0.29: Fix message list overwrites on Bangle.js 1 (fix #1642) 0.30: Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) +0.31: Option to disable icon flashing diff --git a/apps/messages/README.md b/apps/messages/README.md index 780d8e50b..da2701f35 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -21,6 +21,7 @@ is chosen if there isn't much message text, but this specifies the smallest the it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? * `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? +* `Flash Icon` - Toggle flashing of the widget icon. ## New Messages diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index dfeedaef7..5c1e67702 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.30", + "version": "0.31", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 754347f19..cc0030ec5 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -7,6 +7,7 @@ settings.unlockWatch=!!settings.unlockWatch; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; + if (settings.flash===undefined) settings.flash=true; return settings; } function updateSetting(setting, value) { @@ -47,6 +48,11 @@ format: v => v?/*LANG*/'Yes':/*LANG*/'No', onchange: v => updateSetting("unlockWatch", v) }, + /*LANG*/'Flash Icon': { + value: !!settings().flash, + format: v => v?/*LANG*/'Yes':/*LANG*/'No', + onchange: v => updateSetting("flash", v) + }, }; E.showMenu(mainmenu); }) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 3ac726e77..4b368ffd6 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function() { +draw:function(recall) { // If we had a setTimeout queued from the last time we were called, remove it if (WIDGETS["messages"].i) { clearTimeout(WIDGETS["messages"].i); @@ -8,15 +8,18 @@ draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; - g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); - g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); let settings = require('Storage').readJSON("messages.settings.json", true) || {}; + if (settings.flash===undefined) settings.flash = true; + if (recall !== true || settings.flash) { + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); + g.drawImage(settings.flash && (c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y-1); + } if (settings.repeat===undefined) settings.repeat = 4; if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } - WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(), 1000); + WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From 1c93c4bd01b3b5e725487401eaebb701c5fd5f5d Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 01:28:15 +0200 Subject: [PATCH 162/174] Revert "massages: Add option to disable icon flashing" This reverts commit 80d35e4e33646a7395de1451c218b84cab081f63. --- apps/messages/ChangeLog | 1 - apps/messages/README.md | 1 - apps/messages/metadata.json | 2 +- apps/messages/settings.js | 6 ------ apps/messages/widget.js | 11 ++++------- 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 3e676c21e..092a38eb6 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -43,4 +43,3 @@ 0.28: Option to auto-unlock the watch when a new message arrives 0.29: Fix message list overwrites on Bangle.js 1 (fix #1642) 0.30: Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) -0.31: Option to disable icon flashing diff --git a/apps/messages/README.md b/apps/messages/README.md index da2701f35..780d8e50b 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -21,7 +21,6 @@ is chosen if there isn't much message text, but this specifies the smallest the it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? * `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? -* `Flash Icon` - Toggle flashing of the widget icon. ## New Messages diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 5c1e67702..dfeedaef7 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.31", + "version": "0.30", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index cc0030ec5..754347f19 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -7,7 +7,6 @@ settings.unlockWatch=!!settings.unlockWatch; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; - if (settings.flash===undefined) settings.flash=true; return settings; } function updateSetting(setting, value) { @@ -48,11 +47,6 @@ format: v => v?/*LANG*/'Yes':/*LANG*/'No', onchange: v => updateSetting("unlockWatch", v) }, - /*LANG*/'Flash Icon': { - value: !!settings().flash, - format: v => v?/*LANG*/'Yes':/*LANG*/'No', - onchange: v => updateSetting("flash", v) - }, }; E.showMenu(mainmenu); }) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 4b368ffd6..3ac726e77 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function(recall) { +draw:function() { // If we had a setTimeout queued from the last time we were called, remove it if (WIDGETS["messages"].i) { clearTimeout(WIDGETS["messages"].i); @@ -8,18 +8,15 @@ draw:function(recall) { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); + g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); let settings = require('Storage').readJSON("messages.settings.json", true) || {}; - if (settings.flash===undefined) settings.flash = true; - if (recall !== true || settings.flash) { - g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); - g.drawImage(settings.flash && (c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y-1); - } if (settings.repeat===undefined) settings.repeat = 4; if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } - WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); + WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From 1d23c4f2e4981f924b15c84d86d2ba9964014ea2 Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 01:30:39 +0200 Subject: [PATCH 163/174] massages: Add option to disable icon flashing Update ChangeLog, metadata.json, README.md and settigns.js: - Add option to toggle icon flashing. Update widget.js: - Add option to toggle icon flashing. - Correct clearRect y2 value. - Moved icon 1px up to be more centered. --- apps/messages/ChangeLog | 1 + apps/messages/README.md | 1 + apps/messages/metadata.json | 2 +- apps/messages/settings.js | 6 ++++++ apps/messages/widget.js | 11 +++++++---- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 092a38eb6..3e676c21e 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -43,3 +43,4 @@ 0.28: Option to auto-unlock the watch when a new message arrives 0.29: Fix message list overwrites on Bangle.js 1 (fix #1642) 0.30: Add new Icons (Youtube, Twitch, MS TODO, Teams, Snapchat, Signal, Post & DHL, Nina, Lieferando, Kalender, Discord, Corona Warn, Bibel) +0.31: Option to disable icon flashing diff --git a/apps/messages/README.md b/apps/messages/README.md index 780d8e50b..da2701f35 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -21,6 +21,7 @@ is chosen if there isn't much message text, but this specifies the smallest the it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? * `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? +* `Flash Icon` - Toggle flashing of the widget icon. ## New Messages diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index dfeedaef7..5c1e67702 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.30", + "version": "0.31", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 754347f19..cc0030ec5 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -7,6 +7,7 @@ settings.unlockWatch=!!settings.unlockWatch; settings.openMusic=!!settings.openMusic; settings.maxUnreadTimeout=240; + if (settings.flash===undefined) settings.flash=true; return settings; } function updateSetting(setting, value) { @@ -47,6 +48,11 @@ format: v => v?/*LANG*/'Yes':/*LANG*/'No', onchange: v => updateSetting("unlockWatch", v) }, + /*LANG*/'Flash Icon': { + value: !!settings().flash, + format: v => v?/*LANG*/'Yes':/*LANG*/'No', + onchange: v => updateSetting("flash", v) + }, }; E.showMenu(mainmenu); }) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 3ac726e77..4b368ffd6 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,5 +1,5 @@ WIDGETS["messages"]={area:"tl", width:0, iconwidth:24, -draw:function() { +draw:function(recall) { // If we had a setTimeout queued from the last time we were called, remove it if (WIDGETS["messages"].i) { clearTimeout(WIDGETS["messages"].i); @@ -8,15 +8,18 @@ draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; - g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); - g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); let settings = require('Storage').readJSON("messages.settings.json", true) || {}; + if (settings.flash===undefined) settings.flash = true; + if (recall !== true || settings.flash) { + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); + g.drawImage(settings.flash && (c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y-1); + } if (settings.repeat===undefined) settings.repeat = 4; if (c<120 && (Date.now()-this.l)>settings.repeat*1000) { this.l = Date.now(); WIDGETS["messages"].buzz(); // buzz every 4 seconds } - WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(), 1000); + WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); },show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time From 2816c46be596d67c5c87c7ef9e9c43670b6a1700 Mon Sep 17 00:00:00 2001 From: Eskild Hustvedt Date: Thu, 7 Apr 2022 09:41:48 +0200 Subject: [PATCH 164/174] locales: Fixed day order for no_NB --- apps/locale/locales.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 282c808f3..b899577f9 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -698,8 +698,8 @@ var locales = { datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", - abday: "Ma,Ti,On,To,Fr,Lø,Sø", - day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", + abday: "Sø,Ma,Ti,On,To,Fr,Lø", + day: "Søndag,Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag", trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } }, /*, From dd31ebbc597f416d16b13b2788b36dc2be01723b Mon Sep 17 00:00:00 2001 From: Eskild Hustvedt Date: Thu, 7 Apr 2022 10:47:26 +0200 Subject: [PATCH 165/174] locales/fuzzyw: Added Norwegian Nynorsk translation --- apps/fuzzyw/fuzzy_strings.json | 23 +++++++++++++++++++++++ apps/locale/locales.js | 18 ++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 8594ad554..55f443813 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -114,6 +114,29 @@ ], "text_scale":3.5 }, + "nn_NO":{ + "hours":[ + "tolv", "eitt", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve", + "tolv", "eitt", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve" + ], + "minutes":[ + "klokka er *$1", + "fem over *$1", + "ti over *$1", + "kvart over *$1", + "ti på halv *$2", + "fem på halv *$2", + "halv *$2", + "fem over halv *$2", + "ti over halv *$2", + "kvart på *$2", + "ti på *$2", + "fem på *$2" + ], + "text_scale":3.5 + }, "sv_SE":{ "hours":[ "tolv", "ett", "två", "tre", "fyra", "fem", diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 282c808f3..fe2325848 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -684,6 +684,24 @@ var locales = { day: "Pirmdiena,Otrdiena,Trešdiena,Ceturtdiena,Piektdiena,Sestdiena,Svētdiena", trans: { yes: "jā", Yes: "Jā", no: "nē", No: "Nē", ok: "labi", on: "Ieslēgt", off: "Izslēgt", "< Back": "< Atpakaļ" } }, + "nn_NO": { // Using charfallbacks + lang: "nn_NO", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Su,Må,Ty,On,To,Fr,La", + day: "Sundag,Måndag,Tysdag,Onsdag,Torsdag,Fredag,Laurdag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulesen" } + }, "no_NB": { // Using charfallbacks lang: "no_NB", decimal_point: ",", From d2f2d712a22b4631d48554295411c83c64ce579e Mon Sep 17 00:00:00 2001 From: storm64 Date: Thu, 7 Apr 2022 13:01:47 +0200 Subject: [PATCH 166/174] mylocation: Fix selecting Frankfurt not saved Corrected check for selected location = "???". --- apps/mylocation/ChangeLog | 1 + apps/mylocation/metadata.json | 2 +- apps/mylocation/mylocation.app.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/mylocation/ChangeLog b/apps/mylocation/ChangeLog index b9eba67f4..ab8af7620 100644 --- a/apps/mylocation/ChangeLog +++ b/apps/mylocation/ChangeLog @@ -1,3 +1,4 @@ 0.01: First release 0.02: Enhanced icon, make it bolder 0.03: Fixed issue with defaulting back to London +0.04: Fixed issue selecting Frankfurt not saved diff --git a/apps/mylocation/metadata.json b/apps/mylocation/metadata.json index a7fd8356c..9182ba160 100644 --- a/apps/mylocation/metadata.json +++ b/apps/mylocation/metadata.json @@ -4,7 +4,7 @@ "icon": "mylocation.png", "type": "app", "screenshots": [{"url":"screenshot_1.png"}], - "version":"0.03", + "version":"0.04", "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js index 27ab17ea5..b9451e0fb 100644 --- a/apps/mylocation/mylocation.app.js +++ b/apps/mylocation/mylocation.app.js @@ -61,7 +61,7 @@ function showMainMenu() { min: 0, max: locations.length - 1, format: v => locations[v], onchange: v => { - if (v != 6) { + if (locations[v] !== "???") { s.location = locations[v]; s.lat = lats[v]; s.lon = lons[v]; From 2c36071a374a0e4a6af94286ddb04513ce280dda Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 14:21:36 +0100 Subject: [PATCH 167/174] alarm 0.18: Cope with >1 identical alarm at once (#1667) --- apps/alarm/ChangeLog | 1 + apps/alarm/app.js | 22 ++++++++++++++++------ apps/alarm/metadata.json | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 0811f2166..7c266c0be 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -16,3 +16,4 @@ 0.15: Fix hour/minute wrapping code for new menu system 0.16: Adding alarm library 0.17: Moving alarm internals to 'sched' library +0.18: Cope with >1 identical alarm at once (#1667) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 45edd83f5..802a4744b 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -45,12 +45,22 @@ function showMainMenu() { /*LANG*/'New Timer': ()=>editTimer(-1) }; alarms.forEach((alarm,idx)=>{ - var txt; // a leading space is currently required (JS error in Espruino 2v12) - if (alarm.timer) - txt = /*LANG*/"Timer"+" "+formatTime(alarm.timer); - else - txt = /*LANG*/"Alarm"+" "+formatTime(alarm.t); + var type,txt; // a leading space is currently required (JS error in Espruino 2v12) + if (alarm.timer) { + type = /*LANG*/"Timer"; + txt = " "+formatTime(alarm.timer); + } else { + type = /*LANG*/"Alarm"; + txt = " "+formatTime(alarm.t); + } if (alarm.rp) txt += "\0"+atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA="); + // rename duplicate alarms + if (menu[type+txt]) { + var n = 2; + while (menu[type+" "+n+txt]) n++; + txt = type+" "+n+txt; + } else txt = type+txt; + // add to menu menu[txt] = { value : "\0"+atob(alarm.on?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"), onchange : function() { @@ -84,7 +94,7 @@ function editAlarm(alarmIndex, alarm) { var a = { t : 12*3600000, // 12 o clock default on : true, - rp : true, + rp : false, // repeat not the default as : false, dow : 0b1111111, last : 0, diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index fe82e04c9..0d9567849 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarm & Timer", "shortName": "Alarms", - "version": "0.17", + "version": "0.18", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", From 1dd232ffce46386fe81d6f547bf35a7558e4ca20 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 15:47:01 +0100 Subject: [PATCH 168/174] alarm fixes (fix #1667) --- apps/alarm/ChangeLog | 1 + apps/alarm/app.js | 4 ++-- apps/alarm/metadata.json | 2 +- apps/sched/ChangeLog | 1 + apps/sched/boot.js | 29 ++++++++++++++++++++++++----- apps/sched/metadata.json | 2 +- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 7c266c0be..fcafc386f 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -17,3 +17,4 @@ 0.16: Adding alarm library 0.17: Moving alarm internals to 'sched' library 0.18: Cope with >1 identical alarm at once (#1667) +0.19: Ensure rescheduled alarms that already fired have 'last' reset diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 802a4744b..b9404358e 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -138,8 +138,7 @@ function editAlarm(alarmIndex, alarm) { }; menu[/*LANG*/"Save"] = function() { a.t = encodeTime(t); - if (a.t < getCurrentTime()) - a.day = (new Date()).getDate(); + a.last = (a.t < getCurrentTime()) ? (new Date()).getDate() : 0; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); @@ -191,6 +190,7 @@ function editTimer(alarmIndex, alarm) { menu[/*LANG*/"Save"] = function() { a.timer = encodeTime(t); a.t = getCurrentTime() + a.timer; + a.last = 0; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 0d9567849..9636257ca 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarm & Timer", "shortName": "Alarms", - "version": "0.18", + "version": "0.19", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index 5560f00bc..d8cd37a05 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Fix scheduling of other alarms if there is a pending alarm from the past (fix #1667) diff --git a/apps/sched/boot.js b/apps/sched/boot.js index c772a135e..dbdf02593 100644 --- a/apps/sched/boot.js +++ b/apps/sched/boot.js @@ -6,13 +6,19 @@ } var alarms = require('Storage').readJSON('sched.json',1)||[]; var time = new Date(); - var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1 && (!a.date || a.date==time.toISOString().substr(0,10))); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + var d = time.getDate(); + var active = alarms.filter( + a=>a.on && // enabled + a.last!=d && // not already fired today + a.t+60000>currentTime && // is not in the past by >1 minute + (a.dow>>time.getDay())&1 && // is allowed on this day of the week + (!a.date || a.date==time.toISOString().substr(0,10)) // is allowed on this date + ); if (active.length) { - active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); - var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + active = active.sort((a,b)=>a.t-b.t); // sort by time var t = active[0].t-currentTime; - if (active[0].last == time.getDate() || t < -60000) t += 86400000; - if (t<1000) t=1000; // start alarm min 1 sec from now + if (t<1000) t=1000; // start alarm minimum 1 sec from now /* execute alarm at the correct time. We avoid execing immediately since this code will get called AGAIN when alarm.js is loaded. alarm.js will then clearInterval() to get rid of this call so it can proceed @@ -23,3 +29,16 @@ Bangle.SCHED = setTimeout('eval(require("Storage").read("sched.boot.js"))', 86400000 - (Date.now()%86400000)); } })(); +/* DEBUGGING +=============== + +// show the current timer for the next event +global["\xff"].timers[Bangle.SCHED] + +// time in hours of scheduled timer event +global["\xff"].timers[Bangle.SCHED].time / (1024*1024*60*60) + +// set time 1 hour in the past +setTime(getTime() - 60*60) + +*/ diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 60aa71d41..defffb29b 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.01", + "version": "0.02", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler", From 895e7ffd599fe457077c646b8fa44868d6f0343b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 15:53:39 +0100 Subject: [PATCH 169/174] rename locale as mentioned in https://github.com/espruino/BangleApps/pull/1666 --- apps/locale/locales.js | 84 +++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index fe2325848..c65e0b1d9 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -83,7 +83,7 @@ timePattern / datePattern: %S second (00..60) %p locale's equivalent of either AM or PM; blank if not known %P like %p, but lower case -*/ +*/ var locales = { "en_GB": { // this is default @@ -157,7 +157,7 @@ var locales = { month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_US": { @@ -356,7 +356,7 @@ var locales = { month: "Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_IL": { @@ -478,7 +478,7 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", @@ -496,7 +496,7 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", @@ -575,7 +575,7 @@ var locales = { abday: "dg,dl,dm,dc,dj,dv,ds", day: "dimenge,diluns,dimars,dimècres,dijòus,divendres,dissabte", trans: { yes: "òc", Yes: "Òc", no: "non", No: "Non", ok: "ok", on: "on", off: "off" } - }, + }, "pt_BR": { lang: "pt_BR", decimal_point: ",", @@ -684,42 +684,42 @@ var locales = { day: "Pirmdiena,Otrdiena,Trešdiena,Ceturtdiena,Piektdiena,Sestdiena,Svētdiena", trans: { yes: "jā", Yes: "Jā", no: "nē", No: "Nē", ok: "labi", on: "Ieslēgt", off: "Izslēgt", "< Back": "< Atpakaļ" } }, - "nn_NO": { // Using charfallbacks - lang: "nn_NO", - decimal_point: ",", - thousands_sep: " ", - currency_symbol: "kr", - int_curr_symbol: "NOK", - speed: "kmh", - distance: { 0: "m", 1: "km" }, - temperature: "°C", - ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, - datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 - abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", - month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", - abday: "Su,Må,Ty,On,To,Fr,La", - day: "Sundag,Måndag,Tysdag,Onsdag,Torsdag,Fredag,Laurdag", - trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulesen" } - }, - "no_NB": { // Using charfallbacks - lang: "no_NB", - decimal_point: ",", - thousands_sep: " ", - currency_symbol: "kr", - int_curr_symbol: "NOK", - speed: "kmh", - distance: { 0: "m", 1: "km" }, - temperature: "°C", - ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, - datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 - abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", - month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", - abday: "Ma,Ti,On,To,Fr,Lø,Sø", - day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", - trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } - }, + "nn_NO": { // Using charfallbacks + lang: "nn_NO", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Su,Må,Ty,On,To,Fr,La", + day: "Sundag,Måndag,Tysdag,Onsdag,Torsdag,Fredag,Laurdag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulesen" } + }, + "nb_NO": { // Using charfallbacks + lang: "nb_NO", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "kr", + int_curr_symbol: "NOK", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des", + month: "Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember", + abday: "Ma,Ti,On,To,Fr,Lø,Sø", + day: "Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag", + trans: { yes: "ja", Yes: "Ja", no: "nei", No: "Nei", ok: "ok", on: "på", off: "av", "< Back": "< Tilbake", "Delete": "Slett", "Mark Unread": "Merk som ulest" } + }, /*, "he_IL": { // This won't work until we get a font - see https://github.com/espruino/BangleApps/issues/399 codePage : "ISO8859-8", From e9e92cc95bfe6a705ae5d17e33ccff86357ec8e5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Apr 2022 16:08:39 +0100 Subject: [PATCH 170/174] merge in https://github.com/espruino/EspruinoAppLoaderCore/pull/11 in such a way that we can use it from apps/locales as well (to avoid some duplication!) more characters added to list that need remapping --- apps/locale/locale.html | 3 ++- apps/locale/locales.js | 34 +++------------------------------- core | 2 +- 3 files changed, 6 insertions(+), 33 deletions(-) diff --git a/apps/locale/locale.html b/apps/locale/locale.html index bac938ffa..6eb0d94ea 100644 --- a/apps/locale/locale.html +++ b/apps/locale/locale.html @@ -16,6 +16,7 @@

Then click

+