Merge remote-tracking branch 'origin/develop' into as3httpclient-work
Conflicts:
installer/src/InstallApacheFlex.mxml
diff --git a/CodeCoverage/CodeCoveragePreloadSWF.as b/CodeCoverage/AIRServer/CodeCoveragePreloadSWF.as
similarity index 100%
rename from CodeCoverage/CodeCoveragePreloadSWF.as
rename to CodeCoverage/AIRServer/CodeCoveragePreloadSWF.as
diff --git a/CodeCoverage/CodeCoverageServer-app.xml b/CodeCoverage/AIRServer/CodeCoverageServer-app.xml
similarity index 100%
rename from CodeCoverage/CodeCoverageServer-app.xml
rename to CodeCoverage/AIRServer/CodeCoverageServer-app.xml
diff --git a/CodeCoverage/CodeCoverageServer.mxml b/CodeCoverage/AIRServer/CodeCoverageServer.mxml
similarity index 100%
rename from CodeCoverage/CodeCoverageServer.mxml
rename to CodeCoverage/AIRServer/CodeCoverageServer.mxml
diff --git a/CodeCoverage/JavaServer/README b/CodeCoverage/JavaServer/README
new file mode 100755
index 0000000..ec7e608
--- /dev/null
+++ b/CodeCoverage/JavaServer/README
@@ -0,0 +1,131 @@
+Apache Flex Code Coverage Tool - Java Server
+==============================================
+
+ This code coverage tool is designed to be used at the command line
+ to provide code coverage for nightly builds.
+
+ For detailed information about the Apache Flex Code Coverage Tool please visit
+ https://cwiki.apache.org/confluence/display/FLEX/Code+Coverage+Tool
+
+ For detailed information about Apache Flex please visit
+ http://flex.apache.org/
+
+Getting the latest sources via Git
+==================================
+
+ Getting the source code is the recommended way to get the Apache Flex Code Coverage Tool.
+
+ You can always checkout the latest source from Apache's source control repository
+ using the following commands:
+
+ git clone https://git-wip-us.apache.org/repos/asf/flex-utilities.git flex-utilities
+ cd flex-utilities
+ git checkout develop
+ cd CodeCoverage/JavaServer
+
+Building Apache Flex Code Coverage Tool
+=======================================
+
+ The Apache Flex Code Coverage Tool requires some build tools
+ which must be installed prior to building it.
+ Some of these have different licenses. See the Software Dependencies section
+ for more information on the external software dependencies.
+
+Install Prerequisites
+---------------------
+
+ Before building this tool you must install the following software
+ and set the corresponding environment variables using absolute file paths.
+ Relative file paths will result in build errors.
+
+ ==================================================================================
+ SOFTWARE ENVIRONMENT VARIABLE (absolute paths)
+ ==================================================================================
+
+ Java SDK 1.7 or greater (*1)(*2) JAVA_HOME
+
+ Ant 1.7.1 or greater (*1) ANT_HOME
+ (for Java 1.7 see note at (*2))
+
+ Apache Flex 'Falcon' Compiler (*2) FALCON_HOME
+
+ Apache Flex SDK or repository FLEX_HOME
+
+ ==================================================================================
+
+ *1) The bin directories for ANT_HOME and JAVA_HOME should be added to your
+ PATH.
+
+ On Windows, set PATH to
+
+ PATH=%PATH%;%ANT_HOME%\bin;%JAVA_HOME%\bin
+
+ On the Mac (bash), set PATH to
+
+ export PATH="$PATH:$ANT_HOME/bin:$JAVA_HOME/bin"
+
+ On Linux make sure you path include ANT_HOME and JAVA_HOME.
+
+ *2) If you are using Java SDK 1.7 or greater on a Mac you must use Ant 1.8
+ or greater. If you use Java 1.7 with Ant 1.7, ant reports the java
+ version as 1.6 so the JVM args for the data model (-d32/-d64) will not
+ be set correctly and you will get compile errors.
+
+ *3) Set FALCON_HOME to the root of its SDK. When using the flex-falcon
+ repository, set
+ FALCON_HOME=<repo-path>/compiler/generated/dist/sdk
+
+Software Dependencies
+---------------------
+
+ The Apache Flex Code Coverage Tool requires compiler.jar from the
+ Apache Flex Falcon Compiler. The external dependences for compiler.jar are
+ (relative to compiler.jar):
+
+ * external/antlr.jar
+ * external/commons-cli.jar
+ * external/commons-io.jar
+ * external/flex-tool-api.jar
+ * external/guava.jar
+ * external/jburg.jar
+ * external/lzma-sdk.jar
+
+ The external jar have various licenses.
+
+ When the Code Coverage Tool is built the Falcon jars are copied from
+ FALCON_HOME to the Code Coverage Tool's lib directory. This step makes the tool ready to run.
+
+
+Building the Source in the Source Distribution
+----------------------------------------------
+
+ When you have all the prerequisites in place and the environment variables set,
+ (see Install Prerequisites above), to build the Apache Flex Code Coverage
+ Tool use:
+
+ cd CodeCoverage/JavaServer
+ ant
+
+ To clean the build use:
+
+ ant clean
+
+Building the Source in the Eclispe and Flash Builder
+----------------------------------------------------
+
+ The Java source comes with an Eclipse project in the JavaServer/java
+ directory. Before importing the Eclipse project first define a Java
+ Classpath variable. Under Eclipse Preferences,
+
+ * Go to Java - Build Path - Classpath Varables.
+ * Click on "New...".
+ * Enter "FALCON_HOME" in "Name" field.
+ * Enter the directory containing "lib/compiler.jar" in the "Path" field.
+
+ The Flex code comes with a Flash Builder project in the JavaServer/flex
+ directory. This project can be imported without any additional setup.
+
+Thanks for using Apache Flex. Enjoy!
+
+ The Apache Flex Project
+ <http://flex.apache.org>
diff --git a/CodeCoverage/JavaServer/build.xml b/CodeCoverage/JavaServer/build.xml
new file mode 100755
index 0000000..88b2b29
--- /dev/null
+++ b/CodeCoverage/JavaServer/build.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" ?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project default="main" basedir=".">
+
+ <property file="${basedir}/env.properties"/>
+ <property environment="env"/>
+ <condition property="FLEX_HOME" value="${env.FLEX_HOME}">
+ <isset property="env.FLEX_HOME" />
+ </condition>
+
+ <target name="main">
+ <mkdir dir="${basedir}/lib"/>
+ <ant dir="${basedir}/flex"/>
+ <ant dir="${basedir}/java"/>
+ </target>
+
+ <target name="clean" description="clean up">
+ <ant dir="${basedir}/flex" target="clean"/>
+ <ant dir="${basedir}/java" target="clean"/>
+ <delete dir="${basedir}/lib"/>
+ </target>
+</project>
\ No newline at end of file
diff --git a/CodeCoverage/JavaServer/flex/build.xml b/CodeCoverage/JavaServer/flex/build.xml
new file mode 100755
index 0000000..44d33d5
--- /dev/null
+++ b/CodeCoverage/JavaServer/flex/build.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" ?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project default="main" basedir=".">
+
+ <property file="${basedir}/env.properties"/>
+ <property environment="env"/>
+ <condition property="FLEX_HOME" value="${env.FLEX_HOME}">
+ <isset property="env.FLEX_HOME" />
+ </condition>
+ <property name="lib.dir" value="${basedir}/../lib"/>
+
+ <!-- additional tasks - mxmlc tag -->
+ <path id="flexTasks.path">
+ <fileset dir="${FLEX_HOME}">
+ <include name="lib/flexTasks.jar" />
+ <include name="ant/lib/flexTasks.jar" />
+ </fileset>
+ </path>
+ <taskdef resource="flexTasks.tasks" classpathref="flexTasks.path"/>
+
+ <target name="check-flex-home" unless="FLEX_HOME.set"
+ description="Check that FLEX_HOME is a directory">
+
+ <echo message="FLEX_HOME is ${env.FLEX_HOME}"/>
+
+ <condition property="FLEX_HOME.set">
+ <and>
+ <length string="${env.FLEX_HOME}" when="greater" length="0" />
+ <available file="${env.FLEX_HOME}" type="dir"/>
+ </and>
+ </condition>
+
+ <fail message="The environment variable FLEX_HOME must be set to the Flex SDK directory"
+ unless="FLEX_HOME.set"/>
+ </target>
+
+ <target name="compile">
+ <mxmlc file="${basedir}/src/CodeCoveragePreloadSWF.as" static-link-runtime-shared-libraries="true"
+ output="${lib.dir}/CodeCoveragePreloadSWF.swf" fork="true" failonerror="true">
+ <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
+ <source-path path-element="${basedir}/src"/>
+ </mxmlc>
+ </target>
+
+ <target name="main" depends="check-flex-home,clean,compile">
+ </target>
+
+ <target name="clean" description="clean up">
+ <delete file="${lib.dir}/CodeCoveragePreloadSWF.swf"/>
+ </target>
+</project>
\ No newline at end of file
diff --git a/CodeCoverage/JavaServer/flex/src/CodeCoverageClientSocket.as b/CodeCoverage/JavaServer/flex/src/CodeCoverageClientSocket.as
new file mode 100755
index 0000000..7d9e016
--- /dev/null
+++ b/CodeCoverage/JavaServer/flex/src/CodeCoverageClientSocket.as
@@ -0,0 +1,145 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package
+{
+import flash.events.Event;
+import flash.events.IOErrorEvent;
+import flash.events.SecurityErrorEvent;
+import flash.net.Socket;
+import flash.system.Security;
+
+/**
+ * Wrapper around a Flash Player Socket.
+ */
+public class CodeCoverageClientSocket extends Socket
+{
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructor
+ *
+ * @param host The host to connect to.
+ * @param port The port to send trace data to.
+ * @param policyFilePort The port used to load the policy file.
+ */
+ public function CodeCoverageClientSocket(host:String, port:int, policyFilePort:int)
+ {
+ super();
+ addListeners();
+
+ var policyFile:String = "xmlsocket://" + host + ":" + policyFilePort;
+ Security.loadPolicyFile(policyFile);
+ connect(host, port);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Buffer output from trace data received before a connect is avaiable from
+ * the server.
+ */
+ private var preConnectBuffer:Array = [];
+ private var connectionAvailable:Boolean;
+
+ //--------------------------------------------------------------------------
+ //
+ // Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Send data to the sever.
+ *
+ * If the socket is not connected the data will be buffered until the
+ * connection is made.
+ *
+ * @param data The data to send.
+ */
+ public function sendData(data:String):void
+ {
+ if (connectionAvailable)
+ {
+ writeUTFBytes(data);
+ flush();
+ }
+ else
+ {
+ preConnectBuffer.push(data);
+ }
+ }
+
+ private function addListeners():void
+ {
+ addEventListener(Event.CLOSE, closeHandler);
+ addEventListener(Event.CONNECT, connectHandler);
+ addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
+ addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Event handler
+ //
+ //--------------------------------------------------------------------------
+
+ private function closeHandler(event:Event):void
+ {
+ connectionAvailable = false;
+ }
+
+ /**
+ * Call when the socket connection is established.
+ */
+ private function connectHandler(event:Event):void
+ {
+ removeEventListener(Event.CONNECT, connectHandler);
+
+ // Write out buffered data.
+ if (preConnectBuffer.length > 0)
+ {
+ var data:String = preConnectBuffer.join("");
+ writeUTFBytes(data);
+ flush();
+ }
+
+ connectionAvailable = true;
+ preConnectBuffer = [];
+ }
+
+ private function ioErrorHandler(event:IOErrorEvent):void
+ {
+ trace("CodeCoveragePreloadSWF ioErrorHandler: " + event.errorID);
+ }
+
+ private function securityErrorHandler(event:SecurityErrorEvent):void
+ {
+ trace("CodeCoveragePreloadSWF securityErrorHandler: " + event.errorID);
+ }
+
+}
+}
\ No newline at end of file
diff --git a/CodeCoverage/JavaServer/flex/src/CodeCoveragePreloadSWF.as b/CodeCoverage/JavaServer/flex/src/CodeCoveragePreloadSWF.as
new file mode 100755
index 0000000..858f1e5
--- /dev/null
+++ b/CodeCoverage/JavaServer/flex/src/CodeCoveragePreloadSWF.as
@@ -0,0 +1,190 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package
+{
+import flash.display.LoaderInfo;
+import flash.display.Sprite;
+import flash.events.Event;
+import flash.trace.Trace;
+import flash.utils.getTimer;
+
+/**
+ * Main of preload SWF. This SWF listens to the trace of the primary application
+ * and sends the data to a server using a web socket.
+ */
+public class CodeCoveragePreloadSWF extends Sprite
+{
+ //--------------------------------------------------------------------------
+ //
+ // Class constants
+ //
+ //--------------------------------------------------------------------------
+
+ private static const DEFAULT_HOST:String = "localhost";
+ private static const DEFAULT_DATA_PORT:int = 9097;
+ private static const DEFAULT_POLICY_FILE_PORT:int = 9843;
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructor
+ */
+ public function CodeCoveragePreloadSWF()
+ {
+ createClientSocket();
+ addEventListener("allComplete", allCompleteHandler);
+
+ Trace.setLevel(Trace.METHODS_AND_LINES, Trace.LISTENER);
+ Trace.setListener(methodsAndLinesCallback);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Variables
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Map the debug file info to an index number to reduce the amount
+ * of data sent over the port and stored.
+ *
+ * Key debug_file string
+ * Index: unique index representing the key.
+ */
+ private var stringMap:Object = {};
+
+ /**
+ * incremented to provide a unique index for every string.
+ */
+ private var stringIndex:int = 0;
+
+ /**
+ * Collection of lines that have been sent to server.
+ * For the purposes of code coverage there is no need to send a debug line
+ * more than once.
+ */
+ private var lineMap:Object = {};
+
+ /**
+ * socket to send trace data to the server.
+ */
+ private var socket:CodeCoverageClientSocket;
+
+ /**
+ * If true ignore the trace data. Used to prevent this code from being part of code
+ * coverage. Is this needed if the application is run w/o debug instructions.
+ */
+ private var ignoreTrace:Boolean;
+
+ //--------------------------------------------------------------------------
+ //
+ // Methods
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Create a socket to handle sending trace data to the server.
+ */
+ private function createClientSocket():void
+ {
+ var key:String;
+ var value:String;
+ var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
+ var host:String = DEFAULT_HOST;
+ var port:int = DEFAULT_DATA_PORT;
+ var policyFilePort:int = DEFAULT_POLICY_FILE_PORT;
+
+ for (key in paramObj)
+ {
+ value = String(paramObj[key]);
+ if (key == "host")
+ host = value;
+ else if (key == "dataPort")
+ port = int(value);
+ else if (key == "policyFilePort")
+ policyFilePort = int(value);
+ }
+
+ socket = new CodeCoverageClientSocket(host, port, policyFilePort);
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Event handlers
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Callback for methods and lines trace data.
+ */
+ public function methodsAndLinesCallback(filename:String, lineNumber:int, methodName:String, methodArgs:String):void
+ {
+ if (lineNumber <= 0 || ignoreTrace)
+ return;
+
+ try
+ {
+ // Map file name to and index
+ if (!stringMap.hasOwnProperty(filename))
+ {
+ socket.sendData("#" + stringIndex + "," + filename + "\n");
+ stringMap[filename] = stringIndex.toString();
+ stringIndex++;
+ }
+
+ var id:String = stringMap[filename];
+ var line:String = lineNumber.toString();
+ var data:String = id + "," + line + "\n";
+
+ // Only send a debug line once.
+ if (!lineMap.hasOwnProperty(data))
+ lineMap[data] = 1;
+ else
+ return;
+
+ socket.sendData(data);
+ }
+ catch (e:Error)
+ {
+ trace("CodeCoveragePreloadSWF Error: " + e.message);
+ }
+
+ }
+
+ /**
+ * Called when the main application finishing loading.
+ * This provides us with the name of the SWF.
+ */
+ private function allCompleteHandler(event:Event):void
+ {
+ ignoreTrace = true;
+ removeEventListener("allComplete", allCompleteHandler);
+
+ var loaderInfo:LoaderInfo = event.target as LoaderInfo;
+ socket.sendData("@" + loaderInfo.loaderURL + "\n");
+ ignoreTrace = false;
+ }
+
+}
+}
\ No newline at end of file
diff --git a/CodeCoverage/JavaServer/java/build.xml b/CodeCoverage/JavaServer/java/build.xml
new file mode 100755
index 0000000..a631529
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/build.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project default="main" basedir="." name="Code Coverage Server and Code Coverge Reporter">
+
+ <property file="${basedir}/env.properties"/>
+ <property environment="env"/>
+ <property name="lib.dir" value="${basedir}/../lib"/>
+
+ <!-- Options for <javac> tasks -->
+ <property name="javac.debug" value="true"/>
+ <property name="javac.deprecation" value="false"/>
+ <property name="javac.src" value="1.7"/>
+
+ <!-- JAR manifest entries -->
+ <property name="manifest.Implementation-Version" value="0.9.0"/>
+ <property name="manifest.Implementation-Vendor" value="Apache Software Foundation"/>
+
+ <target name="main" depends="check-falcon-home,clean,compile-ccserver,create-ccserver.jar,compile-ccreporter,create-ccreporter.jar,copy-bin-lib">
+ </target>
+
+ <target name="check-falcon-home" unless="FALCON_HOME"
+ description="Check FALCON_HOME is a directory.">
+
+ <echo message="FALCON_HOME is ${env.FALCON_HOME}"/>
+
+ <available file="${env.FALCON_HOME}/lib/compiler.jar"
+ type="file"
+ property="FALCON_HOME"
+ value="${env.FALCON_HOME}"/>
+
+ <fail message="FALCON_HOME must be set to a folder with a lib sub-folder containing compiler.jar such as the compiler/generated/dist/sdk folder in flex-falcon repo."
+ unless="FALCON_HOME"/>
+ </target>
+
+ <target name="clean">
+ <delete dir="${basedir}/generated"/>
+ <delete file="${lib.dir}/ccreporter.jar" quiet="true" failonerror="false"/>
+ <delete file="${lib.dir}/ccserver.jar" quiet="true" failonerror="false"/>
+ <delete quiet="true" failonerror="false">
+ <fileset dir="${lib.dir}">
+ <include name="compiler.jar"/>
+ <include name="ccreporter.jar"/>
+ <include name="ccserver.jar"/>
+ <include name="ccserver.properties"/>
+ </fileset>
+ </delete>
+ <delete dir="${lib.dir}/external" quiet="true" failonerror="false"/>
+ </target>
+
+ <path id="classpath">
+ <fileset dir="${env.FALCON_HOME}/lib" includes="**/*.jar" excludes="ccserver.jar,ccreporter.jar"/>
+ </path>
+
+ <target name="create-ccserver.jar" depends="set.ccserver.jar.uptodate" unless="ccserver.jar.uptodate">
+ <jar file="${lib.dir}/ccserver.jar" basedir="${basedir}/generated/classes" includes="**/server/*" whenmanifestonly="fail">
+ <manifest>
+ <attribute name="Implementation-Title" value="Apache Flex Code Coverage Server"/>
+ <attribute name="Implementation-Version" value="${manifest.Implementation-Version}"/>
+ <attribute name="Implementation-Vendor" value="${manifest.Implementation-Vendor}"/>
+ <attribute name="Main-Class" value="org.apache.flex.tools.codecoverage.server.CodeCoverageServer"/>
+ <attribute name="Class-Path" value="."/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="set.ccserver.jar.uptodate">
+ <uptodate property="ccserver.jar.uptodate"
+ targetfile="${lib.dir}/ccserver.jar">
+ <srcfiles dir="${basedir}/generated/classes">
+ <include name="**/server/*.class"/>
+ <include name="**/*.properties"/>
+ </srcfiles>
+ </uptodate>
+ </target>
+
+ <target name="compile-ccserver" description="compile">
+ <mkdir dir="${basedir}/generated/classes"/>
+ <javac debug="${javac.debug}" deprecation="${javac.deprecation}"
+ includes="**/server/*.java" destdir="${basedir}/generated/classes"
+ classpathref="classpath" includeAntRuntime="false"
+ source="${javac.src}" target="${javac.src}">
+ <src path="${basedir}/src"/>
+ <compilerarg value="-Xlint:all,-path,-fallthrough,-cast"/>
+ </javac>
+ <copy todir="${basedir}/generated/classes">
+ <fileset dir="${basedir}/src" includes="**/*.properties"/>
+ </copy>
+ </target>
+
+ <target name="create-ccreporter.jar" depends="set.ccreporter.jar.uptodate" unless="ccreporter.jar.uptodate">
+ <jar file="${lib.dir}/ccreporter.jar" basedir="${basedir}/generated/classes" includes="**/reporter/**/*" whenmanifestonly="fail">
+ <manifest>
+ <attribute name="Implementation-Title" value="Apache Flex Code Coverage Reporter"/>
+ <attribute name="Implementation-Version" value="${manifest.Implementation-Version}"/>
+ <attribute name="Implementation-Vendor" value="${manifest.Implementation-Vendor}"/>
+ <attribute name="Main-Class" value="org.apache.flex.tools.codecoverage.reporter.CodeCoverageReporter"/>
+ <attribute name="Class-Path" value="compiler.jar ."/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="set.ccreporter.jar.uptodate">
+ <uptodate property="ccreporter.jar.uptodate"
+ targetfile="${lib.dir}/ccreporter.jar">
+ <srcfiles dir="${basedir}/generated/classes">
+ <include name="**/*.class"/>
+ <include name="**/*.properties"/>
+ </srcfiles>
+ </uptodate>
+ </target>
+
+ <target name="compile-ccreporter" description="compile">
+ <javac debug="${javac.debug}" deprecation="${javac.deprecation}"
+ includes="**/reporter/**/*.java" destdir="${basedir}/generated/classes"
+ classpathref="classpath" includeAntRuntime="false"
+ source="${javac.src}" target="${javac.src}">
+ <src path="${basedir}/src"/>
+ <compilerarg value="-Xlint:all,-path,-fallthrough,-cast"/>
+ </javac>
+ <copy todir="${basedir}/generated/classes">
+ <fileset dir="${basedir}/src" includes="**/*.properties"/>
+ </copy>
+ </target>
+
+ <target name="copy-bin-lib" description="copy lib dependencies">
+ <copy todir="${lib.dir}">
+ <fileset dir="${FALCON_HOME}/lib/">
+ <include name="compiler.jar"/>
+ <include name="external/antlr*.*"/>
+ <include name="external/commons-cli*.*"/>
+ <include name="external/commons-io*.*"/>
+ <include name="external/flex-tool-api*.*"/>
+ <include name="external/guava*.*"/>
+ <include name="external/lzma-sdk*.*"/>
+ </fileset>
+ <fileset dir="${basedir}" includes="ccserver.properties"/>
+ </copy>
+ </target>
+
+</project>
diff --git a/CodeCoverage/JavaServer/java/ccserver.properties b/CodeCoverage/JavaServer/java/ccserver.properties
new file mode 100755
index 0000000..18f5e98
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/ccserver.properties
@@ -0,0 +1,8 @@
+#host=localhost
+#dataPort=9097
+#commandPort=9098
+#policyFilePort=9843
+#preloadSWF=CodeCoveragePreloadSWF.swf
+#mmCfgPath=
+#dataDirectory=
+
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CodeCoverageReporter.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CodeCoverageReporter.java
new file mode 100755
index 0000000..7c0d868
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CodeCoverageReporter.java
@@ -0,0 +1,549 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.flex.tools.codecoverage.reporter.reports.IReportFactory;
+import org.apache.flex.tools.codecoverage.reporter.reports.IReportWriter;
+import org.apache.flex.tools.codecoverage.reporter.reports.ReportOptions;
+import org.apache.flex.tools.codecoverage.reporter.reports.XMLReportFactory;
+import org.apache.flex.tools.codecoverage.reporter.swf.SWFLineReporter;
+
+/**
+ * Analyzes code coverage data files and produces a report.
+ *
+ * This class can be run from the command line and accept arguments to control
+ * the format of the report.
+ *
+ */
+public class CodeCoverageReporter
+{
+ /**
+ * Extension for code coverage reports.
+ */
+ private static final String DEFAULT_REPORT_NAME = "ccreport.xml";
+ private static final String DEFAULT_DATA_DIRECTORY = "ccdata";
+
+ private static final String CCREPORTER_VERSION = "0.9";
+
+ /**
+ * CodeCovergeReporter will read code code coverage result files and
+ * generate reports.
+ *
+ */
+ public static void main(String[] args) throws IOException
+ {
+ // This message should not be localized.
+ System.out.println("Apache Flex Code Coverage Reporter");
+ System.out.println("Version " + CCREPORTER_VERSION);
+ System.out.println("");
+
+ if (args.length == 1 && "-help".equals(args[0]))
+ {
+ displayUsage();
+ System.exit(1);
+ }
+
+ CodeCoverageReporter reporter = new CodeCoverageReporter();
+ reporter.processArgs(args);
+
+ System.out.println("Analyzing " + reporter.files.size() + " files");
+
+ try
+ {
+ final CoverageData coverageData = new CoverageData();
+
+ // analyzes the files and then report the results.
+ for (File file : reporter.files)
+ {
+ reporter.analyze(file, coverageData);
+ }
+
+ final CoverageSummary coverageSummary = reporter.createCoverageSummary(coverageData);
+ reporter.createReport(coverageSummary);
+
+ // output high level coverage to the console
+ reporter.outputCoverageSummaryToConsole(coverageSummary);
+
+ System.out.println("Report output to " + reporter.reportFile.getAbsolutePath());
+ }
+ catch (Error e)
+ {
+ e.printStackTrace();
+
+ System.err.println("");
+ System.err.println("An unrecoverable error occurred.");
+ }
+ }
+
+ /**
+ * Create a regex string from a given user input string that can have
+ * wild cards but is not a regex pattern.
+ * Supports simple wild cards: '*', '?'
+ *
+ * @param userFilter user supplied filter that may only contain the '*' and '?'
+ * wild card characters. All other cards will have no special meaning.
+ */
+ private static String createRegexStringFromUserArg(String userFilter)
+ {
+ // substitute regex for user wild cards.
+ StringBuilder regexString = new StringBuilder("^");
+ String[] results = userFilter.split("[\\?\\*]");
+ int currentIndex = 0;
+
+ for (String filter : results)
+ {
+ currentIndex += filter.length();
+
+ if (filter.length() > 0)
+ {
+ regexString.append("\\Q");
+ regexString.append(filter);
+ regexString.append("\\E");
+ }
+
+ if (currentIndex < userFilter.length())
+ {
+ if (userFilter.charAt(currentIndex) == '*')
+ {
+ regexString.append(".*");
+ }
+ else if (userFilter.charAt(currentIndex) == '?')
+ {
+ regexString.append(".?");
+ }
+ }
+
+ currentIndex++; // skip past wild card
+ }
+
+ regexString.append("$");
+ return regexString.toString();
+ }
+
+ public static Collection<File> listFiles(final File dir)
+ {
+ final String[] fileNames = dir.list();
+
+ if (fileNames == null)
+ {
+ return Collections.emptyList();
+ }
+
+ final Collection<File> fileList = new ArrayList<File>(fileNames.length);
+ for (int i = 0; i < fileNames.length; i++)
+ {
+ fileList.add(new File(dir.getPath(), fileNames[i]));
+ }
+
+ return fileList;
+ }
+
+ private void outputCoverageSummaryToConsole(final CoverageSummary coverageSummary)
+ {
+ System.out.println("Results:");
+
+ final SummaryInfo summaryInfo = coverageSummary.getOverallSummaryInfo();
+ int executed = summaryInfo.getExecutedLineCount();
+ int total = summaryInfo.getTotalLineCount();
+ int percent = total == 0 ? 0 : executed * 100 / total;
+ System.out.println("Line Coverage: " + percent + "%");
+
+ executed = summaryInfo.getExecutedMethodCount();
+ total = summaryInfo.getTotalMethodCount();
+ percent = total == 0 ? 0 : executed * 100 / total;
+ System.out.println("Method Coverage: " + percent + "%");
+ }
+
+ private static void displayUsage()
+ {
+ System.out.println("Usage: ccreporter");
+ System.out.println("[-exclude filter]");
+ System.out.println("[-help]");
+ System.out.println("[-hide-unexecuted]");
+ System.out.println("[-hide-files]");
+ System.out.println("[-hide-methods]");
+ System.out.println("[-hide-packages]");
+ System.out.println("[-include filter]");
+ System.out.println("[-output filename]");
+ System.out.println("[-report-factory");
+ System.out.println("[filename | directory name]*");
+ }
+
+ /**
+ * The report file.
+ */
+ private File reportFile;
+
+ /**
+ * Collection of data files to analyze.
+ */
+ private Collection<File> files;
+
+ /**
+ * User filters converted to regex.
+ */
+ private Collection<String> includeFilters;
+ private Collection<String> excludeFilters;
+
+ /**
+ * Raw user filters as input.
+ */
+ private Collection<String> userIncludeFilters;
+ private Collection<String> userExcludeFilters;
+ private boolean showPackages = true;
+ private boolean showFiles = true;
+ private boolean showMethods = true;
+ private boolean showUnexecutedDetails = false;
+
+ /**
+ * User can specify their own report factory.
+ */
+ private String reportFactory;
+
+ /**
+ * Create a code coverage reporter.
+ *
+ */
+ public CodeCoverageReporter()
+ {
+ }
+
+ /**
+ * Parse the command line arguments and set the instance variables of
+ * the reporter.
+ *
+ * @param args User specified arguments.
+ */
+ public void processArgs(final String[] args)
+ {
+ int index = 0;
+ File reportFile = null;
+ List<String> includeFilters = new ArrayList<String>();
+ List<String> excludeFilters = new ArrayList<String>();
+ List<String> userIncludeFilters = new ArrayList<String>();
+ List<String> userExcludeFilters = new ArrayList<String>();
+ boolean showPackages = true;
+ boolean showFiles = true;
+ boolean showMethods = true;
+ boolean showUnexecutedDetails = true;
+ String reportFactory = null;
+
+ while ((index < args.length) && (args[index].startsWith("-")))
+ {
+ switch (args[index])
+ {
+ case "-include":
+ {
+ userIncludeFilters.add(args[++index]);
+ includeFilters.add(createRegexStringFromUserArg(args[index]));
+ index++;
+ break;
+ }
+ case "-exclude":
+ {
+ userExcludeFilters.add(args[++index]);
+ excludeFilters.add(createRegexStringFromUserArg(args[index]));
+ index++;
+ break;
+ }
+ case "-include-regex":
+ {
+ includeFilters.add(args[++index]);
+ index++;
+ break;
+ }
+ case "-exclude-regex":
+ {
+ excludeFilters.add(args[++index]);
+ index++;
+ break;
+ }
+ case "-output":
+ {
+ reportFile = new File(args[++index]);
+ index++;
+ break;
+ }
+ case "-hide-unexecuted":
+ {
+ showUnexecutedDetails = false;
+ index++;
+ break;
+ }
+ case "-hide-methods":
+ {
+ showMethods = false;
+ index++;
+ break;
+ }
+ case "-hide-files":
+ {
+ showFiles = false;
+ index++;
+ break;
+ }
+ case "-hide-packages":
+ {
+ showPackages = false;
+ index++;
+ break;
+ }
+ case "-report-factory":
+ {
+ reportFactory = args[++index];
+ index++;
+ break;
+ }
+ default:
+ {
+ System.err.println("unknown argument " + args[index]);
+ index++;
+ System.exit(1);
+ }
+ }
+ }
+
+ if (reportFile == null)
+ reportFile = new File(DEFAULT_REPORT_NAME);
+
+ Collection<String>filenames = new ArrayList<String>();
+ Collection<File> files = new ArrayList<File>();
+
+ // Collect filenames/directories from user args.
+ // If no files specified look in the default data directory.
+ if (index >= args.length)
+ {
+ filenames.add(new File(System.getProperty("user.home"), DEFAULT_DATA_DIRECTORY).getAbsolutePath());
+ }
+ else
+ {
+ for (int i = index; i < args.length; i++)
+ {
+ filenames.add(args[i]);
+ }
+ }
+
+ // validate files
+ for (String filename : filenames)
+ {
+ File file = new File(filename);
+
+ if (!file.exists())
+ {
+ System.err.println("File not found: " + file.getAbsolutePath());
+ System.exit(1);
+ }
+ else
+ {
+ if (file.isDirectory())
+ {
+ Collection<File> newFiles = listFiles(file);
+ files.addAll(newFiles);
+ System.out.println("Found " + newFiles.size() + " files in " + file.getAbsolutePath());
+ }
+ else
+ {
+ files.add(file);
+ System.out.println("Found " + file.getAbsolutePath());
+ }
+ }
+
+ }
+
+ this.includeFilters = includeFilters;
+ this.excludeFilters = excludeFilters;
+ this.userIncludeFilters = userIncludeFilters;
+ this.userExcludeFilters = userExcludeFilters;
+ this.showUnexecutedDetails = showUnexecutedDetails;
+ this.showMethods = showMethods;
+ this.showFiles = showFiles;
+ this.showPackages = showPackages;
+ this.files = files;
+ this.reportFile = reportFile;
+ this.reportFactory = reportFactory;
+ }
+
+ /**
+ * Read in a code coverage raw file and output raw code coverage data.
+ *
+ * @param inFile
+ * Code coverage execution data.
+ * @throws IOException
+ * @throws FileNotFoundException
+ */
+ public void analyze(final File inFile, final CoverageData coverageData)
+ throws FileNotFoundException, IOException
+ {
+ try (BufferedReader reader = new BufferedReader(new FileReader(inFile)))
+ {
+ String inLine;
+ final ArrayList<String> stringPool = new ArrayList<String>();
+ int inLineNumber = 1;
+
+ while ((inLine = reader.readLine()) != null)
+ {
+ // test first char:
+ // @{path} the SWF's path
+ // #{id,string} defines an id string
+ char firstChar = inLine.charAt(0);
+
+ switch (firstChar)
+ {
+ case '@': // @swfURL
+ {
+ // read in SWF and analyze
+ String swfURL = inLine.substring(1);
+ SWFLineReporter swfLineReporter = new SWFLineReporter(swfURL);
+ swfLineReporter.readLines(coverageData);
+ break;
+ }
+ case '#': // instruction: packageFileID,packageFileString
+ {
+ // add id to pool
+ String[] results = inLine.substring(1).split(",");
+
+ assert results.length == 2 : "line " + inLineNumber
+ + System.lineSeparator()
+ + "improperly formatted line"
+ + System.lineSeparator() + inLine;
+
+ assert !stringPool.contains(results[1]) : "line "
+ + inLineNumber + System.lineSeparator()
+ + "string is already in the string pool: "
+ + results[1];
+
+ assert Integer.valueOf(results[0]) == stringPool.size() : "line "
+ + inLineNumber
+ + System.lineSeparator()
+ + "string is already in the string pool: "
+ + results[1];
+
+ stringPool.add(results[1]);
+ break;
+ }
+ default:
+ {
+ // "id,linenum"
+ // Split line and record linenum as a hit.
+ String[] results = inLine.split(",");
+ if (results.length == 2 && firstChar >= '0' && firstChar <= '9')
+ {
+ String file = stringPool.get(Integer.valueOf(results[0]));
+ int hitLineNumber = Integer.valueOf(results[1]);
+ coverageData.setLineExecuted(file, hitLineNumber);
+ break;
+ }
+ else
+ {
+ System.err.println("Warning: file " + inFile.getAbsolutePath() + ", line " + inLineNumber + ": unrecognized data, " + inLine);
+ }
+ }
+ }
+
+ inLineNumber++;
+ }
+ }
+ catch (NumberFormatException e)
+ {
+ System.err.println(inFile.getAbsolutePath() + " may not be a code coverage data file");
+ throw new IOException(e);
+ }
+ }
+
+ /**
+ * Create a code coverage report. The report summarizes the code coverage by
+ * package, file, and method. The report is output to the file specified
+ * by the user.
+ *
+ * @param coverageSummary A summary of the coverage data.
+ * @throws IOException
+ */
+ public void createReport(final CoverageSummary coverageSummary) throws IOException
+ {
+ createXMLReport(coverageSummary);
+ }
+
+ /**
+ * Create a summary of the raw code coverage data.
+ *
+ * @param coverageData
+ * @return
+ */
+ protected CoverageSummary createCoverageSummary(final CoverageData coverageData)
+ {
+ final CoverageSummary coverageSummary = new CoverageSummary(coverageData,
+ includeFilters, excludeFilters);
+
+ coverageSummary.processCoverageData();
+ return coverageSummary;
+ }
+
+ /**
+ * Output an XML report to the reportFile.
+ *
+ * @param coverageSummary A summary of the coverage data.
+ * @throws IOException
+ */
+ protected void createXMLReport(final CoverageSummary coverageSummary) throws IOException
+ {
+ Class<?> classFactory = null;
+ IReportFactory factory = null;
+
+ if (reportFactory != null)
+ {
+ try
+ {
+ classFactory = Class.forName(reportFactory);
+ factory = (IReportFactory) classFactory.newInstance();
+ }
+ catch (ClassNotFoundException | InstantiationException | IllegalAccessException e)
+ {
+ // fallback to default report writer
+ e.printStackTrace();
+ System.err.println("Report factory not found," + reportFactory);
+ }
+ }
+
+ if (factory == null)
+ factory = new XMLReportFactory();
+
+ final ReportOptions reportOptions = new ReportOptions(userIncludeFilters, userExcludeFilters,
+ showPackages, showFiles, showMethods, showUnexecutedDetails);
+ final IReportWriter reportWriter = factory.createReport(reportOptions);
+ try (final FileWriter fileWriter = new FileWriter(reportFile);
+ final BufferedWriter bufferedWriter = new BufferedWriter(fileWriter))
+ {
+ reportWriter.writeTo(bufferedWriter, coverageSummary);
+ }
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CoverageData.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CoverageData.java
new file mode 100755
index 0000000..4df2632
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CoverageData.java
@@ -0,0 +1,113 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * Class to record the execution data as well the all the debug lines that exist
+ * in SWF file.
+ * Each line number is associated with method.
+ */
+public class CoverageData
+{
+ /**
+ * key = package;file
+ * value = Map<line number, LineInfo>
+ */
+ final Map<String, Map<Integer, LineInfo>> lineMap =
+ new HashMap<String, Map<Integer, LineInfo>>();
+ Iterator<Map<String, Map<Integer, LineInfo>>> lineMapIterator;
+
+ /**
+ * Add the existence of a line to the coverage data.
+ *
+ * @param file The file the line number is in.
+ * @param lineNumber The line number of the line
+ * @param methodName The name of the method the line is in.
+ */
+ public void addLine(final String file, final int lineNumber,
+ final String methodName)
+ {
+ doAddLine(file, lineNumber, methodName);
+ }
+
+ /**
+ * Mark a line number as being executed.
+ * @param file The file.
+ * @param lineNumber The line number that was executed.
+ */
+ public void setLineExecuted(final String file, final int lineNumber)
+ {
+ LineInfo lineInfo = doAddLine(file, lineNumber, null);
+ lineInfo.setExecuted(true);
+ }
+
+ /**
+ * Get a list of entries in the coverage data.
+ *
+ * @return list of entries in the coverage data.
+ */
+ public Set<Entry<String, Map<Integer, LineInfo>>> entrySet()
+ {
+ return lineMap.entrySet();
+ }
+
+ /**
+ * Add a line to the coverage data.
+ * This line is recorded as unexecuted.
+ *
+ * @param file The file the line is found in.
+ * @param lineNumber The line number.
+ * @param methodName The method name.
+ * @return new LineInfo object
+ */
+ private LineInfo doAddLine(final String file, final int lineNumber,
+ final String methodName)
+ {
+ Map<Integer, LineInfo> lineInfoMap = lineMap.get(file);
+
+ if (lineInfoMap == null)
+ {
+ lineInfoMap = new TreeMap<Integer, LineInfo>();
+ lineMap.put(file, lineInfoMap);
+ }
+
+ LineInfo lineInfo = lineInfoMap.get(lineNumber);
+
+ if (lineInfo == null)
+ {
+ lineInfo = new LineInfo(methodName, lineNumber);
+ lineInfoMap.put(lineNumber, lineInfo);
+ }
+ else if (methodName != null && lineInfo.getMethodName() == null)
+ {
+ lineInfo.setMethodName(methodName);
+ }
+
+ return lineInfo;
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CoverageSummary.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CoverageSummary.java
new file mode 100755
index 0000000..ddf01a6
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/CoverageSummary.java
@@ -0,0 +1,423 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Summary of code coverage at the package, file, and method level.
+ *
+ */
+public class CoverageSummary
+{
+ /**
+ * Used to return the results of splitting the debugfile string.
+ */
+ private static class FilePathComponents
+ {
+ public String packageName;
+ public String filename;
+ }
+
+ private static final TreeSet<String> emptyTreeSet = new TreeSet<String>();
+
+ /**
+ * The coverage data being summarized.
+ */
+ private final CoverageData coverageData;
+
+ /**
+ * Compiled regex patterns to include only specific files.
+ */
+ private final Collection<Pattern> includeFilterPatterns = new ArrayList<Pattern>();
+
+ /**
+ * Compiled regex patterns to exclude only specific files.
+ */
+ private final Collection<Pattern> excludeFilterPatterns = new ArrayList<Pattern>();
+
+ /**
+ * Coverage summary rolled up to the package level.
+ *
+ * Key: package name
+ * Value: PackageSummaryInfo
+ */
+ private final Map<String, PackageSummaryInfo> packageSummaryMap =
+ new TreeMap<String, PackageSummaryInfo>();
+
+ /**
+ * Coverage summary rolled up to the file level.
+ *
+ * key: package;file
+ * value: SummaryInfo.
+ */
+ private final Map<String, SummaryInfo> fileSummaryMap =
+ new TreeMap<String, SummaryInfo>();
+
+ /**
+ * Coverage summary for methods.
+ *
+ * Key: method name
+ * Value: SummaryInfo
+ */
+ private final Map<String, SummaryInfo> methodSummaryMap =
+ new TreeMap<String, SummaryInfo>();
+
+ /**
+ * Summary information for all packages being reported.
+ */
+ private final SummaryInfo overall = new SummaryInfo();
+
+ /**
+ * Association of methods in a file.
+ *
+ * Key: package;filename
+ * Value: Ordered set of method names.
+ */
+ private final Map<String, TreeSet<String>> methodsInFile =
+ new HashMap<String, TreeSet<String>>();
+
+ /**
+ * Create a coverage summmary object. The coverage summary object
+ * can process the coverage data and provide coverage data by
+ * package, file, and method.
+ *
+ * @param coverageData the coverage data to generate the summary from.
+ * @param includeFilters Regex filter patterns. Controls which files
+ * are included in the coverage summary.
+ * @param excludeFilters Regex filter patterns. Controls which files
+ * are excluded in the coverage summary.
+ *
+ */
+ public CoverageSummary(final CoverageData coverageData,
+ final Collection<String> includeFilters,
+ final Collection<String> excludeFilters)
+ {
+ this.coverageData = coverageData;
+
+ initializePatterns(includeFilters, excludeFilters);
+ }
+
+ /**
+ * Get the coverage data the summary is generated from.
+ * @return the coverage data.
+ */
+ public CoverageData getCoverageData()
+ {
+ return coverageData;
+ }
+
+ /**
+ * Get the aggregate summary info of all the included packages.
+ *
+ * @return aggregate summary info.
+ */
+ public SummaryInfo getOverallSummaryInfo()
+ {
+ return overall;
+ }
+
+ /**
+ * Entry set of all included packages.
+ *
+ * @return Set of packages included in summary data.
+ */
+ public Set<Map.Entry<String, PackageSummaryInfo>> getPackageSummaryEntrySet()
+ {
+ return packageSummaryMap.entrySet();
+ }
+
+ /**
+ * Entry set of all files included in the summary data.
+ *
+ * @return Entry set
+ */
+ public Set<Map.Entry<String, SummaryInfo>> getFileSummaryEntrySet()
+ {
+ return fileSummaryMap.entrySet();
+ }
+
+ /**
+ * Get the coverage summmary info for a specific file.
+ *
+ * @param packageFileKey key formed by calling createPackageFileKey().
+ * @return SummaryInfo for the specified file or null the file is
+ * not included in the summary data.
+ */
+ public SummaryInfo getFileSummaryInfo(final String packageFileKey)
+ {
+ return fileSummaryMap.get(packageFileKey);
+ }
+
+ /**
+ * Get the summary info for a specific method.
+ *
+ * @param methodName The name of the method to get the summary info for.
+ * @return SummyInfo for the specified method or null if the method is
+ * not included in the summary data.
+ */
+ public SummaryInfo getMethodSummaryInfo(String methodName)
+ {
+ return methodSummaryMap.get(methodName);
+ }
+
+ /**
+ * A set of methods declared in the specified file.
+ *
+ * @param filename The name of the AS or MXML file.
+ * @return Set of method names.
+ */
+ public Set<String> getMethodsInFile(String filename)
+ {
+ TreeSet<String> results = methodsInFile.get(filename);
+ return results != null ? results : emptyTreeSet;
+ }
+
+ /**
+ * Roll up the coverage data at a method, file, and package level.
+ * If include filters and/or exclude filters are specified then
+ * they are applied that this time.
+ */
+ public void processCoverageData()
+ {
+ // for all packages;files
+ for (Map.Entry<String, Map<Integer, LineInfo>> fileEntry : coverageData.entrySet())
+ {
+ final String packageFile = fileEntry.getKey();
+ final FilePathComponents fileComponents = splitPackageFile(packageFile);
+ final SummaryInfo summaryInfo = new SummaryInfo();
+ summaryInfo.setName(fileComponents.filename);
+
+ // for all line numbers;
+ // 1. summary at the file level
+ // 2. record execution status for each method.
+ for (final Map.Entry<Integer, LineInfo> lineEntry : fileEntry.getValue().entrySet())
+ {
+ final LineInfo lineInfo = lineEntry.getValue();
+ final String methodName = lineInfo.getMethodName();
+
+ if (!shouldIncludeFile(fileComponents))
+ continue;
+
+ summaryInfo.setLineExecutionStatus(lineInfo.getLineNumber(),
+ methodName, lineInfo.isExecuted());
+
+ addMethodSummaryInfo(fileComponents.packageName,
+ fileComponents.filename, methodName, lineInfo);
+ }
+
+ addFileSummaryInfo(fileComponents.packageName,
+ fileComponents.filename, summaryInfo);
+ }
+ }
+
+ /**
+ * Determine if a file should be included in the summary.
+ * If no include filters or exclude filters are specified then
+ * all files are included.
+ *
+ * @param pathComponents The package and file name to test.
+ * @return true if the package should be included, false otherwise.
+ */
+ private boolean shouldIncludeFile(final FilePathComponents pathComponents)
+ {
+ String className = pathComponents.packageName + "." + pathComponents.filename;
+ final int index = className.lastIndexOf('.');
+
+ assert index != -1 : "no suffix found on filename";
+
+ className = className.substring(0, index);
+
+ // a class name is included if it is included by the pattern
+ // and not exclude by the exclude filters.
+ if (!(includeFilterPatterns.size() == 0) &&
+ !matches(includeFilterPatterns, className))
+ {
+ return false;
+ }
+
+ if (!(excludeFilterPatterns.size() == 0) &&
+ matches(excludeFilterPatterns, className))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Utility to test is a string matches one of a set of patterns.
+ *
+ * @param patterns Collection of patterns
+ * @param value The value to match
+ * @return true if the pattern matches, false otherwise.
+ */
+ private boolean matches(final Collection<Pattern> patterns, final String value)
+ {
+ for (Pattern pattern : patterns)
+ {
+ Matcher matcher = pattern.matcher(value);
+ if (matcher.matches())
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Create a combination package/file key.
+ *
+ * @param packageName The package name part of the key.
+ * @param filename THe filename part of the key.
+ * @return Key for the package/file.
+ */
+ public String createPackageFileKey(final String packageName, final String filename)
+ {
+ return packageName + ";" + filename;
+ }
+
+ /**
+ * Split a sourcePath;package/file string. These string come from the
+ * AS debug_file opcodes and are in the code coverage data files.
+ *
+ * @param packageFile The string to split into components.
+ * @return FilePathComponents
+ */
+ private FilePathComponents splitPackageFile(final String packageFile)
+ {
+ final String[] splitResults = packageFile.split(";");
+ String packageName = splitResults.length > 1 ?
+ splitResults[splitResults.length - 2] : "";
+ final String filename = splitResults[splitResults.length - 1];
+
+ // convert '\' and '/' path separators to '.' package separators.
+ if (packageName.length() > 0)
+ packageName = packageName.replaceAll("[\\\\/]", ".");
+
+ final FilePathComponents results = new FilePathComponents();
+ results.packageName = packageName;
+ results.filename = filename;
+
+ return results;
+ }
+
+ /**
+ * Aggregate summary information for a file.
+ *
+ * This method takes summary information for a file
+ * and aggregates them at the file, package, and overall coverage.
+ *
+ * @param packageName Package name the summary info is for.
+ * @param filename The file name the summary info is for.
+ * @param summaryInfo The summary info to aggregate.
+ */
+ private void addFileSummaryInfo(final String packageName, final String filename,
+ final SummaryInfo summaryInfo)
+ {
+ if (summaryInfo.getTotalLineCount() == 0)
+ return;
+
+ // summarize at the package level
+ fileSummaryMap.put(createPackageFileKey(packageName, filename), summaryInfo);
+ PackageSummaryInfo packageSummaryInfo = packageSummaryMap.get(packageName);
+ if (packageSummaryInfo == null)
+ {
+ packageSummaryInfo = new PackageSummaryInfo();
+ packageSummaryInfo.getSummaryInfo().setName(packageName);
+ packageSummaryMap.put(packageName, packageSummaryInfo);
+ }
+
+ packageSummaryInfo.addFile(packageName, filename);
+ packageSummaryInfo.add(summaryInfo);
+
+ // summary of all of the packages
+ overall.add(summaryInfo);
+ }
+
+ /**
+ * Add line coverage information about a method.
+ *
+ * This method aggregates the line coverage information for a method.
+ *
+ * @param packageName The name of the package the line info is from.
+ * @param filename The name of the file the line info is from.
+ * @param methodName The name of the method the line info is from.
+ * @param lineInfo The line info.
+ */
+ private void addMethodSummaryInfo(final String packageName, final String filename,
+ final String methodName, final LineInfo lineInfo)
+ {
+ // ignore cinit and script init methods.
+ if (methodName == null || methodName.isEmpty())
+ return;
+
+ // method summary info
+ SummaryInfo methodSummaryInfo = methodSummaryMap.get(methodName);
+ if (methodSummaryInfo == null)
+ {
+ methodSummaryInfo = new SummaryInfo();
+ methodSummaryInfo.setName(methodName);
+ methodSummaryMap.put(methodName, methodSummaryInfo);
+
+ final String key = createPackageFileKey(packageName, filename);
+ TreeSet<String> treeSet = methodsInFile.get(key);
+ if (treeSet == null)
+ {
+ treeSet = new TreeSet<String>();
+ treeSet.add(methodName);
+ methodsInFile.put(key, treeSet);
+ }
+
+ treeSet.add(methodName);
+ }
+
+ methodSummaryInfo.setLineExecutionStatus(lineInfo.getLineNumber(),
+ methodName, lineInfo.isExecuted());
+ }
+
+ /**
+ * Initialize the patterns for the include and exclude filters.
+ *
+ * @param includeFilters regex strings of classes to include.
+ * @param excludeFilters regex strings of classes to exclude.
+ */
+ private void initializePatterns(final Collection<String> includeFilters,
+ final Collection<String>excludeFilters)
+ {
+ for (final String includeFilter : includeFilters)
+ {
+ includeFilterPatterns.add(Pattern.compile(includeFilter));
+ }
+
+ for (final String excludeFilter : excludeFilters)
+ {
+ excludeFilterPatterns.add(Pattern.compile(excludeFilter));
+ }
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/LineInfo.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/LineInfo.java
new file mode 100755
index 0000000..1c22e93
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/LineInfo.java
@@ -0,0 +1,107 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter;
+
+/**
+ * Simple value class that contains information about a line number in a source
+ * file.
+ *
+ * Tracks:
+ * 1. the line number of this line
+ * 2. if the line was executed or not
+ * 3. the name of the method the line is in.
+ */
+public class LineInfo
+{
+ private int lineNumber;
+ private boolean executed;
+ private String methodName;
+
+ /**
+ * Create an instance of LineInfo.
+ *
+ * @param methodName The name of the method.
+ * @param lineNumber The source line number.
+ */
+ public LineInfo(final String methodName, final int lineNumber)
+ {
+ this.methodName = methodName;
+ this.lineNumber = lineNumber;
+ }
+
+ /**
+ * The source line number of this line.
+ * @return the line number
+ */
+ public int getLineNumber()
+ {
+ return lineNumber;
+ }
+
+ /**
+ * Set the source line number of this line.
+ *
+ * @param lineNumber
+ */
+ public void setLineNumber(final int lineNumber)
+ {
+ this.lineNumber = lineNumber;
+ }
+
+ /**
+ * Has the line been executed?
+ *
+ * @return true if the line has been executed, false otherwise.
+ */
+ public boolean isExecuted()
+ {
+ return executed;
+ }
+
+ /**
+ * Set the line number as being executed.
+ *
+ * @param executed true if the line has been hit, false otherwise.
+ */
+ public void setExecuted(final boolean executed)
+ {
+ this.executed = executed;
+ }
+
+ /**
+ * The method name containing this line.
+ *
+ * @return The method name or an empty string if no method name is set.
+ */
+ public String getMethodName()
+ {
+ return methodName != null ? methodName : "";
+ }
+
+ /**
+ * Set the method name this line is contained in.
+ *
+ * @param methodName
+ */
+ public void setMethodName(final String methodName)
+ {
+ this.methodName = methodName;
+ }
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/PackageSummaryInfo.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/PackageSummaryInfo.java
new file mode 100755
index 0000000..6e1fcdc
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/PackageSummaryInfo.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter;
+
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * Summary of a package's coverage information.
+ * Contains coverage summary of all of the files in the package.
+ */
+public class PackageSummaryInfo
+{
+ private Set<String> filesInPackage = new TreeSet<String>();
+ private SummaryInfo summaryInfo = new SummaryInfo();
+
+ /**
+ * Set of files in a package.
+ *
+ * @return The set files in the package. Each item in the
+ * set is a combined package name/filename in the following
+ * format: "packageName;filename".
+ */
+ public Set<String> getFilesInPackage()
+ {
+ return filesInPackage;
+ }
+
+ /**
+ * Add a file to this package summary info.
+ *
+ * @param packageName The package name to add the summary info to.
+ * @param filename The name of file to add to the package.
+ */
+ public void addFile(final String packageName, final String filename)
+ {
+ filesInPackage.add(packageName + ";" + filename);
+ }
+
+ /**
+ * The rolled up summary info for a package.
+ *
+ * @return SummaryInfo
+ */
+ public SummaryInfo getSummaryInfo()
+ {
+ return summaryInfo;
+ }
+
+ /**
+ * Aggregate summary info to this package.
+ *
+ * @param info The summary info.
+ */
+ public void add(final SummaryInfo info)
+ {
+ summaryInfo.add(info);
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/SummaryInfo.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/SummaryInfo.java
new file mode 100755
index 0000000..08e490a
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/SummaryInfo.java
@@ -0,0 +1,187 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * Simple value class to record summary information on the lines executed vs the
+ * total number of lines.
+ *
+ * This information can be used for reporting at the package, file, and method
+ * level.
+ *
+ * 1. total executed lines
+ * 2. total number of lines
+ * 3. total executed methods
+ * 4. total number of methods
+ *
+ */
+public class SummaryInfo
+{
+ // name of object the summary info is for.
+ private String name;
+
+ /**
+ * The set of executed lines in sorted order.
+ */
+ private final Set<Integer> executedLineSet = new TreeSet<Integer>();
+
+ /**
+ * The set of unexecuted lines in sorted order.
+ */
+ private final Set<Integer> unexecutedLineSet = new TreeSet<Integer>();
+
+ /**
+ * The set of executed lines in sorted order.
+ */
+ private final Set<String> executedMethodSet = new TreeSet<String>();
+ private final Set<String> unexecutedMethodSet = new TreeSet<String>();
+
+ /**
+ * Name of the object the summary information applies to.
+ * @return name of the object.
+ */
+ public String getName()
+ {
+ return name != null ? name : "";
+ }
+
+ /**
+ * Set the name of the object the summary information applies to.
+ * @param name Name of the object.
+ */
+ public void setName(final String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * @return Number of executed lines.
+ */
+ public int getExecutedLineCount()
+ {
+ return executedLineSet.size();
+ }
+
+ /**
+ *
+ * @return total number of lines.
+ */
+ public int getTotalLineCount()
+ {
+ return executedLineSet.size() + unexecutedLineSet.size();
+ }
+
+ /**
+ *
+ * @return Number of methods executed.
+ */
+ public int getExecutedMethodCount()
+ {
+ return executedMethodSet.size();
+ }
+
+ /**
+ *
+ * @return Total number of methods.
+ */
+ public int getTotalMethodCount()
+ {
+ return executedMethodSet.size() + unexecutedMethodSet.size();
+ }
+
+ /**
+ * The set of unexecuted lines.
+ *
+ * @return Set of executed lines, sorted in ascending order.
+ */
+ public Set<Integer> getUnexecutedLines()
+ {
+ return Collections.unmodifiableSet(unexecutedLineSet);
+ }
+
+ /**
+ * The set of unexecuted methods.
+ *
+ * @return Set of executed methods, sorted in ascending order.
+ */
+ public Set<String> getUnexecutedMethods()
+ {
+ return Collections.unmodifiableSet(unexecutedMethodSet);
+ }
+
+ /**
+ * Set the execution status of a given line and method.
+ *
+ * @param lineNumber The line number of the line.
+ * @param methodName The name of the method containing the line.
+ * @param executed true if the line is executed, false otherwise.
+ */
+ public void setLineExecutionStatus(final int lineNumber, String methodName,
+ final Boolean executed)
+ {
+ if (executedLineSet.contains(lineNumber))
+ return;
+
+ // fixup method name that were not executed.
+ if (methodName == null)
+ methodName = "";
+
+ if (executed)
+ {
+ unexecutedLineSet.remove(lineNumber);
+ executedLineSet.add(lineNumber);
+
+ // ignore empty method names.
+ // these are cinit and script init methods.
+ if (!methodName.isEmpty())
+ {
+ unexecutedMethodSet.remove(methodName);
+ executedMethodSet.add(methodName);
+ }
+ }
+ else
+ {
+ unexecutedLineSet.add(lineNumber);
+
+ // ignore empty method names.
+ // these are cinit and script init methods.
+ if (!methodName.isEmpty())
+ unexecutedMethodSet.add(methodName);
+ }
+ }
+
+ /**
+ * Add the passed summary info to the current set of summary info.
+ *
+ * @param summaryInfo
+ * summary information to add in, may not be null.
+ */
+ public void add(final SummaryInfo summaryInfo)
+ {
+ unexecutedLineSet.addAll(summaryInfo.unexecutedLineSet);
+ unexecutedMethodSet.addAll(summaryInfo.unexecutedMethodSet);
+ executedLineSet.addAll(summaryInfo.executedLineSet);
+ executedMethodSet.addAll(summaryInfo.executedMethodSet);
+ }
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/SummaryType.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/SummaryType.java
new file mode 100755
index 0000000..cd6be2f
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/SummaryType.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter;
+
+/**
+ * The type of summary info, either line or method.
+ */
+public enum SummaryType
+{
+ LINE,
+ METHOD
+}
\ No newline at end of file
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/IReportFactory.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/IReportFactory.java
new file mode 100755
index 0000000..7603726
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/IReportFactory.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter.reports;
+
+/**
+ * Interface for code coverage report factories.
+ *
+ * The default report factory can overridden by specifying the fully qualified
+ * class name of a report factory with the -report-factory command line option.
+ *
+ */
+public interface IReportFactory
+{
+ /**
+ * Create a report writer that will output the code coverage report.
+ *
+ * @param reportOptions Options to control the contents of the report.
+ */
+ IReportWriter createReport(ReportOptions reportOptions);
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/IReportWriter.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/IReportWriter.java
new file mode 100755
index 0000000..353cd0f
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/IReportWriter.java
@@ -0,0 +1,40 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter.reports;
+
+import java.io.BufferedWriter;
+
+import org.apache.flex.tools.codecoverage.reporter.CoverageSummary;
+
+/**
+ * Interface to a report writer.
+ *
+ * Allow for different reports to be created.
+ */
+public interface IReportWriter
+{
+ /**
+ * Write a report to the specified writer.
+ *
+ * @param writer The writer.
+ * @param coverageSummary A summary of the coverage data.
+ */
+ void writeTo(BufferedWriter writer, CoverageSummary coverageSummary);
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/ReportOptions.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/ReportOptions.java
new file mode 100644
index 0000000..ac129ff
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/ReportOptions.java
@@ -0,0 +1,204 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter.reports;
+
+import java.util.Collection;
+
+/**
+ * Code Coverage Report options.
+ *
+ */
+public class ReportOptions
+{
+ private Collection<String> includeFilters;
+ private Collection<String> excludeFilters;
+ private boolean showPackages = true;
+ private boolean showFiles = true;
+ private boolean showMethods = true;
+ private boolean showUnexecutedDetails = false;
+
+ /**
+ * Constructor.
+ *
+ * @param includeFilters User specified include filters.
+ * Equivalent to the -includes command line argument.
+ * @param excludeFilters User specified exclude filters.
+ * Equivalent to the -excludes command line argument.
+ * @param showPackages Determines if packages are listed in the report.
+ * Equivalent to the -showPackages command line argument.
+ * @param showFiles Determines if files are listed in the report. Files
+ * will not be show if packages are not shown.
+ * Equivalent to the -showFiles command line argument.
+ * @param showMethods Determines if method are listed in the report.
+ * Equivalent to the -showMethods command line argument.
+ * @param showUnexecutedDetails Determines if unexecuted lines and methods are
+ * listed in the report.
+ * Equivalent to the -showUnexecutedDetails command line argument.
+ */
+ public ReportOptions(Collection<String> includeFilters,
+ Collection<String> excludeFilters, boolean showPackages,
+ boolean showFiles, boolean showMethods,
+ boolean showUnexecutedDetails)
+ {
+ super();
+ this.includeFilters = includeFilters;
+ this.excludeFilters = excludeFilters;
+ this.showPackages = showPackages;
+ this.showFiles = showFiles;
+ this.showMethods = showMethods;
+ this.showUnexecutedDetails = showUnexecutedDetails;
+ }
+
+ /**
+ * User specified include filters.
+ * Equivalent to the -includes command line argument.
+ *
+ * @return Collection of user filters.
+ */
+ public Collection<String> getIncludeFilters()
+ {
+ return includeFilters;
+ }
+
+ /**
+ * Equivalent to the -includes command line argument.
+ *
+ * @param includeFilters Collection of filters to include classes in the
+ * report.
+ */
+ public void setIncludeFilters(Collection<String> includeFilters)
+ {
+ this.includeFilters = includeFilters;
+ }
+
+ /**
+ * User specified exclude filters.
+ * Equivalent to the -excludes command line argument.
+ *
+ * @return Collection of filters to exclude classes from the report.
+ */
+ public Collection<String> getExcludeFilters()
+ {
+ return excludeFilters;
+ }
+
+ /**
+ * Equivalent to the -excludes command line argument.
+ *
+ * @param excludeFilters Collection of filters to exclude classes from
+ * the report.
+ */
+ public void setExcludeFilters(Collection<String> excludeFilters)
+ {
+ this.excludeFilters = excludeFilters;
+ }
+
+ /**
+ * Determines if packages are listed in the report.
+ * Equivalent to the -showPackages command line argument.
+ *
+ * @return true if packages are listed in the report, false otherwise.
+ */
+ public boolean isShowPackages()
+ {
+ return showPackages;
+ }
+
+ /**
+ * Determines if packages are listed in the report.
+ * Equivalent to the -showPackages command line argument.
+ *
+ * @param showPackages Set to true to show packages in the report.
+ */
+ public void setShowPackages(boolean showPackages)
+ {
+ this.showPackages = showPackages;
+ }
+
+ /**
+ * Determines if files are listed in the report.
+ * Equivalent to the -showFiles command line argument.
+ *
+ * @return true if files are listed in the report, false otherwise.
+ */
+ public boolean isShowFiles()
+ {
+ return showFiles;
+ }
+
+ /**
+ * Determines if files are listed in the report.
+ * Equivalent to the -showFiles command line argument.
+ *
+ * @param showFiles Set to true to show files in the report.
+ */
+ public void setShowFiles(boolean showFiles)
+ {
+ this.showFiles = showFiles;
+ }
+
+ /**
+ * Determines if methods are listed in the report.
+ * Equivalent to the -showMethods command line argument.
+ *
+ * @return true if methods are listed in the report, false otherwise.
+ */
+ public boolean isShowMethods()
+ {
+ return showMethods;
+ }
+
+ /**
+ * Determines if methods are listed in the report.
+ * Equivalent to the -showMethods command line argument.
+ *
+ * @param showFiles Set to true to show methods in the report.
+ */
+ public void setShowMethods(boolean showMethods)
+ {
+ this.showMethods = showMethods;
+ }
+
+ /**
+ * Determines if unexecuted lines and unexecuted methods are listed in the
+ * report.
+ * Equivalent to the -showUnexecutedDetails command line argument.
+ *
+ * @return true if unexecuted lines and unexecuted are listed in the
+ * report, false otherwise.
+ */
+ public boolean isShowUnexecutedDetails()
+ {
+ return showUnexecutedDetails;
+ }
+
+ /**
+ * Determines if unexecuted lines and unexecuted methods are listed in the
+ * report.
+ * Equivalent to the -showUnexecutedDetails command line argument.
+ *
+ * @param showUnexecutedDetails Set to true to show methods in the report.
+ */
+ public void setShowUnexecutedDetails(boolean showUnexecutedDetails)
+ {
+ this.showUnexecutedDetails = showUnexecutedDetails;
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/XMLReportFactory.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/XMLReportFactory.java
new file mode 100755
index 0000000..d5e405f
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/XMLReportFactory.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter.reports;
+
+/**
+ * Factory for an XML report of code coverage.
+ * This is the default factory.
+ *
+ */
+public class XMLReportFactory implements IReportFactory
+{
+
+ @Override
+ public IReportWriter createReport(ReportOptions reportOptions)
+ {
+ return new XMLReportWriter(reportOptions);
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/XMLReportWriter.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/XMLReportWriter.java
new file mode 100755
index 0000000..aeeec72
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/reports/XMLReportWriter.java
@@ -0,0 +1,371 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter.reports;
+
+import java.io.BufferedWriter;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.flex.tools.codecoverage.reporter.CoverageSummary;
+import org.apache.flex.tools.codecoverage.reporter.PackageSummaryInfo;
+import org.apache.flex.tools.codecoverage.reporter.SummaryInfo;
+import org.apache.flex.tools.codecoverage.reporter.SummaryType;
+
+/**
+ * XML formatted code coverage report.
+ *
+ */
+public class XMLReportWriter implements IReportWriter
+{
+ private static final String REPORT_VERSION = "1.0";
+
+ private Collection<String> includeFilters;
+ private Collection<String> excludeFilters;
+ private boolean showPackages;
+ private boolean showFiles;
+ private boolean showMethods;
+ private boolean showUnexecutedDetails;
+
+ /**
+ * Constructor.
+ *
+ * @param reportOptions Options to control the contents of the report.
+ */
+ public XMLReportWriter(final ReportOptions reportOptions)
+ {
+ this.includeFilters = reportOptions.getIncludeFilters();
+ this.excludeFilters = reportOptions.getExcludeFilters();
+ this.showPackages = reportOptions.isShowPackages();
+ this.showFiles = reportOptions.isShowFiles();
+ this.showMethods = reportOptions.isShowMethods();
+ this.showUnexecutedDetails = reportOptions.isShowUnexecutedDetails();
+ }
+
+ @Override
+ public void writeTo(final BufferedWriter writer, final CoverageSummary coverageSummary)
+ {
+ final XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
+ assert xmlOutputFactory != null : "Expect XMLOutputFactory implementation.";
+
+ try
+ {
+ final XMLStreamWriter xmlWriter = xmlOutputFactory.
+ createXMLStreamWriter(writer);
+ xmlWriter.writeStartDocument("utf-8", "1.0");
+
+ // write top-level report
+ outputTopLevelStart(xmlWriter, coverageSummary.getOverallSummaryInfo());
+
+ if (showPackages)
+ {
+ // start package element
+ xmlWriter.writeStartElement("packages");
+
+ for (Map.Entry<String, PackageSummaryInfo> packageEntry :
+ coverageSummary.getPackageSummaryEntrySet())
+ {
+ PackageSummaryInfo packageSummary = packageEntry.getValue();
+ outputPackageCoverageStart(xmlWriter, packageSummary.getSummaryInfo());
+
+ if (showFiles)
+ {
+ outputFiles(xmlWriter, packageSummary, coverageSummary);
+ }
+
+ xmlWriter.writeEndElement(); // package
+ }
+
+ xmlWriter.writeEndElement(); // packages
+ }
+
+ xmlWriter.writeEndElement(); // code-coverage (top-level)
+ xmlWriter.writeEndDocument();
+ xmlWriter.close();
+ }
+ catch (XMLStreamException e)
+ {
+ e.printStackTrace();
+ }
+
+ }
+
+ /**
+ * Output the files xml and its children.
+ *
+ * @param xmlWriter
+ * @param packageSummary
+ * @param coverageSummary
+ * @throws XMLStreamException
+ */
+ private void outputFiles(final XMLStreamWriter xmlWriter,
+ final PackageSummaryInfo packageSummary,
+ final CoverageSummary coverageSummary) throws XMLStreamException
+ {
+ // start file element
+ xmlWriter.writeStartElement("files");
+
+ for (final String packageFileKey : packageSummary.getFilesInPackage())
+ {
+ final SummaryInfo fileSummary = coverageSummary.getFileSummaryInfo(packageFileKey);
+ outputFileCoverageStart(xmlWriter, fileSummary);
+
+ final Set<String> methodNames = coverageSummary.getMethodsInFile(packageFileKey);
+ if (showMethods && !methodNames.isEmpty())
+ {
+ // start method element
+ xmlWriter.writeStartElement("methods");
+
+ for (final String methodName : methodNames)
+ {
+ SummaryInfo methodSummary = coverageSummary.
+ getMethodSummaryInfo(methodName);
+ outputMethodNameCoverage(xmlWriter, methodSummary);
+ }
+
+ xmlWriter.writeEndElement(); // methods
+ }
+
+ xmlWriter.writeEndElement(); // file
+ }
+
+ xmlWriter.writeEndElement(); // files
+ }
+
+ /**
+ * Output the coverage information for a method.
+ *
+ * @param xmlWriter
+ * @param summaryInfo
+ * @throws XMLStreamException
+ */
+ private void outputMethodNameCoverage(final XMLStreamWriter xmlWriter,
+ final SummaryInfo summaryInfo) throws XMLStreamException
+ {
+ xmlWriter.writeStartElement("method");
+ xmlWriter.writeAttribute("name", summaryInfo.getName());
+
+ outputLineCoverage(xmlWriter, summaryInfo, false);
+ outputMethodCoverage(xmlWriter, summaryInfo, false);
+ xmlWriter.writeEndElement();
+ }
+
+ /**
+ * Output the start element for file coverage information.
+ *
+ * @param xmlWriter
+ * @param summaryInfo
+ * @throws XMLStreamException
+ */
+ private void outputFileCoverageStart(final XMLStreamWriter xmlWriter,
+ final SummaryInfo summaryInfo) throws XMLStreamException
+ {
+ xmlWriter.writeStartElement("file");
+ xmlWriter.writeAttribute("name", summaryInfo.getName());
+
+ outputLineCoverage(xmlWriter, summaryInfo, showUnexecutedDetails);
+ outputMethodCoverage(xmlWriter, summaryInfo, showUnexecutedDetails);
+ }
+
+ /**
+ * Output code coverage for a package.
+ * @param xmlWriter
+ * @param summaryInfo
+ * @throws XMLStreamException
+ */
+ private void outputPackageCoverageStart(final XMLStreamWriter xmlWriter,
+ final SummaryInfo summaryInfo) throws XMLStreamException
+ {
+ xmlWriter.writeStartElement("package");
+ xmlWriter.writeAttribute("name", summaryInfo.getName());
+
+ outputLineCoverage(xmlWriter, summaryInfo, false);
+ outputMethodCoverage(xmlWriter, summaryInfo, false);
+ }
+
+ /**
+ * Output top level summary information
+ *
+ * @param summaryInfo overall coverage info.
+ * @throws XMLStreamException
+ */
+ private void outputTopLevelStart(final XMLStreamWriter xmlWriter,
+ final SummaryInfo summaryInfo) throws XMLStreamException
+ {
+ xmlWriter.writeStartElement("code-coverage");
+ xmlWriter.writeAttribute("version", REPORT_VERSION);
+
+ outputLineCoverage(xmlWriter, summaryInfo, false);
+ outputMethodCoverage(xmlWriter, summaryInfo, false);
+ outputFilter(xmlWriter, "include-filter");
+ outputFilter(xmlWriter, "exclude-filter");
+ }
+
+ /**
+ * Output filters as part of the report.
+ *
+ * @param xmlWriter
+ * @param filterName The name of the filter to output.
+ * @throws XMLStreamException
+ */
+ private void outputFilter(final XMLStreamWriter xmlWriter,
+ final String filterName) throws XMLStreamException
+ {
+ Collection<String> filters = null;
+ String startElementName = null;
+
+ if ("include-filter".equals(filterName))
+ {
+ startElementName = "include-filters";
+ filters = includeFilters;
+ }
+ else if ("exclude-filter".equals(filterName))
+ {
+ startElementName = "exclude-filters";
+ filters = excludeFilters;
+ }
+ else
+ {
+ throw new IllegalArgumentException("unexpected filter name:" + filterName);
+ }
+
+ if (filters.isEmpty())
+ return;
+
+ xmlWriter.writeStartElement(startElementName);
+
+ for (final String filter : filters)
+ {
+ xmlWriter.writeStartElement(filterName);
+ xmlWriter.writeCharacters(filter);
+ xmlWriter.writeEndElement();
+ }
+
+ xmlWriter.writeEndElement();
+ }
+
+ /**
+ * Common method to output line coverage information.
+ *
+ * @param xmlWriter
+ * @param overall
+ * @throws XMLStreamException
+ */
+ private void outputLineCoverage(final XMLStreamWriter xmlWriter,
+ final SummaryInfo overall, boolean showDetails) throws XMLStreamException
+ {
+ outputSummaryInfo(xmlWriter, "line-coverage", overall, SummaryType.LINE, showDetails);
+ }
+
+ /**
+ * Common method to output method coverage information.
+ *
+ * @param xmlWriter
+ * @param overall
+ * @throws XMLStreamException
+ */
+ private void outputMethodCoverage(final XMLStreamWriter xmlWriter,
+ final SummaryInfo overall, final boolean showDetails)
+ throws XMLStreamException
+ {
+ outputSummaryInfo(xmlWriter, "method-coverage", overall,
+ SummaryType.METHOD, showDetails);
+ }
+
+ /**
+ * Common method to output summary information.
+ *
+ * @param xmlWriter The writer.
+ * @param elementName The name of the element.
+ * @param summaryInfo The summary info to output.
+ * @param summaryType Choose either LINE or METHOD.
+ * @param showDetails Show the lines/methods that were not executed.
+ * @throws XMLStreamException
+ */
+ private void outputSummaryInfo(final XMLStreamWriter xmlWriter,
+ final String elementName,
+ final SummaryInfo summaryInfo,
+ final SummaryType summaryType,
+ final boolean showDetails) throws XMLStreamException
+ {
+ xmlWriter.writeStartElement(elementName);
+
+ final int executed;
+ final int total;
+ final int percent;
+ Set<?> items = null;
+
+ if (summaryType == SummaryType.LINE)
+ {
+ executed = summaryInfo.getExecutedLineCount();
+ total = summaryInfo.getTotalLineCount();
+ percent = total == 0 ? 0 : executed * 100 / total;
+ if (showDetails)
+ items = summaryInfo.getUnexecutedLines();
+ }
+ else
+ {
+ executed = summaryInfo.getExecutedMethodCount();
+ total = summaryInfo.getTotalMethodCount();
+ percent = total == 0 ? 0 : executed * 100 / total;
+ if (showDetails)
+ items = summaryInfo.getUnexecutedMethods();
+ }
+
+ xmlWriter.writeAttribute("executed", Integer.toString(executed));
+ xmlWriter.writeAttribute("total", Integer.toString(total));
+ xmlWriter.writeAttribute("percent", Integer.toString(percent));
+
+ if (showDetails)
+ outputUnexecutedSet(xmlWriter, items);
+
+ xmlWriter.writeEndElement();
+ }
+
+ /**
+ * Output unexecuted lines or methods.
+ *
+ * @param xmlWriter
+ * @param items
+ * @throws XMLStreamException
+ */
+ private void outputUnexecutedSet(final XMLStreamWriter xmlWriter,
+ final Set<?> items) throws XMLStreamException
+ {
+ if (items == null || items.isEmpty())
+ return;
+
+ xmlWriter.writeStartElement("unexecuted-set");
+
+ for (Object item : items)
+ {
+ xmlWriter.writeStartElement("unexecuted");
+ xmlWriter.writeCharacters(item.toString());
+ xmlWriter.writeEndElement();
+ }
+
+ xmlWriter.writeEndElement();
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/swf/DebugLineVisitor.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/swf/DebugLineVisitor.java
new file mode 100755
index 0000000..648e19b
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/swf/DebugLineVisitor.java
@@ -0,0 +1,239 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter.swf;
+
+import org.apache.flex.abc.ABCConstants;
+import org.apache.flex.abc.Pool;
+import org.apache.flex.abc.instructionlist.InstructionList;
+import org.apache.flex.abc.semantics.ExceptionInfo;
+import org.apache.flex.abc.semantics.Instruction;
+import org.apache.flex.abc.semantics.Label;
+import org.apache.flex.abc.semantics.MethodBodyInfo;
+import org.apache.flex.abc.semantics.MethodInfo;
+import org.apache.flex.abc.semantics.Name;
+import org.apache.flex.abc.visitors.IMethodBodyVisitor;
+import org.apache.flex.abc.visitors.IMethodVisitor;
+import org.apache.flex.abc.visitors.ITraitsVisitor;
+import org.apache.flex.abc.visitors.NilABCVisitor;
+import org.apache.flex.abc.visitors.NilVisitors;
+import org.apache.flex.tools.codecoverage.reporter.CoverageData;
+
+/**
+ * Gather all the debug lines and method in a SWF file.
+ * Look for debug_file and debug_line op codes and record them so we know all
+ * of possible lines in the SWF that can be executed.
+ *
+ */
+public class DebugLineVisitor extends NilABCVisitor
+{
+
+ private final Pool<String> stringPool = new Pool<String>(Pool.DefaultType.HasDefaultZero);
+ private final CoverageData coverageData;
+
+ /**
+ * Constructor
+ *
+ * @param coverageData The coverage data where debug lines will be added
+ * as unexecuted lines. If a line is already in the coverage data and is
+ * marked as executed, then it will remain an executed line.
+ */
+ public DebugLineVisitor(final CoverageData coverageData)
+ {
+ this.coverageData = coverageData;
+ }
+
+ @Override
+ public IMethodVisitor visitMethod(MethodInfo minfo)
+ {
+ return new MethodVisitor();
+ }
+
+ @Override
+ public void visitPooledString(String s)
+ {
+ stringPool.add(s);
+ }
+
+ /**
+ * Visit all the methods in the ABC.
+ */
+ private class MethodVisitor implements IMethodVisitor
+ {
+ @Override
+ public void visitEnd()
+ {
+ }
+
+ @Override
+ public void visit()
+ {
+ }
+
+ @Override
+ public IMethodBodyVisitor visitBody(MethodBodyInfo mbInfo)
+ {
+ return new MethodBodyVisitor(mbInfo);
+ }
+ }
+
+ /**
+ * Visit all the method bodies in the ABC.
+ */
+ private class MethodBodyVisitor implements IMethodBodyVisitor
+ {
+ private final MethodBodyInfo mbInfo;
+ private String currentFilename;
+
+ public MethodBodyVisitor(MethodBodyInfo mbInfo)
+ {
+ this.mbInfo = mbInfo;
+ }
+
+ @Override
+ public void visitEnd()
+ {
+ }
+
+ @Override
+ public void labelCurrent(Label l)
+ {
+ }
+
+ @Override
+ public void labelNext(Label l)
+ {
+ }
+
+ @Override
+ public void visit()
+ {
+ }
+
+ @Override
+ public int visitException(Label from, Label to, Label target,
+ Name exception_type, Name catch_var)
+ {
+ return mbInfo.addExceptionInfo(new ExceptionInfo(from, to, target,
+ exception_type, catch_var));
+ }
+
+ @Override
+ public void visitInstructionList(InstructionList new_list)
+ {
+ for (Instruction inst : new_list.getInstructions())
+ {
+ int opcode = inst.getOpcode();
+ assert opcode != ABCConstants.OP_debugfile &&
+ opcode != ABCConstants.OP_debugline :
+ "unexpected debug opcode";
+ }
+ }
+
+ @Override
+ public void visitInstruction(int opcode)
+ {
+ assert opcode != ABCConstants.OP_debugfile &&
+ opcode != ABCConstants.OP_debugline :
+ "unexpected debug opcode";
+ }
+
+ @Override
+ public void visitInstruction(int opcode, int immediate_operand)
+ {
+ if (opcode == ABCConstants.OP_debugfile)
+ {
+ recordDebugFile(immediate_operand);
+ }
+ else if (opcode == ABCConstants.OP_debugline)
+ {
+ recordDebugLine(immediate_operand);
+ }
+ }
+
+ @Override
+ public void visitInstruction(int opcode, Object[] operands)
+ {
+ assert opcode != ABCConstants.OP_debugfile &&
+ opcode != ABCConstants.OP_debugline :
+ "unexpected debug opcode";
+ }
+
+ @Override
+ public void visitInstruction(int opcode, Object single_operand)
+ {
+ assert opcode != ABCConstants.OP_debugline :
+ "unexpected debug opcode";
+
+ if (opcode == ABCConstants.OP_debugfile)
+ recordDebugFile((String)single_operand);
+ }
+
+ @Override
+ public void visitInstruction(Instruction instruction)
+ {
+ int opcode = instruction.getOpcode();
+ assert opcode != ABCConstants.OP_debugfile &&
+ opcode != ABCConstants.OP_debugline :
+ "unexpected debug opcode";
+ }
+
+ @Override
+ public ITraitsVisitor visitTraits()
+ {
+ return NilVisitors.NIL_TRAITS_VISITOR;
+ }
+
+ /**
+ * Record a debugfile string
+ *
+ * @param filenameIndex Index of filename in the string pool.
+ */
+ private void recordDebugFile(final int filenameIndex)
+ {
+ recordDebugFile(stringPool.getValues().get(filenameIndex));
+ }
+
+ /**
+ * Set the filename in the context for debug lines that
+ * come after it.
+ *
+ * @param filename The debugfile filename.
+ */
+ private void recordDebugFile(final String filename)
+ {
+ currentFilename = filename;
+ }
+
+ /**
+ * Record a debug line into the coverage data.
+ *
+ * @param lineNumber The line number of the debug line in
+ * the file that is set by the last debugfile opcode.
+ */
+ private void recordDebugLine(final int lineNumber)
+ {
+ assert currentFilename != null :
+ "currentFilename must have been set by a debugFile instruction";
+
+ String methodName = mbInfo.getMethodInfo().getMethodName();
+ coverageData.addLine(currentFilename, lineNumber, methodName);
+ }
+ }
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/swf/SWFLineReporter.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/swf/SWFLineReporter.java
new file mode 100755
index 0000000..500917e
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/reporter/swf/SWFLineReporter.java
@@ -0,0 +1,143 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.reporter.swf;
+
+import java.io.BufferedInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collection;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.flex.abc.ABCParser;
+import org.apache.flex.compiler.clients.problems.CompilerProblemCategorizer;
+import org.apache.flex.compiler.clients.problems.ProblemFormatter;
+import org.apache.flex.compiler.clients.problems.ProblemPrinter;
+import org.apache.flex.compiler.clients.problems.ProblemQuery;
+import org.apache.flex.compiler.clients.problems.WorkspaceProblemFormatter;
+import org.apache.flex.compiler.internal.workspaces.Workspace;
+import org.apache.flex.compiler.problems.ICompilerProblem;
+import org.apache.flex.swf.TagType;
+import org.apache.flex.swf.io.SWFReader;
+import org.apache.flex.swf.tags.DoABCTag;
+import org.apache.flex.swf.tags.ITag;
+import org.apache.flex.tools.codecoverage.reporter.CoverageData;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Read in a SWF file and report the debugs line with the methods names.
+ *
+ * The data is returned in a Map where the key is the "path;package;file" string.
+ * The value is another Map where the key is the line number of the line. The
+ * value is a LineInfo object.
+ */
+public class SWFLineReporter
+{
+
+ private final String path;
+
+ /**
+ * Constructor.
+ *
+ * @param path The path of the SWF to read.
+ */
+ public SWFLineReporter(final String path)
+ {
+ this.path = path;
+ }
+
+ /**
+ * Read the debug lines from the SWF and populate the coverage data.
+ *
+ * @param coverageData The coverage data to add the debug lines to.
+ * @throws IOException
+ */
+ public void readLines(final CoverageData coverageData)
+ throws IOException
+ {
+ final SWFReader swfReader = new SWFReader(false);
+ final URL url = new URL(path);
+
+ try
+ {
+ swfReader.readFrom(
+ new BufferedInputStream(url.openStream()),
+ path);
+
+ ProblemQuery problemQuery = new ProblemQuery();
+ problemQuery.addAll(swfReader.getProblems());
+ if (!problemQuery.hasErrors())
+ {
+ final ImmutableList<ITag> tags = ImmutableList.copyOf(swfReader.iterator());
+ for (ITag tag : tags)
+ {
+ // visit the DoABC tag
+ if (tag.getTagType() == TagType.DoABC)
+ {
+ processDoABC((DoABCTag)tag, coverageData);
+ }
+ }
+ }
+
+ printProblems(swfReader.getProblems());
+ }
+ catch (FileNotFoundException e)
+ {
+ System.err.println("Error: Unable read debug lines from " + e.getLocalizedMessage());
+ throw e;
+ }
+ finally
+ {
+ IOUtils.closeQuietly(swfReader);
+ }
+ }
+
+ /**
+ * Parse a DoABC record and add the debug lines to the coverage data.
+ *
+ * @param tag The ABC tag.
+ * @param coverageData The coverage data to populate.
+ */
+ private void processDoABC(final DoABCTag tag, final CoverageData coverageData)
+ {
+ // create a visitor to record source line numbers.
+ final ABCParser parser = new ABCParser(tag.getABCData());
+ final DebugLineVisitor debugLineVisitor = new DebugLineVisitor(coverageData);
+ parser.parseABC(debugLineVisitor);
+ }
+
+ /**
+ * Print out problems to standard output.
+ *
+ * @param problems
+ */
+ private void printProblems(final Collection<ICompilerProblem> problems)
+ {
+ final CompilerProblemCategorizer categorizer = new CompilerProblemCategorizer();
+ final ProblemFormatter formatter = new WorkspaceProblemFormatter(new Workspace(),
+ categorizer);
+ final ProblemPrinter printer = new ProblemPrinter(formatter, System.err);
+
+ printer.printProblems(problems);
+ }
+
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/CodeCoverageServer.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/CodeCoverageServer.java
new file mode 100755
index 0000000..faea9c3
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/CodeCoverageServer.java
@@ -0,0 +1,556 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.server;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.net.ConnectException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * Main class of the Code Coverage Server.
+ *
+ * This class serves the command port.
+ * Creates threads to serve the data port and the policy file port.
+ *
+ */
+public class CodeCoverageServer
+{
+ private static enum ExitCode
+ {
+ SUCCESS(0),
+ HELP(1),
+ INVALID_OPTIONS(2),
+ ERRORS(3);
+
+ private final int exitCode;
+
+ private ExitCode(int exitCode)
+ {
+ this.exitCode = exitCode;
+ }
+
+ public int getExitCode()
+ {
+ return exitCode;
+ }
+ }
+
+ /**
+ * Commands
+ */
+ public static final String START_COMMAND = "start";
+ public static final String STOP_COMMAND = "stop";
+ public static final String STATUS_COMMAND = "status";
+ public static final String ALIVE_COMMAND = "alive";
+
+ /**
+ * Responses
+ */
+ public static final String SUCCESS_RESPONSE = "0";
+ public static final String ERROR_RESPONSE = "-1";
+
+ /**
+ * Default configuration values
+ */
+ private static final String DEFAULT_HOST = "localhost";
+ private static final int DEFAULT_DATA_PORT = 9097;
+ private static final int DEFAULT_COMMAND_PORT = 9098;
+ private static final int DEFAULT_POLICY_FILE_PORT = 9843;
+ private static final String DEFAULT_PRELOAD_SWF = "CodeCoveragePreloadSWF.swf";
+
+ /**
+ * config.properties keys
+ */
+ private static final String MM_CFG_PATH = "mmCfgPath";
+ private static final String PRELOAD_SWF_KEY = "preloadSWF";
+ private static final String DATA_DIRECTORY_KEY = "dataDirectory";
+ private static final String HOST_KEY = "host";
+ private static final String DATA_PORT_KEY = "dataPort";
+ private static final String COMMAND_PORT_KEY = "commandPort";
+ private static final String POLICY_FILE_PORT_KEY = "policyFilePort";
+
+ private static final boolean ADD_PRELOADSWF_KEY = true;
+ private static final boolean REMOVE_PRELOADSWF_KEY = false;
+
+ private static final String CCSERVER_VERSION = "0.9";
+
+ private static boolean start;
+ private static boolean stop;
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ CodeCoverageServer server = new CodeCoverageServer();
+ final int exitCode = server.mainNoExit(args);
+ System.exit(exitCode);
+ }
+
+ /**
+ * Entry point for the server instance.
+ *
+ * @param args Command line args
+ * @return One of EXIT_CODE enum.
+ */
+ private int mainNoExit(String[] args)
+ {
+ System.out.println("Apache Flex Code Coverage Server");
+ System.out.println("Version " + CCSERVER_VERSION);
+ System.out.println("");
+
+ if (args.length == 0 ||
+ args.length == 1 && "-help".equals(args[0]))
+ {
+ System.out.println("Usage: ccserver [start | stop]");
+ return ExitCode.HELP.getExitCode();
+ }
+
+ try
+ {
+ if (!initializeProperties())
+ return ExitCode.INVALID_OPTIONS.getExitCode();
+
+ processArgs(args);
+ if (start)
+ start();
+ else if (stop)
+ stop();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ return ExitCode.ERRORS.getExitCode();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ return ExitCode.ERRORS.getExitCode();
+ }
+
+ return ExitCode.SUCCESS.getExitCode();
+ }
+
+ private Properties config = new Properties();
+ private boolean listening = true;
+ private String host;
+ private int dataPort;
+ private int commandPort;
+ private int policyFilePort;
+ private String preloadSWFPath;
+
+ /**
+ * Constructor.
+ */
+ public CodeCoverageServer()
+ {
+ }
+
+ private void processArgs(final String[] args)
+ {
+ for (final String arg : args)
+ {
+ switch (arg)
+ {
+ case START_COMMAND:
+ {
+ start = true;
+ break;
+ }
+ case STOP_COMMAND:
+ {
+ stop = true;
+ break;
+ }
+ default:
+ {
+ System.err.println("unexpected argument " + arg);
+ }
+ }
+ }
+ }
+
+ /**
+ * Starts the server.
+ *
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ public void start() throws IOException, InterruptedException
+ {
+ if (isAlive())
+ {
+ System.out.println("Apache Flex Code Coverage Server is already running");
+ return;
+ }
+
+ final String dataProperty = config.getProperty(DATA_DIRECTORY_KEY);
+ final File dataDirectory;
+
+ if (dataProperty == null)
+ dataDirectory = new File(System.getProperty("user.home"), "ccdata");
+ else
+ dataDirectory = new File(dataProperty);
+
+ if (!dataDirectory.exists())
+ {
+ // mkdir() is creating the directory but returning false, so
+ // re-test with exists()
+ if (!dataDirectory.mkdir() && !dataDirectory.exists())
+ {
+ System.err.println("Error: Data directory does not exist and unable to create it: " + dataDirectory.getAbsolutePath());
+ return;
+ }
+ }
+
+ // modify mm.cfg file
+ updateMMCFG(ADD_PRELOADSWF_KEY);
+
+ // create thread to listen for connections on the data port
+ final DataSocketAccepter dataSocketAccepter =
+ new DataSocketAccepter(host, dataPort, dataDirectory);
+ final Thread dataThread = new Thread(dataSocketAccepter);
+ dataThread.start();
+
+ // create thread to listen the policy file port and server up the socket policy file.
+ final PolicyFileServer policyFileServer = new PolicyFileServer(host,
+ dataPort, policyFilePort);
+ final Thread policyFileServerThread = new Thread(policyFileServer);
+ policyFileServerThread.start();
+
+ System.out.println("listening on port " + dataPort);
+
+ // read commands on command socket
+ final ServerSocket commandSocket = new ServerSocket(commandPort);
+
+ try
+ {
+ while (listening)
+ {
+ try (Socket socket = commandSocket.accept();
+ InputStreamReader reader = new InputStreamReader(socket.getInputStream());
+ OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream()))
+ {
+ // wait for request
+ char[] cbuf = new char[256];
+ int charsRead = reader.read(cbuf);
+ if (charsRead > 0)
+ {
+ processCommand(reader, writer, String.valueOf(cbuf).trim());
+ }
+ }
+ }
+ }
+ finally
+ {
+ commandSocket.close();
+ policyFileServer.close();
+ policyFileServerThread.join();
+ dataSocketAccepter.close();
+ dataThread.join();
+ updateMMCFG(REMOVE_PRELOADSWF_KEY);
+ }
+
+ System.out.println("stopping Apache Flex Code Coverage Server");
+ }
+
+ /**
+ * Process a server command.
+ *
+ * @param reader The socket reader.
+ * @param writer The socket writer.
+ * @param command The command to process.
+ * @throws IOException
+ */
+ private void processCommand(final InputStreamReader reader,
+ final OutputStreamWriter writer, final String command) throws IOException
+ {
+ String response = SUCCESS_RESPONSE;
+
+ switch (command)
+ {
+ case STOP_COMMAND:
+ {
+ listening = false;
+ break;
+ }
+ case ALIVE_COMMAND:
+ {
+ break;
+ }
+ default:
+ {
+ response = ERROR_RESPONSE;
+ System.err.println("ccserver: unknown command " + command);
+ }
+ }
+
+ // acknowledge command
+ writer.append(response);
+ writer.flush();
+ }
+
+ /**
+ * Initialize properties from config file.
+ * Validate the properties.
+ *
+ * @return true if the properties are valid, false otherwise.
+ * @throws IOException
+ */
+ private boolean initializeProperties() throws IOException
+ {
+ readProperties();
+
+ host = config.getProperty(HOST_KEY, DEFAULT_HOST);
+ dataPort = getIntegerProperty(DATA_PORT_KEY, DEFAULT_DATA_PORT);
+ commandPort = getIntegerProperty(COMMAND_PORT_KEY, DEFAULT_COMMAND_PORT);
+ policyFilePort = getIntegerProperty(POLICY_FILE_PORT_KEY, DEFAULT_POLICY_FILE_PORT);
+
+ // get absolute path of preloadSWF.
+ if (!initializePreloadSWF())
+ return false;
+
+ return true;
+ }
+
+ /**
+ * Initialize the preloadSWF value.
+ *
+ * @return true if value, false otherwise.
+ * @throws UnsupportedEncodingException
+ */
+ private boolean initializePreloadSWF() throws UnsupportedEncodingException
+ {
+ // if the path of the preload SWF is not configured, then try to locate
+ // it in the same directory as the jar containing this class.
+ preloadSWFPath = config.getProperty(PRELOAD_SWF_KEY, DEFAULT_PRELOAD_SWF);
+ File preloadSWFFile = new File(preloadSWFPath);
+ if (!preloadSWFFile.exists())
+ {
+ URL preloadSWFURL = getClass().getClassLoader().getResource(preloadSWFPath);
+ if (preloadSWFURL != null)
+ {
+ preloadSWFPath = URLDecoder.decode(preloadSWFURL.getPath(), "UTF-8");
+ preloadSWFFile = new File(preloadSWFPath);
+ }
+
+ if (!preloadSWFFile.exists())
+ {
+ System.out.println("preloadSWF not found: " + preloadSWFPath);
+ return false;
+ }
+ }
+
+ preloadSWFPath = preloadSWFFile.getAbsolutePath();
+ return true;
+ }
+
+ /**
+ * Handle NumberFormatExeptions values in the configuration file.
+ *
+ * @param key
+ * @param defaultValue
+ * @return integer value of a configuration value.
+ */
+ private int getIntegerProperty(String key, int defaultValue)
+ {
+ String value = config.getProperty(key);
+ int result = defaultValue;
+
+ try
+ {
+ result = Integer.valueOf(value);
+ }
+ catch (NumberFormatException e)
+ {
+ // ignore, result is already set to defualt value
+ }
+
+ return result;
+ }
+
+ /**
+ * Send command to the command port to stop the server.
+ *
+ * @throws IOException
+ */
+ public void stop() throws IOException
+ {
+ if (!isAlive())
+ {
+ System.out.println("Apache Flex Code Coverage Server not running");
+ return;
+ }
+
+ // connect to the server and send a command
+ sendCommand(STOP_COMMAND);
+ }
+
+ /**
+ * Read properties from the config.properties file.
+ *
+ * @throws IOException
+ */
+ private void readProperties() throws IOException
+ {
+ try (InputStream inputStream = getClass().getClassLoader().
+ getResourceAsStream("ccserver.properties"))
+ {
+ if (inputStream != null)
+ config.load(inputStream);
+ }
+ }
+
+ /**
+ * Update the user's mm.cfg file to either add or remove the preloadSWF
+ * key.
+ *
+ * @param addPreloadSWF If true add "preloadSWF=" to the user's mm.cfg.
+ * @throws IOException
+ */
+ private void updateMMCFG(final boolean addPreloadSWF) throws IOException
+ {
+ // open mm.cfg
+ String filename = config.getProperty(MM_CFG_PATH,
+ System.getProperty("user.home") + "/mm.cfg");
+
+ // read mm.cfg
+ List<String> lines = new ArrayList<String>();
+ try (Reader fileReader = new FileReader(filename);
+ BufferedReader bufferedReader = new BufferedReader(fileReader))
+ {
+ String line = null;
+ while ((line = bufferedReader.readLine()) != null)
+ {
+ // if found a preloadSWF line then don't write it in order to
+ // remove it. If we are adding the line we will append it later.
+ if (!(line.startsWith(PRELOAD_SWF_KEY + "=")))
+ {
+ lines.add(line);
+ }
+ }
+
+ // if adding the preloadSWF key, append the preloadSWF property
+ if (addPreloadSWF)
+ {
+ StringBuilder preloadSWF = new StringBuilder(PRELOAD_SWF_KEY);
+ preloadSWF.append("=");
+ preloadSWF.append(preloadSWFPath);
+ preloadSWF.append("?host=");
+ preloadSWF.append(host);
+ preloadSWF.append("&dataPort=");
+ preloadSWF.append(dataPort);
+ preloadSWF.append("&policyFilePort=");
+ preloadSWF.append(policyFilePort);
+ lines.add(preloadSWF.toString());
+ }
+ }
+ catch (FileNotFoundException e)
+ {
+ System.err.println("Unable to open mm.cfg. Create the file in the user home directory or specify the location by setting the mmCfgPath property in ccserver.properties.");
+ e.printStackTrace();
+ return;
+ }
+
+ // write mm.cfg
+ try (FileWriter fileWriter = new FileWriter(filename);
+ BufferedWriter bufferedWriter = new BufferedWriter(fileWriter))
+ {
+ for (String line : lines)
+ {
+ bufferedWriter.write(line);
+ bufferedWriter.newLine();
+ }
+ }
+
+ }
+
+ /**
+ * Send a command and get the response.
+ *
+ * @param command
+ * @return A String containing the response. If there is no response an
+ * empty string will be returned.
+ * @throws IOException
+ */
+ private String sendCommand(String command) throws IOException
+ {
+ String result = "";
+ char[] cbuf = new char[512];
+
+ try (Socket socket = new Socket(host, commandPort);
+ InputStreamReader reader = new InputStreamReader(socket.getInputStream());
+ PrintWriter writer = new PrintWriter(socket.getOutputStream()))
+ {
+ // send command
+ writer.print(command);
+ writer.flush();
+
+ // read response
+ int charsRead = reader.read(cbuf);
+ if (charsRead != -1)
+ result = String.valueOf(cbuf, 0, charsRead);
+ }
+
+ return result;
+ }
+
+ /**
+ * Test if the server is already running.
+ *
+ * @return true if the server is running, false otherwise.
+ * @throws IOException
+ */
+ private boolean isAlive() throws IOException
+ {
+ try
+ {
+ String result = sendCommand(ALIVE_COMMAND);
+ if (result.length() > 0)
+ return true;
+
+ return false;
+ }
+ catch (ConnectException e)
+ {
+ // server not running so connection failed.
+ return false;
+ }
+ }
+
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/DataSocketAccepter.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/DataSocketAccepter.java
new file mode 100755
index 0000000..1de9992
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/DataSocketAccepter.java
@@ -0,0 +1,174 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.server;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+/**
+ * Thread to accept requests to connections to the data port.
+ * When a connection is made an instance of the DataSocketThread is created to
+ * read data from the socket.
+ *
+ */
+public class DataSocketAccepter implements Runnable
+{
+
+ private static final String filenameTemplate = "ccdata_{0}.txt";
+
+ private ServerSocket socket;
+ private BufferedWriter fileWriter;
+ private Thread dataSocketReader;
+ private volatile boolean listening = true;
+ private final File dataDirectory;
+ private int fileCount = 0;
+ private Socket currentSocket;
+ private final String host;
+ private final int dataPort;
+
+ /**
+ * Constructor.
+ *
+ * @param host The host of the dataPort.
+ * @param dataPort The data port to service.
+ * @param dataDirectory The directory where the data files are stored.
+ * Each new connection results in a new file created in this directory.
+ */
+ public DataSocketAccepter(final String host, final int dataPort,
+ final File dataDirectory)
+ {
+
+ if (dataDirectory == null)
+ throw new NullPointerException("dataDirectory may not be null");
+
+ this.host = host;
+ this.dataPort = dataPort;
+ this.dataDirectory = dataDirectory;
+ }
+
+ /**
+ * This thread will block waiting on a connect to the data port. Once a
+ * connection has been made an instance of DataSocketThread is run to read
+ * the data on the port and this thread waits for the next connection.
+ * Only one instance of the DataSocketThread is allowed. Before a new instance
+ * is created the current one is closed.
+ */
+ @Override
+ public void run()
+ {
+ try
+ {
+ socket = new ServerSocket(dataPort);
+
+ while (listening)
+ {
+ Socket newSocket = socket.accept();
+
+ closeResources();
+ currentSocket = newSocket;
+
+ if (!listening)
+ break;
+
+ String filename = filenameTemplate.replace("{0}", String.valueOf(fileCount++));
+ File file = new File(dataDirectory, filename);
+ System.out.println("saving trace data to " + file.getAbsolutePath());
+ fileWriter = new BufferedWriter(new FileWriter(file));
+ dataSocketReader = new Thread(new DataSocketReader(newSocket, fileWriter));
+ dataSocketReader.start();
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ } catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ if (currentSocket != null)
+ {
+ try
+ {
+ currentSocket.close();
+ }
+ catch (IOException e1)
+ {
+ e1.printStackTrace();
+ }
+ }
+
+ if (fileWriter != null)
+ {
+ try
+ {
+ fileWriter.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * Close this thread.
+ *
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ public void close() throws IOException
+ {
+ // connect to socket to unblock the accept call
+ listening = false;
+ Socket socket = new Socket(host, dataPort);
+ socket.close();
+ }
+
+ /**
+ * Close the resources used by data socket thread.
+ * @throws InterruptedException
+ * @throws IOException
+ */
+ private void closeResources() throws InterruptedException, IOException
+ {
+ if (dataSocketReader != null)
+ {
+ dataSocketReader.interrupt();
+ dataSocketReader.join();
+ dataSocketReader = null;
+ }
+
+ if (currentSocket != null)
+ currentSocket.close();
+
+ if (fileWriter != null)
+ {
+ fileWriter.close();
+ fileWriter = null;
+ }
+ }
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/DataSocketReader.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/DataSocketReader.java
new file mode 100755
index 0000000..6a15168
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/DataSocketReader.java
@@ -0,0 +1,88 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.server;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.Socket;
+
+/**
+ * Thread to read trace data from the Flex client.
+ * All data read from the socket is written directly to the writer
+ * with no processing.
+ *
+ */
+public class DataSocketReader implements Runnable
+{
+ private Socket socket;
+ private BufferedWriter fileWriter;
+
+ /**
+ * Constructor.
+ *
+ * @param socket The socket to read from.
+ * @param fileWriter The writer to write the data to.
+ */
+ public DataSocketReader(final Socket socket, final BufferedWriter fileWriter)
+ {
+ this.socket = socket;
+ this.fileWriter = fileWriter;
+ }
+
+ /**
+ * Read data from the socket and write it the specified file until
+ * we are interrupted.
+ */
+ @Override
+ public void run()
+ {
+ // listen for data
+ final char[] cbuf = new char[512 * 1024];
+
+ try (BufferedReader in = new BufferedReader(
+ new InputStreamReader(
+ socket.getInputStream()), 512 * 1024))
+ {
+ while (!Thread.interrupted() && !socket.isClosed())
+ {
+ int charsRead = in.read(cbuf);
+ if (charsRead > 0)
+ {
+ String buf = String.valueOf(cbuf, 0, charsRead);
+ fileWriter.write(buf);
+ }
+ else
+ {
+ Thread.sleep(1000);
+ }
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ catch (InterruptedException e)
+ {
+ // This happens when we are interrupted while sleeping.
+ }
+ }
+}
diff --git a/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/PolicyFileServer.java b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/PolicyFileServer.java
new file mode 100755
index 0000000..117249e
--- /dev/null
+++ b/CodeCoverage/JavaServer/java/src/org/apache/flex/tools/codecoverage/server/PolicyFileServer.java
@@ -0,0 +1,167 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.tools.codecoverage.server;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+/**
+ * Thread to serve a policy file to the Flash Player to allow the Flash
+ * client to connect to the data port.
+ *
+ */
+public class PolicyFileServer implements Runnable
+{
+ /**
+ * Request sent by the Flash Player requesting the policy file.
+ */
+ private static final String EXPECTED_REQUEST = "<policy-file-request/>";
+
+ /**
+ * Template of the policy file. Variables in brackets are replaced with
+ * the actual values.
+ */
+ private static final String POLICY_FILE = "<?xml version=\"1.0\"?>" +
+ "<!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">" +
+ "<cross-domain-policy>" +
+ " <allow-access-from domain=\"{host}\" to-ports=\"{dataPort}\" />" +
+ "</cross-domain-policy>";
+
+ private final String host;
+ private final int dataPort;
+ private final int policyFilePort;
+ private boolean listening = true;
+
+ // cached policy file create from the template.
+ private String policyFile;
+
+ /**
+ *
+ * @param host
+ * @param dataPort
+ * @param policyFilePort
+ */
+ public PolicyFileServer(final String host, final int dataPort,
+ final int policyFilePort)
+ {
+ this.host = host;
+ this.dataPort = dataPort;
+ this.policyFilePort = policyFilePort;
+
+ initializePolicyFile();
+ }
+
+ /**
+ * Wait for a connection on the policy file port. When a connection is received
+ * reply with a policy file if the Flash Player is requesting.
+ */
+ @Override
+ public void run()
+ {
+ ServerSocket serverSocket = null;
+
+ try
+ {
+ // accept connections and return an in-memory policy file.
+ serverSocket = new ServerSocket(policyFilePort);
+
+ while (listening)
+ {
+ try (Socket socket = serverSocket.accept())
+ {
+ if (!listening)
+ break;
+
+ writePolicyFile(socket);
+ }
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ if (serverSocket != null)
+ {
+ try
+ {
+ serverSocket.close();
+ }
+ catch (IOException e1)
+ {
+ e1.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * Create the policy file from the template.
+ */
+ private void initializePolicyFile()
+ {
+ policyFile = POLICY_FILE.replace("{host}", host);
+ policyFile = policyFile.replace("{dataPort}", Integer.toString(dataPort));
+ }
+
+ /**
+ * Write the in-memory policy file to the socket.
+ *
+ * @param socket Socket to write security policy file to.
+ */
+ private void writePolicyFile(final Socket socket)
+ {
+ char[] cbuf = new char[64];
+
+ try (InputStreamReader reader = new InputStreamReader(socket.getInputStream());
+ OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream()))
+ {
+ int result = reader.read(cbuf);
+ if (result > 0 && EXPECTED_REQUEST.equals(cbuf))
+ {
+ writer.write(policyFile);
+ }
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Close the resources held by this thread.
+ *
+ * @throws IOException
+ * @throws UnknownHostException
+ * @throws InterruptedException
+ */
+ public void close() throws UnknownHostException, IOException, InterruptedException
+ {
+ // connect to socket to unblock the accept call
+ listening = false;
+ final Socket socket = new Socket(host, policyFilePort);
+ socket.close();
+ }
+
+}
diff --git a/MD5Checker/build.xml b/MD5Checker/build.xml
index 6f438ad..5979e99 100644
--- a/MD5Checker/build.xml
+++ b/MD5Checker/build.xml
@@ -135,6 +135,7 @@
</target>
<target name="commit" depends="credentials">
+ <delete file="${basedir}/getresult.txt" failonerror="false"/>
<exec executable="${svn}" dir="${site}" failonerror="true" >
<arg value="commit" />
<arg value="--username" />
@@ -145,9 +146,8 @@
<arg value=""update md5s"" />
</exec>
<!-- pause to give buildbot chance to react -->
- <sleep seconds="5" />
+ <sleep seconds="60" />
<get src="https://cms.apache.org/flex/publish" username="${apache.username}" password="${apache.password}" dest="${basedir}/getresult.txt" />
- <delete file="${basedir}/getresult.txt" />
</target>
<target name="credentials" depends="get-username,get-password">
diff --git a/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ResourceTable.as b/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ResourceTable.as
index 80debc7..b16542a 100644
--- a/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ResourceTable.as
+++ b/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ResourceTable.as
@@ -41,7 +41,7 @@
*/
public function ResourceTable()
{
- _resources = new Object();
+ _resources = {};
}
/**
diff --git a/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ui/SparkHighlighter.as b/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ui/SparkHighlighter.as
index db402fa..ef01970 100644
--- a/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ui/SparkHighlighter.as
+++ b/Squiggly/main/SpellingFramework/src/com/adobe/linguistics/spelling/framework/ui/SparkHighlighter.as
@@ -127,7 +127,7 @@
mTextField.addChild(mHighlighter);
}
- drawSquigglyLineForRange(token.first, token.last);
+ drawSquigglyLineForRange(token.first, token.last);
// Just adjust the left padding, top padding is not an issue
//var pleft:uint = mTextField.getStyle("paddingLeft");
@@ -144,14 +144,15 @@
var tflIndexFirst:int = tf.flowComposer.findLineIndexAtPosition(start);
var tflIndexLast:int = tf.flowComposer.findLineIndexAtPosition(end);
- // Pointer
var tflIndex:int = tflIndexFirst;
- var tfl:TextFlowLine = tflFirst;
-
- if (tflIndexFirst == tflIndexLast) {
+
+ if (tflIndexFirst == tflIndexLast)
+ {
// Draw one line
drawSquigglyLineAtIndex(tflIndexFirst, start - tflFirst.absoluteStart, end - tflFirst.absoluteStart);
- } else {
+ }
+ else
+ {
// Multiple lines (very long word)
drawSquigglyLineAtIndex(tflIndexFirst, start - tflFirst.absoluteStart);
diff --git a/Squiggly/main/SpellingUIEx/src/com/adobe/linguistics/spelling/SpellUI.as b/Squiggly/main/SpellingUIEx/src/com/adobe/linguistics/spelling/SpellUI.as
index 2d3d9ca..0033320 100644
--- a/Squiggly/main/SpellingUIEx/src/com/adobe/linguistics/spelling/SpellUI.as
+++ b/Squiggly/main/SpellingUIEx/src/com/adobe/linguistics/spelling/SpellUI.as
@@ -19,42 +19,43 @@
package com.adobe.linguistics.spelling
{
- import com.adobe.linguistics.spelling.framework.SpellingConfiguration;
- import com.adobe.linguistics.spelling.framework.SpellingService;
- import com.adobe.linguistics.spelling.framework.ui.HaloHighlighter;
- import com.adobe.linguistics.spelling.framework.ui.HaloWordProcessor;
- import com.adobe.linguistics.spelling.framework.ui.IHighlighter;
- import com.adobe.linguistics.spelling.framework.ui.IWordProcessor;
- import com.adobe.linguistics.spelling.framework.ui.SparkHighlighter;
- import com.adobe.linguistics.spelling.framework.ui.SparkWordProcessor;
- import com.adobe.linguistics.utils.TextTokenizer;
- import com.adobe.linguistics.utils.Token;
+ import com.adobe.linguistics.spelling.framework.SpellingConfiguration;
+ import com.adobe.linguistics.spelling.framework.SpellingService;
+ import com.adobe.linguistics.spelling.framework.ui.HaloHighlighter;
+ import com.adobe.linguistics.spelling.framework.ui.HaloWordProcessor;
+ import com.adobe.linguistics.spelling.framework.ui.IHighlighter;
+ import com.adobe.linguistics.spelling.framework.ui.IWordProcessor;
+ import com.adobe.linguistics.spelling.framework.ui.SparkHighlighter;
+ import com.adobe.linguistics.spelling.framework.ui.SparkWordProcessor;
+ import com.adobe.linguistics.utils.TextTokenizer;
+ import com.adobe.linguistics.utils.Token;
- import flash.events.Event;
- import flash.events.FocusEvent;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- import flash.net.SharedObject;
- import flash.net.URLLoader;
- import flash.net.URLRequest;
- import flash.text.TextField;
- import flash.utils.Dictionary;
+ import flash.events.Event;
+ import flash.events.FocusEvent;
+ import flash.geom.Point;
+ import flash.geom.Rectangle;
+ import flash.net.SharedObject;
+ import flash.net.URLLoader;
+ import flash.net.URLRequest;
+ import flash.text.TextField;
+ import flash.utils.Dictionary;
- import flashx.textLayout.edit.SelectionManager;
- import flashx.textLayout.tlf_internal;
+ import flashx.textLayout.edit.SelectionManager;
+ import flashx.textLayout.elements.TextFlow;
+ import flashx.textLayout.tlf_internal;
- import mx.controls.RichTextEditor;
- import mx.controls.TextArea;
- import mx.controls.TextInput;
- import mx.core.UIComponent;
- import mx.core.mx_internal;
- import mx.events.ScrollEvent;
+ import mx.controls.RichTextEditor;
+ import mx.controls.TextArea;
+ import mx.controls.TextInput;
+ import mx.core.UIComponent;
+ import mx.core.mx_internal;
+ import mx.events.ScrollEvent;
- import spark.components.RichEditableText;
- import spark.components.TextArea;
- import spark.components.TextInput;
+ import spark.components.RichEditableText;
+ import spark.components.TextArea;
+ import spark.components.TextInput;
- use namespace mx_internal;
+ use namespace mx_internal;
use namespace tlf_internal;
/**
@@ -87,15 +88,12 @@
//private var mTextField:RichEditableText;
- private var _dictname:String = new String();
- private var _hundict:HunspellDictionary = new HunspellDictionary();
- private var _userdict:UserDictionary = null;
- private var _sharedobj:SharedObject = null;
- private var scm:SpellingContextMenu;
-
- private var _newchecker:SpellChecker = null;
+ private var _dictionaryName:String = "";
+ private var _userDictionary:UserDictionary = null;
+ private var _sharedObject:SharedObject = null;
+ private var _scm:SpellingContextMenu;
private var _resource_locale:Object = null;
- private var _spellingservice:SpellingService = null;
+ private var _spellingService:SpellingService = null;
private static var _contextMenuEntries:Object = {enable:"Enable Spelling", disable:"Disable Spelling", add:"Add to dictionary"};
private static var _spellingConfigUrl:String = "SpellingConfig.xml";
@@ -129,16 +127,11 @@
if ( lang == null ) return;
// TODO: Change dict parameter type to a SpellCheck class or a URL string.
var txt:* = getComponentTextModel(comp);
- /*var comp1:UIComponent = txt.parent;
- var comp2:UIComponent = txt.owner;
- var comp3:UIComponent = txt.parentApplication;
- var comp4:UIComponent = txt.parentDocument;
- var comp5:UIComponent = txt.parentDocument.hostComponent; <--spark parent UICOmponent*/
if ( txt==null || _UITable[comp]!=undefined )
return;
// TODO: dangerous, is garbage collection going to clear this?
- _UITable[comp]=new SpellUI(txt, lang);
+ _UITable[comp] = new SpellUI(txt, lang);
_parentTable[txt] = comp;
_cacheDictTable[comp]=lang;
}
@@ -306,16 +299,15 @@
return;
}
_actualParent = textModel;
- mTextField = textModel ;
+ mTextField = textModel;
mTextField.addEventListener(FocusEvent.FOCUS_OUT, handleFocusOut);
mTextField.addEventListener(FocusEvent.FOCUS_IN, handleFocusIn);
mTextField.addEventListener(ScrollEvent.SCROLL, spellCheckScreen);
mTextField.parent.addEventListener(Event.RENDER, spellCheckScreen);
mTextField.parent.addEventListener(Event.CHANGE, handleChangeEvent);
- _dictname = lang;
+ _dictionaryName = lang;
loadConfig();
-
}
private function spellCheckScreen(event:Event):void
@@ -340,21 +332,28 @@
spellCheckScreen(event);
}
- /*private function doSpelling():void
- {
- _checkLastWord = true;
- doSpellingJob();
- }*/
-
- /**
- @private
- (This property is for Squiggly Developer use only.)
- */
public function doSpellingJob():void
{
- if (_spellingEnabled == false) return;
+ if (_spellingEnabled == false)
+ return;
+
+ if(!isTextFieldReadyForSpellingJob())
+ return;
+
spellCheckRange(getValidFirstWordIndex(), getValidLastWordIndex());
}
+
+ private function isTextFieldReadyForSpellingJob():Boolean
+ {
+ if(!mTextField)
+ return false;
+
+ var textFlow:TextFlow = mTextField is RichEditableText ? RichEditableText(mTextField).textFlow : null;
+ if(!textFlow || !textFlow.flowComposer)
+ return true;
+
+ return !textFlow.flowComposer.isDamaged(textFlow.textLength);
+ }
private function spellCheckRange(start:uint, end:uint):void {
//hh.preSpellCheckRange(start, end);
@@ -388,10 +387,9 @@
}
var tokenizer:TextTokenizer = new TextTokenizer(mTextField.text.substring(start,end));
- var tokens:Vector.<Token> = new Vector.<Token>();
-
+
for ( var token:Token = tokenizer.getFirstToken(); token != tokenizer.getLastToken(); token= tokenizer.getNextToken(token) ) {
- var result:Boolean=_spellingservice.checkWord(mTextField.text.substring(token.first+start, token.last+start));
+ var result:Boolean=_spellingService.checkWord(mTextField.text.substring(token.first+start, token.last+start));
if (!result){
if (_checkLastWord || (token.last+start != mTextField.text.length))
//hh.highlightWord(token.first+start, token.last+start-1);
@@ -442,36 +440,41 @@
return index;
}
- private function loadConfig():void{
- _resource_locale = SpellingConfiguration.resourceTable.getResource(_dictname);
-
- if ((_resource_locale != null) || (SpellUI._configXML != null))
- loadConfigComplete(null);
- else {
- SpellUI._configXMLLoader.addEventListener(Event.COMPLETE, loadConfigComplete);
-
- if (SpellUI._configXMLLoading == false)
- {
- SpellUI._configXMLLoader.load(new URLRequest(_spellingConfigUrl));
- SpellUI._configXMLLoading = true;
- }
- }
+ private function loadConfig():void
+ {
+ _resource_locale = SpellingConfiguration.resourceTable.getResource(_dictionaryName);
+
+ if ((_resource_locale != null) || (SpellUI._configXML != null))
+ loadConfigComplete(null);
+ else {
+ SpellUI._configXMLLoader.addEventListener(Event.COMPLETE, loadConfigComplete);
+
+ if (SpellUI._configXMLLoading == false)
+ {
+ SpellUI._configXMLLoader.load(new URLRequest(_spellingConfigUrl));
+ SpellUI._configXMLLoading = true;
+ }
+ }
}
private function loadConfigComplete(evt:Event):void{
if (_resource_locale == null) {
- if (SpellUI._configXML == null)
- SpellUI._configXML= new XML(evt.target.data);
-
- SpellingConfiguration.resourceTable.setResource(_dictname,{rule:SpellUI._configXML.LanguageResource.(@languageCode==_dictname).@ruleFile,
- dict:SpellUI._configXML.LanguageResource.(@languageCode==_dictname).@dictionaryFile});
- }
+ if (SpellUI._configXML == null)
+ SpellUI._configXML = new XML(evt.target.data);
+
+ SpellingConfiguration.resourceTable.setResource(_dictionaryName,{rule:SpellUI._configXML.LanguageResource.(@languageCode==_dictionaryName).@ruleFile,
+ dict:SpellUI._configXML.LanguageResource.(@languageCode==_dictionaryName).@dictionaryFile});
+ }
//New Added
- _spellingservice = new SpellingService(_dictname);
- _spellingservice.addEventListener(Event.COMPLETE, loadDictComplete);
- _spellingservice.init();
+ _spellingService = createSpellingService(_dictionaryName);
+ _spellingService.addEventListener(Event.COMPLETE, loadDictComplete);
+ _spellingService.init();
}
-
+
+ protected function createSpellingService(dictionaryName:String):SpellingService
+ {
+ return new SpellingService(dictionaryName);
+ }
@@ -482,27 +485,27 @@
// Lazy loading the UD only when the main dict is loaded successfully
if ((SpellUI._cache["Squiggly_UD"] as UserDictionary) == null)
{
- _sharedobj = SharedObject.getLocal("Squiggly_v03");
+ _sharedObject = SharedObject.getLocal("Squiggly_v03");
var vec:Vector.<String> = new Vector.<String>();
- if (_sharedobj.data.ud) {
- for each (var w:String in _sharedobj.data.ud)
+ if (_sharedObject.data.ud) {
+ for each (var w:String in _sharedObject.data.ud)
vec.push(w);
}
- _userdict = new UserDictionary(vec);
+ _userDictionary = new UserDictionary(vec);
- SpellUI._cache["Squiggly_SO"] = _sharedobj;
- SpellUI._cache["Squiggly_UD"] = _userdict;
+ SpellUI._cache["Squiggly_SO"] = _sharedObject;
+ SpellUI._cache["Squiggly_UD"] = _userDictionary;
}
else
{
- _sharedobj = SpellUI._cache["Squiggly_SO"];
- _userdict = SpellUI._cache["Squiggly_UD"];
+ _sharedObject = SpellUI._cache["Squiggly_SO"];
+ _userDictionary = SpellUI._cache["Squiggly_UD"];
}
- _spellingservice.addUserDictionary(_userdict);
+ _spellingService.addUserDictionary(_userDictionary);
// Add the context menu, this might be not successful
- scm = null;
+ _scm = null;
try {
addContextMenu(null);
}
@@ -516,28 +519,21 @@
private function addContextMenu(event:Event):void
{
- if ( scm != null ) return;
- if ( isHaloComponent ) {
- hh= new HaloHighlighter( _actualParent);
- hw= new HaloWordProcessor( _actualParent );
- }else if ( isSparkComponent ){
- hh = new SparkHighlighter( _actualParent);
- hw = new SparkWordProcessor( _actualParent);
- } else {
- trace("error now, later will be true");
- }
+ if ( _scm != null ) return;
+ hh = createHighlighter(isHaloComponent, _actualParent);
+ hw = createWordProcessor(isHaloComponent, _actualParent);
- scm = new SpellingContextMenu(hh, hw, _spellingservice, _actualParent, _actualParent.contextMenu);
- scm.setIgnoreWordCallback( addWordToUserDictionary );
+ _scm = new SpellingContextMenu(hh, hw, _spellingService, _actualParent, _actualParent.contextMenu);
+ _scm.setIgnoreWordCallback( addWordToUserDictionary );
// Halo need this
if (_actualParent.contextMenu == null)
{
- _actualParent.contextMenu = scm.contextMenu;
+ _actualParent.contextMenu = _scm.contextMenu;
}
- //hh.spellingEnabled=true;
_spellingEnabled = true;
+
try {
doSpellingJob();
}
@@ -546,13 +542,23 @@
// If it fails here, it should later triggered by the render event, so no need to do anything
}
}
-
+
+ protected function createHighlighter(isHaloComoponent:Boolean, parent:*):IHighlighter
+ {
+ return isHaloComoponent ? new HaloHighlighter(parent) : new SparkHighlighter(parent);
+ }
+
+ protected function createWordProcessor(isHaloComoponent:Boolean, parent:*):IWordProcessor
+ {
+ return isHaloComoponent ? new HaloWordProcessor(parent) : new SparkWordProcessor( _actualParent);
+ }
+
private function addWordToUserDictionary(word:String):void
{
- _userdict.addWord(word);
+ _userDictionary.addWord(word);
// TODO: serialization here might affect ther performance
- _sharedobj.data.ud = _userdict.wordList;
+ _sharedObject.data.ud = _userDictionary.wordList;
}
/**
@@ -564,9 +570,9 @@
hh.clearSquiggles();
}
- if(scm != null)
+ if(_scm != null)
{
- scm.cleanUp();
+ _scm.cleanUp();
}
_actualParent.removeEventListener(Event.ADDED_TO_STAGE, addContextMenu);
diff --git a/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/FLEX_34717_Tests.as b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/FLEX_34717_Tests.as
index 624acae..9ce89df 100644
--- a/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/FLEX_34717_Tests.as
+++ b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/FLEX_34717_Tests.as
@@ -44,7 +44,7 @@
public function test_immediate_disable_after_enable():void
{
//given
- UIImpersonator.addChild(_input);
+ UIImpersonator.addElement(_input);
//when
SpellUI.enableSpelling(_input, "en_US");
diff --git a/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/FLEX_34756_Test.as b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/FLEX_34756_Test.as
new file mode 100644
index 0000000..dcb074f
--- /dev/null
+++ b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/FLEX_34756_Test.as
@@ -0,0 +1,160 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.adobe.linguistics.spelling {
+ import com.adobe.linguistics.spelling.SpellUI;
+ import com.adobe.linguistics.spelling.framework.SpellingService;
+ import com.adobe.linguistics.spelling.framework.ui.IHighlighter;
+
+ import flash.events.Event;
+ import flash.events.IEventDispatcher;
+
+ import flashx.textLayout.edit.EditManager;
+ import flashx.textLayout.elements.FlowElement;
+ import flashx.textLayout.elements.ParagraphElement;
+ import flashx.textLayout.elements.SpanElement;
+
+ import mockolate.nice;
+ import mockolate.prepare;
+ import mockolate.received;
+ import mockolate.stub;
+
+ import org.flexunit.assertThat;
+ import org.flexunit.asserts.assertTrue;
+ import org.flexunit.async.Async;
+ import org.fluint.uiImpersonation.UIImpersonator;
+
+ import spark.components.RichEditableText;
+
+ public class FLEX_34756_Test {
+ private static var _textField:RichEditableText;
+ private static var _sut:SpellUI;
+ private static const TEXT_WITH_SPELLING_ERROR:String = "helloo";
+ private static const DICT:String = "en_GB";
+
+ [Before(async, timeout=5000)]
+ public function setUp():void
+ {
+ _textField = new RichEditableText();
+ UIImpersonator.addChild(_textField);
+ _textField.text = TEXT_WITH_SPELLING_ERROR;
+
+ var mockolateDispatcher:IEventDispatcher = prepare(IHighlighter, SpellingService);
+ mockolateDispatcher.addEventListener(Event.COMPLETE, Async.asyncHandler(this, onSetUpComplete, 5000, null, null));
+ }
+
+ private static function onSetUpComplete(event:Event, passThroughData:Object):void
+ {
+ SpellUIForTest.sparkHighlighter = nice(IHighlighter);
+ SpellUIForTest.spellingService = nice(SpellingService, "spellingService", [DICT]);
+
+ _sut = new SpellUIForTest(_textField, DICT);
+ }
+
+ [After]
+ public function tearDown():void
+ {
+ UIImpersonator.removeAllChildren();
+ _textField = null;
+ _sut = null;
+ }
+
+ [Test(async, timeout=2500)]
+ public function make_sure_it_doesnt_run_a_spelling_job_on_damaged_text_flow():void
+ {
+ //when
+ stub(SpellUIForTest.spellingService).method("init").dispatches(new Event(Event.COMPLETE));
+ SpellUI.enableSpelling(_textField, "en_GB");
+ SpellUIForTest.eventDispatcher.addEventListener(Event.COMPLETE, Async.asyncHandler(this, onDictionaryLoadComplete, 1500, null, null));
+ }
+
+ private function onDictionaryLoadComplete(event:Event, passThroughData:Object):void
+ {
+ //given
+ damageTextFlow();
+
+ //when
+ _sut.doSpellingJob();
+
+ //then
+ //doSpellingJob() is also called once after the dictionary finishes loading, hence 'atMost(1)' below
+ assertThat(SpellUIForTest.sparkHighlighter, received().method("clearSquiggles").atMost(1));
+ assertThat(SpellUIForTest.spellingService, received().method("checkWord").never());
+ }
+
+ private function damageTextFlow():void
+ {
+ var editManager:EditManager = _textField.textFlow.interactionManager as EditManager;
+ var firstLine:FlowElement = editManager.textFlow.findLeaf(0);
+ var paragraph:ParagraphElement = firstLine.getParagraph();
+ var span:SpanElement = new SpanElement();
+ span.text = " • ";
+ paragraph.addChildAt(0, span);
+
+ assertTrue(_textField.textFlow.flowComposer.isDamaged(_textField.textFlow.textLength));
+ }
+ }
+}
+
+import com.adobe.linguistics.spelling.SpellUI;
+import com.adobe.linguistics.spelling.framework.SpellingService;
+import com.adobe.linguistics.spelling.framework.ui.HaloHighlighter;
+import com.adobe.linguistics.spelling.framework.ui.IHighlighter;
+
+import flash.events.Event;
+import flash.events.EventDispatcher;
+import flash.events.IEventDispatcher;
+import flash.events.TimerEvent;
+import flash.utils.Timer;
+
+class SpellUIForTest extends SpellUI
+{
+ public static var sparkHighlighter:IHighlighter;
+ public static var spellingService:SpellingService;
+ public static var eventDispatcher:IEventDispatcher = new EventDispatcher();
+ private static var _timer:Timer = new Timer(100, 1);
+
+ public function SpellUIForTest(textModel:*, lang:String)
+ {
+ _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimer);
+ super(textModel, lang);
+ }
+
+ private function onTimer(event:TimerEvent):void
+ {
+ eventDispatcher.dispatchEvent(new Event(Event.COMPLETE));
+ }
+
+ override protected function createHighlighter(isHaloComoponent:Boolean, parent:*):IHighlighter
+ {
+ //we're not dispatching the complete event just yet because this function is called before
+ //some extra processing is done after the dictionary is loaded. See SpellUI.addContextMenu()
+ _timer.stop();
+ _timer.reset();
+ _timer.start();
+
+ return isHaloComoponent ? new HaloHighlighter(parent) : sparkHighlighter;
+ }
+
+ override protected function createSpellingService(dictionaryName:String):SpellingService
+ {
+ return spellingService;
+ }
+
+}
diff --git a/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/SpellingConfig.xml b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/SpellingConfig.xml
new file mode 100644
index 0000000..64ac97d
--- /dev/null
+++ b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/SpellingConfig.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding='UTF-8'?>
+<SpellingConfig>
+ <LanguageResource language="English GB"
+ languageCode="en_GB"
+ ruleFile="dictionaries/en_GB/en_GB.aff"
+ dictionaryFile="dictionaries/en_GB/en_GB.dic"/>
+</SpellingConfig>
diff --git a/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/dictionaries/en_GB/en_GB.aff b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/dictionaries/en_GB/en_GB.aff
new file mode 100644
index 0000000..dc71ace
--- /dev/null
+++ b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/dictionaries/en_GB/en_GB.aff
@@ -0,0 +1,1150 @@
+# Affix file for British English MySpell dictionary
+# Also suitable as basis for Commonwealth and European English.
+# Built from scratch for MySpell. Released under LGPL.
+#
+# David Bartlett, Andrew Brown.
+# R 1.18, 11/04/05
+SET ISO8859-1
+TRY esiaénrtolcdugmfphbyvkw-'.zqjxSNRTLCGDMFPHBEAUYOIVKWóöâôZQJXÅçèîêàïüäñ
+REP 27
+REP f ph
+REP ph f
+REP f gh
+REP f ugh
+REP gh f
+REP ff ugh
+REP uf ough
+REP uff ough
+REP k ch
+REP ch k
+REP dg j
+REP j dg
+REP w ugh
+REP ness ity
+REP leness ility
+REP ness ivity
+REP eness ity
+REP og ogue
+REP ck qu
+REP ck que
+REP eg e.g.
+REP ie i.e.
+REP t ght
+REP ght t
+REP ok OK
+REP ts ce
+REP ce ts
+PFX A Y 2
+PFX A 0 re [^e]
+PFX A 0 re- e
+PFX a Y 1
+PFX a 0 mis .
+PFX I Y 4
+PFX I 0 il l
+PFX I 0 ir r
+PFX I 0 im [bmp]
+PFX I 0 in [^blmpr]
+PFX c Y 1
+PFX c 0 over .
+PFX U Y 1
+PFX U 0 un .
+PFX C Y 2
+PFX C 0 de [^e]
+PFX C 0 de- e
+PFX E Y 1
+PFX E 0 dis .
+PFX F Y 5
+PFX F 0 com [bmp]
+PFX F 0 co [aeiouh]
+PFX F 0 cor r
+PFX F 0 col l
+PFX F 0 con [^abehilmopru].
+PFX K Y 1
+PFX K 0 pre .
+PFX e Y 1
+PFX e 0 out .
+PFX f Y 2
+PFX f 0 under [^r]
+PFX f 0 under- r
+PFX O Y 1
+PFX O 0 non- .
+PFX 4 Y 1
+PFX 4 0 trans .
+SFX V Y 15
+SFX V 0 tive [aio]
+SFX V b ptive b
+SFX V d sive d
+SFX V be ptive be
+SFX V e tive ce
+SFX V de sive de
+SFX V ke cative ke
+SFX V e ptive me
+SFX V e ive [st]e
+SFX V e ative [^bcdkmst]e
+SFX V 0 lative [aeiou]l
+SFX V 0 ative [^aeiou]l
+SFX V 0 ive [st]
+SFX V y icative y
+SFX V 0 ative [^abdeilosty]
+SFX v Y 15
+SFX v 0 tively [aio]
+SFX v b ptively b
+SFX v d sively d
+SFX v be ptively be
+SFX v e tively ce
+SFX v de sively de
+SFX v ke catively ke
+SFX v e ptively me
+SFX v e ively [st]e
+SFX v e atively [^bcdkmst]e
+SFX v 0 latively [aeiou]l
+SFX v 0 atively [^aeiou]l
+SFX v 0 ively [st]
+SFX v y icatively y
+SFX v 0 atively [^abdeilosty]
+SFX u Y 15
+SFX u 0 tiveness [aio]
+SFX u b ptiveness b
+SFX u d siveness d
+SFX u be ptiveness be
+SFX u e tiveness ce
+SFX u de siveness de
+SFX u ke cativeness ke
+SFX u e ptiveness me
+SFX u e iveness [st]e
+SFX u e ativeness [^bcdkmst]e
+SFX u 0 lativeness [aeiou]l
+SFX u 0 ativeness [^aeiou]l
+SFX u 0 iveness [st]
+SFX u y icativeness y
+SFX u 0 ativeness [^abdeilosty]
+SFX N Y 26
+SFX N b ption b
+SFX N d sion d
+SFX N be ption be
+SFX N e tion ce
+SFX N de sion de
+SFX N ke cation ke
+SFX N e ption ume
+SFX N e mation [^u]me
+SFX N e ion [^o]se
+SFX N e ition ose
+SFX N e ation [iou]te
+SFX N e ion [^iou]te
+SFX N e ation [^bcdkmst]e
+SFX N el ulsion el
+SFX N 0 lation [aiou]l
+SFX N 0 ation [^aeiou]l
+SFX N 0 mation [aeiou]m
+SFX N 0 ation [^aeiou]m
+SFX N er ration er
+SFX N 0 ation [^e]r
+SFX N 0 ion [sx]
+SFX N t ssion mit
+SFX N 0 ion [^m]it
+SFX N 0 ation [^i]t
+SFX N y ication y
+SFX N 0 ation [^bdelmrstxy]
+SFX n Y 28
+SFX n 0 tion a
+SFX n e tion ce
+SFX n ke cation ke
+SFX n e ation [iou]te
+SFX n e ion [^iou]te
+SFX n e ation [^ckt]e
+SFX n el ulsion el
+SFX n 0 lation [aiou]l
+SFX n 0 ation [^aeiou]l
+SFX n er ration er
+SFX n 0 ation [^e]r
+SFX n y ation py
+SFX n y ication [^p]y
+SFX n 0 ation [^aelry]
+SFX n 0 tions a
+SFX n e tions ce
+SFX n ke cations ke
+SFX n e ations [iou]te
+SFX n e ions [^iou]te
+SFX n e ations [^ckt]e
+SFX n el ulsions el
+SFX n 0 lations [aiou]l
+SFX n 0 ations [^aeiou]l
+SFX n er rations er
+SFX n 0 ations [^e]r
+SFX n y ations py
+SFX n y ications [^p]y
+SFX n 0 ations [^aelry]
+SFX X Y 26
+SFX X b ptions b
+SFX X d sions d
+SFX X be ptions be
+SFX X e tions ce
+SFX X ke cations ke
+SFX X de sions de
+SFX X e ptions ume
+SFX X e mations [^u]me
+SFX X e ions [^o]se
+SFX X e itions ose
+SFX X e ations [iou]te
+SFX X e ions [^iou]te
+SFX X e ations [^bcdkmst]e
+SFX X el ulsions el
+SFX X 0 lations [aiou]l
+SFX X 0 ations [^aeiou]l
+SFX X 0 mations [aeiou]m
+SFX X 0 ations [^aeiou]m
+SFX X er rations er
+SFX X 0 ations [^e]r
+SFX X 0 ions [sx]
+SFX X t ssions mit
+SFX X 0 ions [^m]it
+SFX X 0 ations [^i]t
+SFX X y ications y
+SFX X 0 ations [^bdelmrstxy]
+SFX x Y 40
+SFX x b ptional b
+SFX x d sional d
+SFX x be ptional be
+SFX x e tional ce
+SFX x ke cational ke
+SFX x de sional de
+SFX x e ional [^o]se
+SFX x e itional ose
+SFX x e ional te
+SFX x e ational [^bcdkst]e
+SFX x el ulsional el
+SFX x 0 lational [aiou]l
+SFX x 0 ational [^aeiou]l
+SFX x er rational er
+SFX x 0 ational [^e]r
+SFX x 0 ional [sx]
+SFX x 0 ional [^n]t
+SFX x 0 ational nt
+SFX x y icational y
+SFX x 0 ational [^bdelrstxy]
+SFX x b ptionally b
+SFX x d sionally d
+SFX x be ptionally be
+SFX x e tionally ce
+SFX x ke cationally ke
+SFX x de sionally de
+SFX x e ionally [^o]se
+SFX x e itionally ose
+SFX x e ionally te
+SFX x e ationally [^bcdkst]e
+SFX x el ulsionally el
+SFX x 0 lationally [aiou]l
+SFX x 0 ationally [^aeiou]l
+SFX x er rationally er
+SFX x 0 ationally [^e]r
+SFX x 0 ionally [sx]
+SFX x 0 ionally [^n]t
+SFX x 0 ationally nt
+SFX x y icationally y
+SFX x 0 ationally [^bdelrstxy]
+SFX H N 13
+SFX H y ieth y
+SFX H ree ird ree
+SFX H ve fth ve
+SFX H e th [^ev]e
+SFX H 0 h t
+SFX H 0 th [^ety]
+SFX H y ieths y
+SFX H ree irds ree
+SFX H ve fths ve
+SFX H e ths [^ev]e
+SFX H 0 hs t
+SFX H 0 ths [^ety]
+SFX H 0 fold .
+SFX Y Y 9
+SFX Y 0 ally ic
+SFX Y 0 ly [^i]c
+SFX Y e y [^aeiou]le
+SFX Y 0 ly [aeiou]le
+SFX Y 0 ly [^l]e
+SFX Y 0 y [^aeiou]l
+SFX Y y ily [^aeiou]y
+SFX Y 0 ly [aeiou][ly]
+SFX Y 0 ly [^cely]
+SFX G Y 24
+SFX G e ing [^eioy]e
+SFX G 0 ing [eoy]e
+SFX G ie ying ie
+SFX G 0 bing [^aeio][aeiou]b
+SFX G 0 king [^aeio][aeiou]c
+SFX G 0 ding [^aeio][aeiou]d
+SFX G 0 fing [^aeio][aeiou]f
+SFX G 0 ging [^aeio][aeiou]g
+SFX G 0 king [^aeio][aeiou]k
+SFX G 0 ling [^aeio][eiou]l
+SFX G 0 ing [aeio][eiou]l
+SFX G 0 ling [^aeo]al
+SFX G 0 ing [aeo]al
+SFX G 0 ming [^aeio][aeiou]m
+SFX G 0 ning [^aeio][aeiou]n
+SFX G 0 ping [^aeio][aeiou]p
+SFX G 0 ring [^aeio][aeiou]r
+SFX G 0 sing [^aeio][aeiou]s
+SFX G 0 ting [^aeio][aeiou]t
+SFX G 0 ving [^aeio][aeiou]v
+SFX G 0 zing [^aeio][aeiou]z
+SFX G 0 ing [aeio][aeiou][bcdfgkmnprstvz]
+SFX G 0 ing [^aeiou][bcdfgklmnprstvz]
+SFX G 0 ing [^ebcdfgklmnprstvz]
+SFX J Y 25
+SFX J e ings [^eioy]e
+SFX J 0 ings [eoy]e
+SFX J ie yings ie
+SFX J 0 bings [^aeio][aeiou]b
+SFX J 0 king [^aeio][aeiou]c
+SFX J 0 dings [^aeio][aeiou]d
+SFX J 0 fings [^aeio][aeiou]f
+SFX J 0 gings [^aeio][aeiou]g
+SFX J 0 kings [^aeio][aeiou]k
+SFX J 0 lings [^aeio][eiou]l
+SFX J 0 ings [aeio][eiou]l
+SFX J 0 lings [^aeo]al
+SFX J 0 ings [aeo]al
+SFX J 0 mings [^aeio][aeiou]m
+SFX J 0 nings [^aeio][aiou]n
+SFX J 0 pings [^aeio][aeiou]p
+SFX J 0 rings [^aeio][aiou]r
+SFX J 0 sings [^aeio][aeiou]s
+SFX J 0 tings [^aeio][aiou]t
+SFX J 0 vings [^aeio][aeiou]v
+SFX J 0 zings [^aeio][aeiou]z
+SFX J 0 ings [^aeio]e[nrt]
+SFX J 0 ings [aeio][aeiou][bcdfgkmnprstvz]
+SFX J 0 ings [^aeiou][bcdfgklmnprstvz]
+SFX J 0 ings [^ebcdfgklmnprstvz]
+SFX k Y 8
+SFX k e ingly [^eioy]e
+SFX k 0 ingly [eoy]e
+SFX k ie yingly ie
+SFX k 0 kingly [^aeio][aeiou]c
+SFX k 0 lingly [^aeio][aeiou]l
+SFX k 0 ingly [aeio][aeiou][cl]
+SFX k 0 ingly [^aeiou][cl]
+SFX k 0 ingly [^ecl]
+SFX D Y 25
+SFX D 0 d [^e]e
+SFX D e d ee
+SFX D 0 bed [^aeio][aeiou]b
+SFX D 0 ked [^aeio][aeiou]c
+SFX D 0 ded [^aeio][aeiou]d
+SFX D 0 fed [^aeio][aeiou]f
+SFX D 0 ged [^aeio][aeiou]g
+SFX D 0 ked [^aeio][aeiou]k
+SFX D 0 led [^aeio][eiou]l
+SFX D 0 ed [aeio][eiou]l
+SFX D 0 led [^aeo]al
+SFX D 0 ed [aeo]al
+SFX D 0 med [^aeio][aeiou]m
+SFX D 0 ned [^aeio][aeiou]n
+SFX D 0 ped [^aeio][aeiou]p
+SFX D 0 red [^aeio][aeiou]r
+SFX D 0 sed [^aeio][aeiou]s
+SFX D 0 ted [^aeio][aeiou]t
+SFX D 0 ved [^aeio][aeiou]v
+SFX D 0 zed [^aeio][aeiou]z
+SFX D y ied [^aeiou]y
+SFX D 0 ed [aeiou]y
+SFX D 0 ed [aeio][aeiou][bcdfgkmnprstvz]
+SFX D 0 ed [^aeiou][bcdfgklmnprstvz]
+SFX D 0 ed [^ebcdfgklmnprstvyz]
+SFX d Y 16
+SFX d 0 d e
+SFX d 0 ked [^aeio][aeiou]c
+SFX d 0 led [^aeio][aeiou]l
+SFX d y ied [^aeiou]y
+SFX d 0 ed [aeiou]y
+SFX d 0 ed [aeio][aeiou][cl]
+SFX d 0 ed [^aeiou][cl]
+SFX d 0 ed [^ecly]
+SFX d e ing [^eioy]e
+SFX d 0 ing [eoy]e
+SFX d ie ying ie
+SFX d 0 king [^aeio][aeiou]c
+SFX d 0 ling [^aeio][aeiou]l
+SFX d 0 ing [aeio][aeiou][cl]
+SFX d 0 ing [^aeiou][cl]
+SFX d 0 ing [^ecl]
+SFX h Y 22
+SFX h 0 dly e
+SFX h 0 bedly [^aeio][aeiou]b
+SFX h 0 kedly [^aeio][aeiou]c
+SFX h 0 dedly [^aeio][aeiou]d
+SFX h 0 fedly [^aeio][aeiou]f
+SFX h 0 gedly [^aeio][aeiou]g
+SFX h 0 kedly [^aeio][aeiou]k
+SFX h 0 ledly [^aeio][aeiou]l
+SFX h 0 medly [^aeio][aeiou]m
+SFX h 0 nedly [^aeio][aiou]n
+SFX h 0 pedly [^aeio][aeiou]p
+SFX h 0 redly [^aeio][aiou]r
+SFX h 0 sedly [^aeio][aeiou]s
+SFX h 0 tedly [^aeio][aiou]t
+SFX h 0 vedly [^aeio][aeiou]v
+SFX h 0 zedly [^aeio][aeiou]z
+SFX h 0 edly [^aeio]e[nrt]
+SFX h y iedly [^aeiou]y
+SFX h 0 edly [aeiou]y
+SFX h 0 edly [aeio][aeiou][bcdfgklmnprstvz]
+SFX h 0 edly [^aeiou][bcdfgklmnprstvz]
+SFX h 0 edly [^ebcdfgklmnprstvyz]
+SFX i Y 22
+SFX i 0 dness e
+SFX i 0 bedness [^aeio][aeiou]b
+SFX i 0 kedness [^aeio][aeiou]c
+SFX i 0 dedness [^aeio][aeiou]d
+SFX i 0 fedness [^aeio][aeiou]f
+SFX i 0 gedness [^aeio][aeiou]g
+SFX i 0 kedness [^aeio][aeiou]k
+SFX i 0 ledness [^aeio][aeiou]l
+SFX i 0 medness [^aeio][aeiou]m
+SFX i 0 nedness [^aeio][aiou]n
+SFX i 0 pedness [^aeio][aeiou]p
+SFX i 0 redness [^aeio][aiou]r
+SFX i 0 sedness [^aeio][aeiou]s
+SFX i 0 tedness [^aeio][aiou]t
+SFX i 0 vedness [^aeio][aeiou]v
+SFX i 0 zedness [^aeio][aeiou]z
+SFX i 0 edness [^aeio]e[nrt]
+SFX i y iedness [^aeiou]y
+SFX i 0 edness [aeiou]y
+SFX i 0 edness [aeio][aeiou][bcdfgklmnprstvz]
+SFX i 0 edness [^aeiou][bcdfgklmnprstvz]
+SFX i 0 edness [^ebcdfgklmnprstvyz]
+SFX T Y 42
+SFX T 0 r e
+SFX T 0 st e
+SFX T 0 ber [^aeio][aeiou]b
+SFX T 0 best [^aeio][aeiou]b
+SFX T 0 ker [^aeio][aeiou]c
+SFX T 0 kest [^aeio][aeiou]c
+SFX T 0 der [^aeio][aeiou]d
+SFX T 0 dest [^aeio][aeiou]d
+SFX T 0 fer [^aeio][aeiou]f
+SFX T 0 fest [^aeio][aeiou]f
+SFX T 0 ger [^aeio][aeiou]g
+SFX T 0 gest [^aeio][aeiou]g
+SFX T 0 ker [^aeio][aeiou]k
+SFX T 0 kest [^aeio][aeiou]k
+SFX T 0 ler [^aeio][aeiou]l
+SFX T 0 lest [^aeio][aeiou]l
+SFX T 0 mer [^aeio][aeiou]m
+SFX T 0 mest [^aeio][aeiou]m
+SFX T 0 ner [^aeio][aeiou]n
+SFX T 0 nest [^aeio][aeiou]n
+SFX T 0 per [^aeio][aeiou]p
+SFX T 0 pest [^aeio][aeiou]p
+SFX T 0 rer [^aeio][aeiou]r
+SFX T 0 rest [^aeio][aeiou]r
+SFX T 0 ser [^aeio][aeiou]s
+SFX T 0 sest [^aeio][aeiou]s
+SFX T 0 ter [^aeio][aeiou]t
+SFX T 0 test [^aeio][aeiou]t
+SFX T 0 ver [^aeio][aeiou]v
+SFX T 0 vest [^aeio][aeiou]v
+SFX T 0 zer [^aeio][aeiou]z
+SFX T 0 zest [^aeio][aeiou]z
+SFX T y ier [^aeiou]y
+SFX T y iest [^aeiou]y
+SFX T 0 er [aeiou]y
+SFX T 0 est [aeiou]y
+SFX T 0 er [aeio][aeiou][bcdfgklmnprstvz]
+SFX T 0 er [^aeiou][bcdfgklmnprstvz]
+SFX T 0 er [^ebcdfgklmnprstvyz]
+SFX T 0 est [aeio][aeiou][bcdfgklmnprstvz]
+SFX T 0 est [^aeiou][bcdfgklmnprstvz]
+SFX T 0 est [^ebcdfgklmnprstvyz]
+SFX R Y 72
+SFX R 0 r e
+SFX R 0 rs e
+SFX R 0 ber [^aeio][aeiou]b
+SFX R 0 bers [^aeio][aeiou]b
+SFX R 0 ker [^aeio][aeiou]c
+SFX R 0 kers [^aeio][aeiou]c
+SFX R 0 der [^aeio][aeiou]d
+SFX R 0 ders [^aeio][aeiou]d
+SFX R 0 fer [^aeio][aeiou]f
+SFX R 0 fers [^aeio][aeiou]f
+SFX R 0 ger [^aeio][aeiou]g
+SFX R 0 gers [^aeio][aeiou]g
+SFX R 0 ker [^aeio][aeiou]k
+SFX R 0 kers [^aeio][aeiou]k
+SFX R 0 ler [^aeio][eiou]l
+SFX R 0 er [aeio][eiou]l
+SFX R 0 ler [^aeo]al
+SFX R 0 er [aeo]al
+SFX R 0 lers [^aeio][eiou]l
+SFX R 0 ers [aeio][eiou]l
+SFX R 0 lers [^aeo]al
+SFX R 0 ers [aeo]al
+SFX R 0 mer [^aeio][aeiou]m
+SFX R 0 mers [^aeio][aeiou]m
+SFX R 0 ner [^aeio][aeiou]n
+SFX R 0 ners [^aeio][aeiou]n
+SFX R 0 per [^aeio][aeiou]p
+SFX R 0 pers [^aeio][aeiou]p
+SFX R 0 rer [^aeio][aeiou]r
+SFX R 0 rers [^aeio][aeiou]r
+SFX R 0 ser [^aeio][aeiou]s
+SFX R 0 sers [^aeio][aeiou]s
+SFX R 0 ter [^aeio][aeiou]t
+SFX R 0 ters [^aeio][aeiou]t
+SFX R 0 ver [^aeio][aeiou]v
+SFX R 0 vers [^aeio][aeiou]v
+SFX R 0 zer [^aeio][aeiou]z
+SFX R 0 zers [^aeio][aeiou]z
+SFX R y ier [^aeiou]y
+SFX R y iers [^aeiou]y
+SFX R 0 er [aeiou]y
+SFX R 0 ers [aeiou]y
+SFX R 0 er [aeio][aeiou][bcdfgkmnprstvz]
+SFX R 0 ers [aeio][aeiou][bcdfgkmnprstvz]
+SFX R 0 er [^aeiou][bcdfgklmnprstvz]
+SFX R 0 ers [^aeiou][bcdfgklmnprstvz]
+SFX R 0 er [^ebcdfgklmnprstvyz]
+SFX R 0 ers [^ebcdfgklmnprstvyz]
+SFX R 0 r's e
+SFX R 0 ber's [^aeio][aeiou]b
+SFX R 0 ker's [^aeio][aeiou]c
+SFX R 0 der's [^aeio][aeiou]d
+SFX R 0 fer's [^aeio][aeiou]f
+SFX R 0 ger's [^aeio][aeiou]g
+SFX R 0 ker's [^aeio][aeiou]k
+SFX R 0 ler's [^aeio][eiou]l
+SFX R 0 er's [aeio][eiou]l
+SFX R 0 ler's [^aeo]al
+SFX R 0 er's [aeo]al
+SFX R 0 mer's [^aeio][aeiou]m
+SFX R 0 ner's [^aeio][aeiou]n
+SFX R 0 per's [^aeio][aeiou]p
+SFX R 0 rer's [^aeio][aeiou]r
+SFX R 0 ser's [^aeio][aeiou]s
+SFX R 0 ter's [^aeio][aeiou]t
+SFX R 0 ver's [^aeio][aeiou]v
+SFX R 0 zer's [^aeio][aeiou]z
+SFX R y ier's [^aeiou]y
+SFX R 0 er's [aeiou]y
+SFX R 0 er's [aeio][aeiou][bcdfgkmnprstvz]
+SFX R 0 er's [^aeiou][bcdfgklmnprstvz]
+SFX R 0 er's [^ebcdfgklmnprstvyz]
+SFX r Y 24
+SFX r 0 r e
+SFX r 0 ler [^aeio][aeiou]l
+SFX r 0 ker [^aeio][aeiou]c
+SFX r y ier [^aeiou]y
+SFX r 0 er [aeiou]y
+SFX r 0 er [aeio][aeiou][cl]
+SFX r 0 er [^aeiou][cl]
+SFX r 0 er [^ecly]
+SFX r 0 rs e
+SFX r 0 lers [^aeio][aeiou]l
+SFX r 0 kers [^aeio][aeiou]c
+SFX r y iers [^aeiou]y
+SFX r 0 ers [aeiou]y
+SFX r 0 ers [aeio][aeiou][cl]
+SFX r 0 ers [^aeiou][cl]
+SFX r 0 ers [^ecly]
+SFX r 0 r's e
+SFX r 0 ler's [^aeio][aeiou]l
+SFX r 0 ker's [^aeio][aeiou]c
+SFX r y ier's [^aeiou]y
+SFX r 0 er's [aeiou]y
+SFX r 0 er's [aeio][aeiou][cl]
+SFX r 0 er's [^aeiou][cl]
+SFX r 0 er's [^ecly]
+SFX S Y 9
+SFX S y ies [^aeiou]y
+SFX S 0 s [aeiou]y
+SFX S 0 es [sxz]
+SFX S 0 es [cs]h
+SFX S 0 s [^cs]h
+SFX S 0 s [ae]u
+SFX S 0 x [ae]u
+SFX S 0 s [^ae]u
+SFX S 0 s [^hsuxyz]
+SFX P Y 6
+SFX P y iness [^aeiou]y
+SFX P 0 ness [aeiou]y
+SFX P 0 ness [^y]
+SFX P y iness's [^aeiou]y
+SFX P 0 ness's [aeiou]y
+SFX P 0 ness's [^y]
+SFX m Y 20
+SFX m 0 sman [bdknmt]
+SFX m 0 sman [aeiou][bdklmnt]e
+SFX m 0 man [^aeiou][bdklmnt]e
+SFX m 0 man [^bdklmnt]e
+SFX m 0 man [^bdeknmt]
+SFX m 0 smen [bdknmt]
+SFX m 0 smen [aeiou][bdklmnt]e
+SFX m 0 men [^aeiou][bdklmnt]e
+SFX m 0 men [^bdklmnt]e
+SFX m 0 men [^bdeknmt]
+SFX m 0 sman's [bdknmt]
+SFX m 0 sman's [aeiou][bdklmnt]e
+SFX m 0 man's [^aeiou][bdklmnt]e
+SFX m 0 man's [^bdklmnt]e
+SFX m 0 man's [^bdeknmt]
+SFX m 0 smen's [bdknmt]
+SFX m 0 smen's [aeiou][bdklmnt]e
+SFX m 0 men's [^aeiou][bdklmnt]e
+SFX m 0 men's [^bdklmnt]e
+SFX m 0 men's [^bdeknmt]
+SFX 5 Y 15
+SFX 5 0 swoman [bdknmt]
+SFX 5 0 swoman [aeiou][bdklmnt]e
+SFX 5 0 woman [^aeiou][bdklmnt]e
+SFX 5 0 woman [^bdklmnt]e
+SFX 5 0 woman [^bdeknmt]
+SFX 5 0 swomen [bdknmt]
+SFX 5 0 swomen [aeiou][bdklmnt]e
+SFX 5 0 women [^aeiou][bdklmnt]e
+SFX 5 0 women [^bdklmnt]e
+SFX 5 0 women [^bdeknmt]
+SFX 5 0 swoman's [bdknmt]
+SFX 5 0 swoman's [aeiou][bdklmnt]e
+SFX 5 0 woman's [^aeiou][bdklmnt]e
+SFX 5 0 woman's [^bdklmnt]e
+SFX 5 0 woman's [^bdeknmt]
+SFX 6 Y 3
+SFX 6 y iful [^aeiou]y
+SFX 6 0 ful [aeiou]y
+SFX 6 0 ful [^y]
+SFX j Y 3
+SFX j y ifully [^aeiou]y
+SFX j 0 fully [aeiou]y
+SFX j 0 fully [^y]
+SFX p Y 5
+SFX p y iless [^aeiou]y
+SFX p 0 less [aeiou]y
+SFX p 0 ess ll
+SFX p 0 less [^l]l
+SFX p 0 less [^ly]
+SFX Q Y 44
+SFX Q 0 tise a
+SFX Q e ise [^l]e
+SFX Q le ilise [^aeiou]le
+SFX Q e ise [aeiou]le
+SFX Q um ise um
+SFX Q 0 ise [^u]m
+SFX Q s se is
+SFX Q 0 ise [^i]s
+SFX Q y ise [^aeiou]y
+SFX Q 0 ise [aeiou]y
+SFX Q 0 ise [^aemsy]
+SFX Q 0 tises a
+SFX Q e ises [^l]e
+SFX Q le ilises [^aeiou]le
+SFX Q e ises [aeiou]le
+SFX Q um ises um
+SFX Q 0 ises [^u]m
+SFX Q s ses is
+SFX Q 0 ises [^i]s
+SFX Q y ises [^aeiou]y
+SFX Q 0 ises [aeiou]y
+SFX Q 0 ises [^aemsy]
+SFX Q 0 tised a
+SFX Q e ised [^l]e
+SFX Q le ilised [^aeiou]le
+SFX Q e ised [aeiou]le
+SFX Q um ised um
+SFX Q 0 ised [^u]m
+SFX Q s sed is
+SFX Q 0 ised [^i]s
+SFX Q y ised [^aeiou]y
+SFX Q 0 ised [aeiou]y
+SFX Q 0 ised [^aemsy]
+SFX Q 0 tising a
+SFX Q e ising [^l]e
+SFX Q le ilising [^aeiou]le
+SFX Q e ising [aeiou]le
+SFX Q um ising um
+SFX Q 0 ising [^u]m
+SFX Q s sing is
+SFX Q 0 ising [^i]s
+SFX Q y ising [^aeiou]y
+SFX Q 0 ising [aeiou]y
+SFX Q 0 ising [^aemsy]
+SFX 8 Y 44
+SFX 8 0 tize a
+SFX 8 e ize [^l]e
+SFX 8 le ilize [^aeiou]le
+SFX 8 e ize [aeiou]le
+SFX 8 um ize um
+SFX 8 0 ize [^u]m
+SFX 8 s ze is
+SFX 8 0 ize [^i]s
+SFX 8 y ize [^aeiou]y
+SFX 8 0 ize [aeiou]y
+SFX 8 0 ize [^aemsy]
+SFX 8 0 tizes a
+SFX 8 e izes [^l]e
+SFX 8 le ilizes [^aeiou]le
+SFX 8 e izes [aeiou]le
+SFX 8 um izes um
+SFX 8 0 izes [^u]m
+SFX 8 s zes is
+SFX 8 0 izes [^i]s
+SFX 8 y izes [^aeiou]y
+SFX 8 0 izes [aeiou]y
+SFX 8 0 izes [^aemsy]
+SFX 8 0 tized a
+SFX 8 e ized [^l]e
+SFX 8 le ilized [^aeiou]le
+SFX 8 e ized [aeiou]le
+SFX 8 um ized um
+SFX 8 0 ized [^u]m
+SFX 8 s zed is
+SFX 8 0 ized [^i]s
+SFX 8 y ized [^aeiou]y
+SFX 8 0 ized [aeiou]y
+SFX 8 0 ized [^aemsy]
+SFX 8 0 tizing a
+SFX 8 e izing [^l]e
+SFX 8 le ilizing [^aeiou]le
+SFX 8 e izing [aeiou]le
+SFX 8 um izing um
+SFX 8 0 izing [^u]m
+SFX 8 s zing is
+SFX 8 0 izing [^i]s
+SFX 8 y izing [^aeiou]y
+SFX 8 0 izing [aeiou]y
+SFX 8 0 izing [^aemsy]
+SFX q Y 22
+SFX q 0 tisation a
+SFX q e isation [^l]e
+SFX q le ilisation [^aeiou]le
+SFX q e isation [aeiou]le
+SFX q um isation um
+SFX q 0 isation [^u]m
+SFX q s sation is
+SFX q 0 isation [^i]s
+SFX q y isation [^aeiou]y
+SFX q 0 isation [aeiou]y
+SFX q 0 isation [^aemsy]
+SFX q 0 tisations a
+SFX q e isations [^l]e
+SFX q le ilisations [^aeiou]le
+SFX q e isations [aeiou]le
+SFX q um isations um
+SFX q 0 isations [^u]m
+SFX q s sations is
+SFX q 0 isations [^i]s
+SFX q y isations [^aeiou]y
+SFX q 0 isations [aeiou]y
+SFX q 0 isations [^aemsy]
+SFX - Y 22
+SFX - 0 tization a
+SFX - e ization [^l]e
+SFX - le ilization [^aeiou]le
+SFX - e ization [aeiou]le
+SFX - um ization um
+SFX - 0 ization [^u]m
+SFX - s zation is
+SFX - 0 ization [^i]s
+SFX - y ization [^aeiou]y
+SFX - 0 ization [aeiou]y
+SFX - 0 ization [^aemsy]
+SFX - 0 tizations a
+SFX - e izations [^l]e
+SFX - le ilizations [^aeiou]le
+SFX - e izations [aeiou]le
+SFX - um izations um
+SFX - 0 izations [^u]m
+SFX - s zations is
+SFX - 0 izations [^i]s
+SFX - y izations [^aeiou]y
+SFX - 0 izations [aeiou]y
+SFX - 0 izations [^aemsy]
+SFX s Y 33
+SFX s 0 tiser a
+SFX s e iser [^l]e
+SFX s le iliser [^aeiou]le
+SFX s e iser [aeiou]le
+SFX s um iser um
+SFX s 0 iser [^u]m
+SFX s s ser is
+SFX s 0 iser [^i]s
+SFX s y iser [^aeiou]y
+SFX s 0 iser [aeiou]y
+SFX s 0 iser [^aemsy]
+SFX s 0 tisers a
+SFX s e isers [^l]e
+SFX s le ilisers [^aeiou]le
+SFX s e isers [aeiou]le
+SFX s um isers um
+SFX s 0 isers [^u]m
+SFX s s sers is
+SFX s 0 isers [^i]s
+SFX s y isers [^aeiou]y
+SFX s 0 isers [aeiou]y
+SFX s 0 isers [^aemsy]
+SFX s 0 tiser's a
+SFX s e iser's [^l]e
+SFX s le iliser's [^aeiou]le
+SFX s e iser's [aeiou]le
+SFX s um iser's um
+SFX s 0 iser's [^u]m
+SFX s s ser's is
+SFX s 0 iser's [^i]s
+SFX s y iser's [^aeiou]y
+SFX s 0 iser's [aeiou]y
+SFX s 0 iser's [^aemsy]
+SFX 9 Y 33
+SFX 9 0 tizer a
+SFX 9 e izer [^l]e
+SFX 9 le ilizer [^aeiou]le
+SFX 9 e izer [aeiou]le
+SFX 9 um izer um
+SFX 9 0 izer [^u]m
+SFX 9 s zer is
+SFX 9 0 izer [^i]s
+SFX 9 y izer [^aeiou]y
+SFX 9 0 izer [aeiou]y
+SFX 9 0 izer [^aemsy]
+SFX 9 0 tizers a
+SFX 9 e izers [^l]e
+SFX 9 le ilizers [^aeiou]le
+SFX 9 e izers [aeiou]le
+SFX 9 um izers um
+SFX 9 0 izers [^u]m
+SFX 9 s zers is
+SFX 9 0 izers [^i]s
+SFX 9 y izers [^aeiou]y
+SFX 9 0 izers [aeiou]y
+SFX 9 0 izers [^aemsy]
+SFX 9 0 tizer's a
+SFX 9 e izer's [^l]e
+SFX 9 le ilizer's [^aeiou]le
+SFX 9 e izer's [aeiou]le
+SFX 9 um izer's um
+SFX 9 0 izer's [^u]m
+SFX 9 s zer's is
+SFX 9 0 izer's [^i]s
+SFX 9 y izer's [^aeiou]y
+SFX 9 0 izer's [aeiou]y
+SFX 9 0 izer's [^aemsy]
+SFX t Y 22
+SFX t 0 tisable a
+SFX t e isable [^l]e
+SFX t le ilisable [^aeiou]le
+SFX t e isable [aeiou]le
+SFX t um isable um
+SFX t 0 isable [^u]m
+SFX t s sable is
+SFX t 0 isable [^i]s
+SFX t y isable [^aeiou]y
+SFX t 0 isable [aeiou]y
+SFX t 0 isable [^aemsy]
+SFX t 0 tisability a
+SFX t e isability [^l]e
+SFX t le ilisability [^aeiou]le
+SFX t e isability [aeiou]le
+SFX t um isability um
+SFX t 0 isability [^u]m
+SFX t s sability is
+SFX t 0 isability [^i]s
+SFX t y isability [^aeiou]y
+SFX t 0 isability [aeiou]y
+SFX t 0 isability [^aemsy]
+SFX + Y 22
+SFX + 0 tizable a
+SFX + e izable [^l]e
+SFX + le ilizable [^aeiou]le
+SFX + e izable [aeiou]le
+SFX + um izable um
+SFX + 0 izable [^u]m
+SFX + s zable is
+SFX + 0 izable [^i]s
+SFX + y izable [^aeiou]y
+SFX + 0 izable [aeiou]y
+SFX + 0 izable [^aemsy]
+SFX + 0 tizability a
+SFX + e izability [^l]e
+SFX + le ilizability [^aeiou]le
+SFX + e izability [aeiou]le
+SFX + um izability um
+SFX + 0 izability [^u]m
+SFX + s zability is
+SFX + 0 izability [^i]s
+SFX + y izability [^aeiou]y
+SFX + 0 izability [aeiou]y
+SFX + 0 izability [^aemsy]
+SFX M Y 1
+SFX M 0 's .
+SFX B Y 48
+SFX B e able [^acegilotu]e
+SFX B 0 able [acegilou]e
+SFX B te ble ate
+SFX B e able [^a]te
+SFX B 0 bable [^aeio][aeiou]b
+SFX B 0 kable [^aeio][aeiou]c
+SFX B 0 dable [^aeio][aeiou]d
+SFX B 0 fable [^aeio][aeiou]f
+SFX B 0 gable [^aeio][aeiou]g
+SFX B 0 kable [^aeio][aeiou]k
+SFX B 0 lable [^aeio][aeiou]l
+SFX B 0 mable [^aeio][aeiou]m
+SFX B 0 nable [^aeio][aeiou]n
+SFX B 0 pable [^aeio][aeiou]p
+SFX B 0 rable [^aeio][aeiou]r
+SFX B 0 sable [^aeio][aeiou]s
+SFX B 0 table [^aeio][aeiou]t
+SFX B 0 vable [^aeio][aeiou]v
+SFX B 0 zable [^aeio][aeiou]z
+SFX B 0 able [aeio][aeiou][bcdfgklmnprstvz]
+SFX B 0 able [^aeiou][bcdfgklmnprstvz]
+SFX B y iable [^aeiou]y
+SFX B 0 able [aeiou]y
+SFX B 0 able [^ebcdfgklmnprstvzy]
+SFX B e ability [^acegilotu]e
+SFX B 0 ability [acegilou]e
+SFX B te bility ate
+SFX B e ability [^a]te
+SFX B 0 bability [^aeio][aeiou]b
+SFX B 0 kability [^aeio][aeiou]c
+SFX B 0 dability [^aeio][aeiou]d
+SFX B 0 fability [^aeio][aeiou]f
+SFX B 0 gability [^aeio][aeiou]g
+SFX B 0 kability [^aeio][aeiou]k
+SFX B 0 lability [^aeio][aeiou]l
+SFX B 0 mability [^aeio][aeiou]m
+SFX B 0 nability [^aeio][aeiou]n
+SFX B 0 pability [^aeio][aeiou]p
+SFX B 0 rability [^aeio][aeiou]r
+SFX B 0 sability [^aeio][aeiou]s
+SFX B 0 tability [^aeio][aeiou]t
+SFX B 0 vability [^aeio][aeiou]v
+SFX B 0 zability [^aeio][aeiou]z
+SFX B 0 ability [aeio][aeiou][bcdfgklmnprstvz]
+SFX B 0 ability [^aeiou][bcdfgklmnprstvz]
+SFX B y iability [^aeiou]y
+SFX B 0 ability [aeiou]y
+SFX B 0 ability [^ebcdfgklmnprstvzy]
+SFX 7 Y 9
+SFX 7 e able [acegilou]e
+SFX 7 0 able [^acegilou]e
+SFX 7 0 kable [^aeio][aeiou]c
+SFX 7 0 lable [^aeio][aeiou]l
+SFX 7 0 able [aeio][aeiou][cl]
+SFX 7 0 able [^aeiou][cl]
+SFX 7 y iable [^aeiou]y
+SFX 7 0 able [aeiou]y
+SFX 7 0 able [^cely]
+SFX g Y 9
+SFX g e ability [^acegilou]e
+SFX g 0 ability [acegilou]e
+SFX g 0 kability [^aeio][aeiou]c
+SFX g 0 lability [^aeio][aeiou]l
+SFX g 0 ability [aeio][aeiou][cl]
+SFX g 0 ability [^aeiou][cl]
+SFX g y iability [^aeiou]y
+SFX g 0 ability [aeiou]y
+SFX g 0 ability [^cely]
+SFX l Y 9
+SFX l e ably [^acegilou]e
+SFX l 0 ably [acegilou]e
+SFX l 0 kably [^aeio][aeiou]c
+SFX l 0 lably [^aeio][aeiou]l
+SFX l 0 ably [aeio][aeiou][cl]
+SFX l 0 ably [^aeiou][cl]
+SFX l y iably [^aeiou]y
+SFX l 0 ably [aeiou]y
+SFX l 0 ably [^cely]
+SFX b Y 3
+SFX b e ible [^aeiou]e
+SFX b 0 ible [aeiou]e
+SFX b 0 ible [^e]
+SFX L Y 12
+SFX L 0 ament m
+SFX L y iment [^aeiou]y
+SFX L 0 ment [aeiou]y
+SFX L 0 ment [^my]
+SFX L 0 aments m
+SFX L y iments [^aeiou]y
+SFX L 0 ments [aeiou]y
+SFX L 0 ments [^my]
+SFX L 0 ament's m
+SFX L y iment's [^aeiou]y
+SFX L 0 ment's [aeiou]y
+SFX L 0 ment's [^my]
+SFX Z Y 22
+SFX Z e y [^aeiouy]e
+SFX Z 0 y [aeiouy]e
+SFX Z 0 ey [aiouy]
+SFX Z 0 by [^aeio][aeiou]b
+SFX Z 0 ky [^aeio][aeiou]c
+SFX Z 0 dy [^aeio][aeiou]d
+SFX Z 0 fy [^aeio][aeiou]f
+SFX Z 0 gy [^aeio][aeiou]g
+SFX Z 0 ky [^aeio][aeiou]k
+SFX Z 0 ly [^aeio][aeiou]l
+SFX Z 0 my [^aeio][aeiou]m
+SFX Z 0 ny [^aeio][aiou]n
+SFX Z 0 py [^aeio][aeiou]p
+SFX Z 0 ry [^aeio][aiou]r
+SFX Z 0 sy [^aeio][aeiou]s
+SFX Z 0 ty [^aeio][aiou]t
+SFX Z 0 vy [^aeio][aeiou]v
+SFX Z 0 zy [^aeio][aeiou]z
+SFX Z 0 y [^aeio]e[nrt]
+SFX Z 0 y [aeio][aeiou][bcdfgklmnprstvz]
+SFX Z 0 y [^aeiou][bcdfgklmnprstvz]
+SFX Z 0 y [^aebcdfgiklmnoprstuvyz]
+SFX 2 Y 21
+SFX 2 e iness [^aeiouy]e
+SFX 2 0 iness [aeiouy]e
+SFX 2 0 biness [^aeio][aeiou]b
+SFX 2 0 kiness [^aeio][aeiou]c
+SFX 2 0 diness [^aeio][aeiou]d
+SFX 2 0 finess [^aeio][aeiou]f
+SFX 2 0 giness [^aeio][aeiou]g
+SFX 2 0 kiness [^aeio][aeiou]k
+SFX 2 0 liness [^aeio][aeiou]l
+SFX 2 0 miness [^aeio][aeiou]m
+SFX 2 0 niness [^aeio][aiou]n
+SFX 2 0 piness [^aeio][aeiou]p
+SFX 2 0 riness [^aeio][aiou]r
+SFX 2 0 siness [^aeio][aeiou]s
+SFX 2 0 tiness [^aeio][aiou]t
+SFX 2 0 viness [^aeio][aeiou]v
+SFX 2 0 ziness [^aeio][aeiou]z
+SFX 2 0 iness [^aeio]e[nrt]
+SFX 2 0 iness [aeio][aeiou][bcdfgklmnprstvz]
+SFX 2 0 iness [^aeiou][bcdfgklmnprstvz]
+SFX 2 0 iness [^ebcdfgklmnprstvz]
+SFX z Y 24
+SFX z e ily [^aeiouy]e
+SFX z 0 ily [aeiouy]e
+SFX z 0 ily [aiou]y
+SFX z ey ily ey
+SFX z y ily [^aeiou]y
+SFX z 0 bily [^aeio][aeiou]b
+SFX z 0 kily [^aeio][aeiou]c
+SFX z 0 dily [^aeio][aeiou]d
+SFX z 0 fily [^aeio][aeiou]f
+SFX z 0 gily [^aeio][aeiou]g
+SFX z 0 kily [^aeio][aeiou]k
+SFX z 0 lily [^aeio][aeiou]l
+SFX z 0 mily [^aeio][aeiou]m
+SFX z 0 nily [^aeio][aiou]n
+SFX z 0 pily [^aeio][aeiou]p
+SFX z 0 rily [^aeio][aiou]r
+SFX z 0 sily [^aeio][aeiou]s
+SFX z 0 tily [^aeio][aiou]t
+SFX z 0 vily [^aeio][aeiou]v
+SFX z 0 zily [^aeio][aeiou]z
+SFX z 0 ily [^aeio]e[nrt]
+SFX z 0 ily [aeio][aeiou][bcdfgklmnprstvyz]
+SFX z 0 ily [^aeiou][bcdfgklmnprstvyz]
+SFX z 0 ily [^ebcdfgklmnprstvyz]
+SFX y Y 15
+SFX y e ory te
+SFX y e atory [mr]e
+SFX y e ary se
+SFX y 0 ry [^mrst]e
+SFX y 0 ory [^aeous]t
+SFX y 0 ry [aeous]t
+SFX y 0 ery h
+SFX y 0 atory [^i]m
+SFX y im matory im
+SFX y 0 ory s
+SFX y 0 ary ion
+SFX y 0 ry [^i]on
+SFX y 0 nery [aiu]n
+SFX y 0 ry [^aiou]n
+SFX y 0 ry [^ehmstn]
+SFX O Y 12
+SFX O 0 l a
+SFX O e al [^bcgv]e
+SFX O e ial [bcgv]e
+SFX O 0 ial [bcrx]
+SFX O um al um
+SFX O 0 al [^u]m
+SFX O y al ty
+SFX O y ial [^t]y
+SFX O 0 ual [px]t
+SFX O 0 tal [iu]t
+SFX O 0 al [^ipux]t
+SFX O 0 al [^aebcrtxmy]
+SFX o Y 12
+SFX o 0 lly a
+SFX o e ally [^bcgv]e
+SFX o e ially [bcgv]e
+SFX o 0 ially [bcrx]
+SFX o um ally um
+SFX o 0 ally [^u]m
+SFX o y ally ty
+SFX o y ially [^t]y
+SFX o 0 ually [px]t
+SFX o 0 tally [iu]t
+SFX o 0 ally [^ipux]t
+SFX o 0 ally [^aebcrtxmy]
+SFX W Y 21
+SFX W ce tific ce
+SFX W e atic me
+SFX W se tic se
+SFX W le ic ble
+SFX W e ic [^b]le
+SFX W e ic [^clms]e
+SFX W 0 lic [ay]l
+SFX W 0 ic [^ay]l
+SFX W us ic us
+SFX W 0 tic [^u]s
+SFX W er ric er
+SFX W 0 ic [^e]r
+SFX W 0 atic [aeiou]m
+SFX W 0 ic [^aeiou]m
+SFX W 0 tic ma
+SFX W a ic [^m]a
+SFX W y etic thy
+SFX W y ic [^t]hy
+SFX W y tic sy
+SFX W y ic [^hs]y
+SFX W 0 ic [^aelmrsy]
+SFX w Y 9
+SFX w e ical e
+SFX w er rical er
+SFX w 0 ical [^e]r
+SFX w 0 atical [aeiou]m
+SFX w 0 ical [^aeiou]m
+SFX w 0 tical ma
+SFX w a ical [^m]a
+SFX w y ical y
+SFX w 0 ical [^aemry]
+SFX 1 Y 9
+SFX 1 e ically e
+SFX 1 er rically er
+SFX 1 0 ically [^e]r
+SFX 1 0 atically [aeiou]m
+SFX 1 0 ically [^aeiou]m
+SFX 1 0 tically ma
+SFX 1 a ically [^m]a
+SFX 1 y ically y
+SFX 1 0 ically [^aemry]
+SFX 3 Y 21
+SFX 3 e ist [^aceiou]e
+SFX 3 ce tist ce
+SFX 3 0 ist [aeiou]e
+SFX 3 y ist [^aeioubp]y
+SFX 3 0 ist [aeioubp]y
+SFX 3 o ist o
+SFX 3 0 ists [^eoy]
+SFX 3 e ists [^aceiou]e
+SFX 3 ce tists ce
+SFX 3 0 ists [aeiou]e
+SFX 3 y ists [^aeioubp]y
+SFX 3 0 ists [aeioubp]y
+SFX 3 o ists o
+SFX 3 0 ists [^eoy]
+SFX 3 e ist's [^aceiou]e
+SFX 3 ce tist's ce
+SFX 3 0 ist's [aeiou]e
+SFX 3 y ist's [^aeioubp]y
+SFX 3 0 ist's [aeioubp]y
+SFX 3 o ist's o
+SFX 3 0 ist's [^eoy]
diff --git a/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/dictionaries/en_GB/en_GB.dic b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/dictionaries/en_GB/en_GB.dic
new file mode 100644
index 0000000..d002789
--- /dev/null
+++ b/Squiggly/main/SpellingUIEx/tests/com/adobe/linguistics/spelling/dictionaries/en_GB/en_GB.dic
@@ -0,0 +1,46281 @@
+46280
+abaft
+abbreviation/M
+abdicate/DNGSn
+Abelard/M
+abider/M
+Abidjan
+ablaze
+abloom
+aboveground
+abrader/M
+Abram/M
+abreaction/MS
+abrogator/MS
+abscond/DRSG
+absinthe/MS
+absoluteness/S
+absorbency/SM
+abstract/ShTVDPiGY
+absurdness/S
+Abuja/M
+Abyssinia/M
+Acadia
+accede/SDG
+accept/BDSRVGkhl
+acceptable/P
+accepted/U
+accommodate/DGnkSNVu
+accommodating/U
+accompanier/M
+accomplish/RLSGD
+accordion/MS3
+accost/DSG
+accountant/SM
+accrual/MS
+accurately/I
+accusal/M
+achene/SM
+achievable/U
+achieves/c
+acidification/M
+acidulous
+acoustical
+acquaintance/SM
+acquisition/MA
+acridity/SM
+acrobatics/M
+actinic
+actinide/MS
+actively/IA
+activity/SMI
+Acton/M
+actual/q8YSQ-
+adagio/S
+adaptation/M
+add/RDGS7
+additivity
+Adele/M
+adhere/DGRS
+adherence/MS
+adjudicator/MS
+adjunct/SYMV
+adjuration/M
+adjust/RLDlGS7V
+Adler/M
+administratrix/M
+admiralty/SM
+admiration/M
+adobe/NvVSMX
+adopted/AU
+adoption/M
+adorned/U
+adrenal/Y
+adrift
+adumbrate/VSGnvDN
+Adventist's
+adverse/yTDYGP
+advertise/LJ
+adze/DMSG
+Aegean/M
+Aeneas
+aerialist
+aerodrome/SM
+aerodynamic/SY
+aero-engine/MS
+affectedly/U
+affective/M
+affinity/MS
+affirmed/A
+affix/DSG
+affray/MSDG
+affricative/M
+aforesaid
+after/S
+age's/e
+agility/MS
+agitator/MS
+agnostic/MS
+agnosticism/SM
+agreeableness/ES
+agriculturalist
+Agrippa/M
+AI
+Aiken/M
+ain't
+airflow/MS
+airsick/P
+airtime
+airway/MS
+ajar
+alabaster/SM
+Alamo/S
+alanine/M
+Alaric/M
+alarm/3DGkS
+albacore/SM
+albedo/M
+albeit
+album/MS
+Aldridge/M
+alewife/M
+Alexia/M
+Alexis
+Alfonso/M
+Alger/M
+Algiers
+alienation/M
+alinement's
+alkyd/S
+Allah/M
+all-day
+allegation/M
+allergen/MSW
+alleyway/MS
+allies/M
+allocator/KSC
+allots/A
+allowable/P
+all-star
+Allstate
+alms/m
+alnico
+aloft
+along
+alpine/S
+al-Qa'ida/M
+Alsace/M
+alternation/M
+Alton/M
+alumni
+alundum
+alveolus/M
+AMA
+amanuenses
+Amazonian
+ambergris/MS
+Amdahl/M
+Amherst/M
+amide/MS
+amir's
+Amish/M
+amoral
+amorphous/PY
+amortise/nSGD
+amortize/nNSGD
+amour/MS
+amphibian/MS
+amphibology/M
+ample/PT
+amplification/M
+anarchy/3Ww1SM
+anastigmatic
+Andaman/M
+aneroid
+Anglican/MS
+Anglicanism/M
+Anglicise/nSGD
+Anglicize/nNSGD
+Anglophobia/M
+angularity/MS
+anhydrous/Y
+animate/DnASNG
+animated/Y
+anisette/SM
+annalen
+annihilator/SM
+anorak/SM
+anorexia/MS
+antediluvian/S
+anthem/MdS
+anthropometric/S
+anthropometry/WM
+antibody/MS
+anticompetitive
+antidemocratic
+antiformant
+antigenicity/SM
+Antigua/M
+Antioch/M
+antipasti
+antipodal/S
+antiquarian/MS
+antiquarianism/MS
+antisepses
+antisocial/Y
+antitrust/M
+antral
+anyway
+apace
+aphasic/S
+aphid/MS
+apiece
+apocrypha/oM
+apogee/SM
+Apollo/M
+apology/SQ8s9M3
+apostle/MS
+apotheoses
+Appian
+appliquéd
+apply/vnNRGDSV
+appraisal/AMS
+appraise/AGSD
+appreciate/vyGVDNnuS
+apprehended/a
+approbation/MES
+Apr
+apsis/M
+aptness/IS
+aquaria
+aquiculture's
+aquiline
+Arabia/M
+Arafat/M
+arbutus/MS
+arcane/Y
+arcaneness
+arch/yTDRYSPGM
+archaist/MS
+archery/M
+Archimedes
+Argentine/SM
+argon/M
+arguable/YIU
+argumentativeness/S
+ark/MS
+armour-plate/D
+armpit/MS
+Arne/M
+around
+array/EGMSD
+arrhythmia/SM
+arrowhead/SM
+arsenate/M
+arsine/MS
+arsonist
+art/6MjZ32pS
+arteriolar
+artesian
+Artie/M
+artifice/oMRS
+artillery/3mSM
+artist/W1y
+asbestos/SM
+ascertain/L7SDG
+ASCII
+ascription/M
+Asiatic/MS
+asp/MWS
+aspect/MS
+asphyxiate/SDG
+asplenium
+assail/7DSG
+assassination/M
+assembles/A
+assembling/A
+assignee/MS
+assignor/SM
+associate/EDSGnN
+associativity/S
+assurance/SAM
+Assyria/M
+Assyriology
+Astana/M
+asterisk/SDGM
+astigmatism/MS
+astride
+astrophysicist/SM
+at/F
+atelier/SM
+Atlanta/MW
+Atman/M
+atoll/MS
+atomic/Y
+atonal
+atonality/SM
+atrial
+attaches/A
+attend/SRGD
+attendance/MS
+attentional/Y
+attentive/PIY
+attenuate/GnSDN
+attic/MS
+attorney/MS
+attractive/UY
+attractiveness/SM
+attribute/xGVvDS
+attrition/SM
+aubergine/MS
+Auckland/M
+audaciousness/S
+audibly/I
+audio/M
+audiometry/M
+audited/U
+auditorium/SM
+Aug
+augment/NnDRGS
+augmentation/M
+augury/SM
+Augusta/M
+Augusts
+Australasia/M
+Australia/M
+authorised/AU
+authoritative/YP
+autocrat/MWS1
+autodialler
+automata
+automotive
+autoregressive
+avalanche/GSMD
+avaunt/S
+avitaminoses
+aweigh
+awes/c
+awfulness/S
+axe/DmMGS
+axial/FY
+Ayr/M
+babble/RGDS
+babysit/RSG
+bacchanal/SM
+Bacchanalian/S
+backfield/MS
+backfill/SGD
+backlasher
+backscatter/dMS
+backslapper/SM
+backstop/MSGD
+backward/PSY
+bade
+bail/7MDGS
+bailey/S
+bailiff/MS
+balanced/cAeU
+balboa/MS
+Balearic/M
+ballistics/M
+balloon/3RSMDG
+balsa/SM
+balsam/dMS
+banality/SM
+Banbridge/M
+bandeaux
+banded/E
+Bangkok/M
+banish/GSLD
+bannister/SM
+banquette/MS
+bans/U
+banshee/SM
+banter/kdS
+banterer/M
+baptism/oSM
+bar/CDESUG
+barbarous/YP
+barbell/MS
+bareback
+bargepole/M
+barley/MS
+Barrett/M
+Barrow-in-Furness
+barycentre/MW
+baryon/MS
+baseball/SM
+baseband
+Basel/M
+bases/C
+bash/Sj6DG
+basilar
+basin/6MS
+basinful/S
+basing/C
+Basingstoke/M
+basswood/SM
+baste/nSN
+batcher
+bathtub/SM
+bathwater
+Bator/M
+battleship/SM
+baulky/TP
+bayonet/dMS
+bayou/SM
+Bea/M
+beady/T
+beagle/DGSM
+bearish/YP
+Beaujolais
+beautify/WNRSDnG
+because
+bedazzle/DLSG
+bedbug/SM
+bedrock/SM
+bedspread/MS
+Bedworth/M
+Beethoven/M
+befuddle/LSDG
+begonia/SM
+begrime/SDG
+begrudge/GDSk
+Beijing/M
+being/SM
+belabour/DGSM
+belate/Dih
+belief's/U
+believing/U
+belittle/GLDS
+bellboy/SM
+bell-hop's
+bell-ringer/S
+bellwether/MS
+Belmont/M
+belted/U
+Belton/M
+beltway/SM
+benedictory
+benefactor/SM
+benignant
+beribboned
+Berman/M
+Bernard/M
+Bernhard/M
+berserk/S
+Berwick/M
+beryl/MS
+beryllium/M
+bespatter/dS
+bespeak/GS
+bestial/Y
+bestride/SG
+bet/MRGSD
+Beth/M
+Bethany/M
+Betsey/M
+between/PS
+bewigged
+bicarbonate/MS
+bid/RMZdGJS
+bidet/SM
+bifocal/S
+biggish
+bigot/ydSM
+bilge/DGMS
+bilingualism/MS
+billboard/SGDM
+Billie/M
+biophysics/M
+birdhouse/SM
+birdieing
+birdseed/SM
+Birgit/M
+Biro/M
+Biscay/M
+biserial
+Bishkek/M
+bishop/dSM
+Bismarck/M
+bitch/GZDSz2M
+BITNET
+bitten
+biweekly/S
+biyearly
+blabber/d
+black-hearted
+blackjack/MSDG
+blameworthiness/S
+blank/PDGSTY
+blasting/M
+blastoff/SM
+blatant/Y
+bleater/M
+blend/RGSD
+blessing/M
+blew
+Bligh/M
+blip/DGMS
+blithe/YTP
+blitz/GSDM
+blitzkrieg/SM
+blockbusting/M
+Bloemfontein/M
+blood-letting/SM
+bloodstain/DMS
+bloodstream/SM
+blossomy
+blow-up/SM
+bluffness/S
+boar/MS
+board/RMGDSJ
+boastfulness/S
+bobtail/SMGD
+bodkin/MS
+body-colour
+body-piercing
+bog/GDMZS
+bohemian/S
+bola/SM
+bolero/MS
+bolter/M
+Boltzmann/M
+bondage/MS
+Boniface/M
+boniness/S
+bonsai/M
+booking/M
+bookshop/MS
+booth/MS
+Bootle/M
+bootlegging/M
+boozy/T
+bop/RGDS
+Borealis
+Boris/M
+born-again
+borosilicate/M
+Bose/M
+Botham/M
+bottommost
+botulinus/M
+boudoir/MS
+boutonnière/SM
+boxy/T
+boy/MS
+brachia
+bract/MS
+Braille/M
+brain-dead
+brambling/M
+Brannon/M
+brassiness/S
+bravado
+brave/DYyTGPS
+bravery/SM
+bravest/M
+breakage/MS
+breakthrough/MS
+break-up/S
+breakwater/SM
+breastbone/SM
+brecciated
+breech-loaded
+Breton/M
+bride/SM
+Bridget/M
+Bridgnorth/M
+bridle/MGSD
+brigade/GDSM
+brigandage/SM
+brigantine/SM
+Brighton/M
+brinkmanship/MS
+broadcast/SARG
+broadloom/MS
+broadness/S
+broil/GRSD
+broker/d
+brokerage/MS
+bromide/SMW
+bronchus/M
+brood/GM2ZRSDk
+brougham/SM
+brownish
+brows/SDRBG
+bruit/S
+brusqueness/S
+Bryn/M
+buccaneer/GDSM
+bucker/M
+buckminsterfullerene
+bucksaw/MS
+bucolic/YS
+buffer/rd
+bufflehead/M
+buffoonish
+build/RGJS
+Bulgarian/MS
+bulgy/T
+bulker
+bumpkin/MS
+bunion/SM
+buoyant/Y
+burdened/Uc
+burdock/MS
+burg/RSM
+burgle/SDG
+burial/SAM
+Burlington/M
+burned/U
+burnish/RSGD
+burntness
+burp/MDSG
+bury/ADSG
+bus/MAS
+Busch/M
+bushiness/S
+bushland
+bushwhacking/M
+business/m5S
+businesslike
+businessperson/S
+busywork/SM
+buttonholer/M
+Buxtehude/M
+buzzword/SM
+by
+by-election/S
+Byrne/M
+c/nN
+cab/GMDXVSN
+cablegram/SM
+cactus/MS
+caecum/M
+Caesar
+cagiest
+cahoot/MS
+Caisos
+cajole/RLyDSG
+calcite/SM
+CALCOMP
+Calder
+caldera/SM
+caldron's
+calender/dMS
+calibrate/SAGDN
+calibrater's
+calico/M
+calla/SM
+callback/S
+calliper/SM
+callowness/S
+calls/aA
+calorie/SM
+calorific
+calyces's
+Camberley/M
+Camden/M
+camelhair's
+Campbellsport
+camp-site/SM
+campus/MS
+Canaan/M
+caning/M
+canniness/S
+cannon/dSM
+canonical/Q8q-
+can't
+canted/AI
+canvas/MRGDS
+capon/SM
+cappuccino/SM
+caps/8
+capsular
+captaincy/MS
+captioner
+captivate/SDG
+carboy/MS
+carbuncle/DSM
+card-carrying
+cardioid/M
+caribou/M
+Carmen/M
+carnal/Y
+carnival/SM
+carol-singing
+Carpathian/S
+carpentry/SM
+carrageen/M
+carried/a
+carrot/MS
+carsick/P
+Carson
+cart/RMD6GS
+cartload/MS
+caryatid/SM
+Carys
+cased/U
+Casey/M
+Cassels
+caster/nN
+casts/aAe
+casualness/S
+cat/M2ZzDGS
+catalepsy/MS
+catch-all/SM
+catchphrase/S
+catechism/MS
+catharsis/M
+cathedral/SM
+Catherine
+Cathy
+Caucasoid
+cavil/SDRGJ
+cc
+celandine/SM
+celebratedness/M
+cellar/dMS
+celluloid/MS
+centaur/MS
+centime/SM
+centurion/SM
+Cephalochordata
+Cephalopoda
+ceramic/3MS
+cerebellar
+cerebra/no
+cerise/MS
+cerium/M
+cermet/SM
+certification/MCA
+certiorari/M
+cession/FMAK
+CFO
+cha/Wy
+chalkboard/MS
+chammy's
+Chancellorship/S
+chances/a
+chanciness/S
+chandelier/MS
+chanson/SM
+chapbook/MS
+Chapman
+character/sQ98t+dpq6-MS
+charitable/UY
+charlatanism/SM
+chasm/SM
+châtelaine/MS
+chauffeur/DSMG
+checkmate/MDSG
+checkout/S
+checksum/GMSD
+cheek/2GMzDZS
+cheekiness/S
+cheerleader/SM
+chelate/DnMNG
+chemosynthesis
+chemurgy/SM
+cheque/RSM
+chert/SM
+cherub/SMW
+Cheryl/M
+chevalier/MS
+chew/GRZ2S7D
+chickenfeed
+chickenpox/SM
+child/pM
+childlike/P
+China/Mm
+chine/SM
+chip/GMJZDS
+choir/GSDM
+cholera/MSW
+chomp/SDG
+Chopin
+choppiness/S
+choppy/TP
+chorale/MS
+choreography/MS
+chose
+Christ/M
+chromatics/M
+chromatograph/ZW
+chromium/SM
+chromosomal
+chronograph/ZSM
+Chrysler
+chum/2DzMZSG
+chunky/TP
+churchgoing/SM
+cinchona/SM
+circler/M
+circuit/MdS
+circuital
+circuitry/MS
+circuity/SM
+circulant
+circumcised/U
+circumciser/M
+circumflex/DSGM
+cl/GJ
+clairvoyant/SY
+clang/DRGS
+Clara
+Clarence
+classiness/S
+classing/e
+claustrophobic
+clearance/MS
+Clement/SM
+Cline
+clinometer/SIM
+cliometrician/S
+clipboard/SM
+Cliveden
+cloak-and-dagger
+cloaked/U
+cloister/MdS
+close-cropped
+closer/ESM
+clothesline/SGDM
+clothesman
+cloudless/PY
+cloudy/TP
+clown/SDGM
+clubbing/M
+clubhouse/MS
+clunk/DRM2GzZS
+coachloads
+coaler/M
+coal-fired
+coalitionist
+coarse/TPY
+coastal
+coastline/MS
+cocaine/SM
+cock-a-hoop
+cockatoo/SM
+cockpit/MS
+cockroach/SM
+cock-shy
+code/CDaAGS
+codebook/S
+codebreak
+codebreaker
+codename/D
+codpiece/MS
+coeval/SY
+cogent/Y
+cogitation/M
+cognition/AMKS
+cognoscenti
+coil/USADG
+Cointreau
+coital/Y
+cold-bloodedness
+coldish
+coldness/S
+Cole/M
+coleus/MS
+collaborative/S
+collectible/S
+collegial
+colloquium/SM
+colloquy/Mo
+coloratura/SM
+Colosseum
+colostomy/SM
+colour-code/D
+comae
+combat/vVu
+combed/U
+combustibility/SM
+come/RIGJS
+comedian/SM
+comfortableness/S
+comfy/T
+commemorate/NDvSVGn
+commemorator/S
+commercial/qQ8S-
+commercialness
+commiserate/VNnDGS
+commission/CRDSG
+commonly/U
+commonplace/P
+commons/M
+common-sense
+communicability/SM
+communicable/I
+communicated/a
+companion/DG7lMS
+compendia
+compensated/U
+compensator/M
+complainant/SM
+compliance/SM
+complicator/MS
+composition/CM
+comprehension/IMS
+comprehensiveness/S
+compress/XvNVhxb
+computed/AK
+computing/A
+concede/Rh
+conceiver/M
+conceptuality/M
+concerto/SM
+conchs
+conciliar
+conclusion/M
+concordant/Y
+concrete/GPYNDSnM
+concubinage/SM
+concupiscent
+concussion/M
+condescend/NXk
+conditionally/U
+condition's/K
+condolence/MS
+conducive/P
+conductance/4
+conductibility/MS
+conductor/SM
+conductress/MS
+coney's
+confabulation/M
+confederate/M
+conferee/MS
+confidential/PY
+confiner/M
+confirmed/PY
+conflagration/SM
+confrère/SM
+confront/NRnx
+Confucian
+confusable
+confutation/M
+confuter/M
+congested/U
+congregate/GNnSD
+conjugacy
+conjugateness
+conjunctive/S
+conjuration/M
+connectivity/SM
+consent/SRGkD
+conservative/PS
+consigns/A
+consist/SGD
+consistent/IY
+console/RNkn7
+consonance/IM
+conspiracy/SM
+constant/IY
+constellation/MS
+constituency/MS
+constitute/DASG
+consulship/SM
+consultees'
+consumable/S
+consumer/3
+consummated/U
+consumptive/S
+contaminate/NVGDnS
+contamination/MCS
+contemporaneous/PY
+contemptible/Y
+continence/IMS
+contort/VDG
+contradict/SGyD
+contralto/SM
+contrapositive/S
+contrapuntal/Y
+contrariwise
+controllability/M
+convenient/YI
+conventionalist
+conversant/Y
+conversazione/M
+convert/RSbDG
+convex/Y
+conviction/MS
+convincing/UY
+convolution/C
+co-operant
+co-operative/SP
+cootie/MS
+copay/S
+coplanar
+Copland
+coprolite/M
+coralline
+Corbie
+cordage/MS
+cordon/dSM
+co-religionist
+Corfu/M
+corked/U
+cornfield/MS
+cornflour/M
+cornmeal
+corollary/SM
+coronary/S
+coroner/MS
+corps/SM
+Corrigan
+corruption's/I
+corsage/MS
+corset/dSM
+cortège/SM
+cortex/M
+Costa
+cotangent/SM
+Cotswold/M
+cottonwood/SM
+cottony
+Coulthard
+counsel/MDJGS
+countenancer/M
+counterargument/SM
+counter-espionage/SM
+counterforce/M
+counter-offensive/MS
+counter-revolution/ySM
+counter-revolutionary/MS
+counter-tenor/SM
+counterweight/GMSD
+counting/Ea
+counts/AaEf
+coupled/U
+courier/MGDS
+courtliness/S
+cove/RDGMS
+covenanter/M
+coverage/SM
+covetousness/S
+cow-pat/SM
+crackpot/MS
+crafter
+craftspeople
+craftspersons
+Cranfield/M
+craver/M
+craw/YSM
+crawl/SRDG
+crayfish/SGDM
+cream/ZDRS2zMG
+creamy/PT
+creativeness/S
+creator/SM
+credibly/I
+credo/MS
+creed/SM
+creedal
+crenelation/M
+creole/MS
+crêpey
+crept
+crescent/MS
+Crestview
+Crete
+criminology/3wMS
+crimson/SMd
+cringe/GSD
+criss
+critique/MGSD
+crochet/dJSZr
+crocodile/MS
+crocus/MS
+croissant/SM
+croquette/MS
+crossfire/MS
+crossing/MS
+crosspoint
+cross-sectional
+croûton/SM
+crowbait
+crowd/cSDG
+crowfeet
+crudeness/S
+crudités
+crumbly/TP
+crutch/SDGM
+crux/M
+crybaby/MS
+cryogenic/S
+cryptography/W1SM
+Cryptozoic
+crystalline/S
+cubic/S
+cubit/SM
+cul/DG
+cull/S
+Cullen/M
+culmination/M
+culpa/SM
+culpable/YP
+cultivable
+cultivatable
+cumbersomeness/S
+cumbrous
+cumin/SM
+Cummings
+cumulus/M
+cupboard/MS
+cupola/DSGM
+curatorships
+curiosity/SM
+curiousness/S
+curlew/SM
+curlicue/SDMG
+curly/PT
+Curran/M
+cursory/K
+curve/SZGDM
+cushy/T
+cussed/EF
+cutlery/MS
+cyanide/SMGD
+cyclohexanol
+cylinder/wS1M
+cynical
+cypher/dSM
+czarevitch/M
+dad/MZS
+daffodil/SM
+Daguerre
+dainty/TSYP
+dairyland
+dais/SZM
+Daley/M
+dam/MDGS
+damageable
+Darcy/M
+darkness/S
+Darlene
+darling/PMS
+darnedest
+Daryl/M
+database/DMGS
+daughter/YMS
+daughters-in-law
+Davie
+daycare/S
+day-to-day
+daze/DiSGh
+DCB
+deaconess/SM
+deadbolt/S
+deadlock/MGSD
+deafening/M
+dean/MGD
+deanery/SM
+Dearing/M
+death-knell
+deathless/Y
+death-toll/M
+debauchery/SM
+debilitation/M
+debonair/PY
+Debussy/M
+decade/SM
+decadent/Y
+December/SM
+decilitre/MS
+decimetre/MS
+decision-making
+declarator/SM
+déclassée
+decomposable/I
+decoration/ASM
+decorative/P
+dedication/M
+dedicator/MS
+deejay/GDSM
+deep/TPYS
+deep-frozen
+deep-rooted
+defend/Vuv
+define/KSDAG
+definitive/SP
+deform/xnR7GN
+deformity/SM
+deftness/S
+DeKalb
+delegable
+delete/NDnSG
+deletion/M
+deliberateness/S
+delightful/P
+delinquent/YSM
+delirious/PY
+delusion/M
+delve/RSDG
+demeanour
+démodé
+demonology/M
+demonstrativeness/MS
+demureness/S
+denominate/x
+densitometry/M
+dentist/MSy
+deny/DR7kGS
+deoxyribonucleic
+department/o
+departure/SM
+dépaysé
+dependability/MS
+dependable/P
+deplorer/M
+depraved/P
+depressant/S
+depressor/MS
+derision/M
+dermatitis/MS
+derogation/M
+Derry
+descendent
+description/M
+descriptor/SM
+desertification
+designation/M
+desire/BRl
+Desmond/M
+desolation/M
+despatch/GDS
+despondence/SZ
+destructible/I
+desultory/YP
+detach/GRSiLhD7
+detected/U
+detector/SM
+deterioration/M
+determinacy/I
+determinant/MS
+determined/P
+determiner/KMS
+detonated/U
+detox/SGD
+detritus/M
+Deutsch
+devastate/DNSnkVG
+devastation/M
+deviance/MSZ
+deviation/M
+devilish/PY
+devious/YP
+Dewey
+dewy/TP
+Dhaka/M
+dhoti/MS
+diabetes/M
+diagnose/DGaS
+diagnosis/a
+dialect/wWSo1M
+diam
+diarrhoea/SMW
+diaspora
+dice/DnSGN
+dichotomous/Y
+Dictaphone
+didactic/SY
+didactics/M
+Diderot
+Dido/M
+differ/Sd
+diffidence/MS
+digestibility/SM
+digit/q-s9SQ8M
+dignified/U
+digraph/SM
+digress/uNvDSGXV
+diktat/SM
+dilemma/SM
+dimension/DGpMoS
+diminuendo/MS
+dinghy/MS
+dioptre/SM
+dioxide/SM
+dioxin/S
+diplomat/3MS
+dipstick/MS
+dirndl/SM
+disbursal/S
+disciplinary
+disclaim/7
+discothèque/MS
+discreet/PIY
+discuss/N7X
+disfigure/L
+dishcloth/MS
+disillusion/LDG
+disinterested/P
+Disneyland
+dispersive/P
+dispirited/Y
+disputably/I
+disputant/MS
+disruptor/M
+dissent/RGDS
+dissoluble/I
+dissolve/AGDS
+dissolved/U
+distastefulness/S
+distend/XN
+distillation/M
+distraught/Y
+distributable
+distribution/ASM
+distributional
+disturbed/U
+diva/SM
+divalent/S
+divergence/MS
+divers/NX
+diversion/My
+dividable
+divisiveness/S
+dobbin/MS
+documentation/M
+dodder/dSZ
+dodecahedra
+dodgy/T
+dog-clutch
+dog-collar/SM
+dogged/P
+dogmatics's
+dogs/f
+doing/aS
+domain/MS
+dominate/KNDSG
+Dominica/M
+Dominican/SM
+don't
+dopa/SM
+Dorian
+dork/ZS
+dormancy/SM
+dormitory/SM
+Dorset/M
+doss-house
+dot/M2ZdDkrGS
+double-glazed
+doubleness
+doubles/A
+doubloon/MS
+dowager/MS
+dowel/DSGM
+downfall/SM
+downplay/DGS
+downrange
+dozer/M
+drabness/S
+dragger/M
+drainage/SM
+draining-board/SM
+drainpipe/MS
+dram/w1SMW
+dramatics/M
+drape/RSDGy
+draughtsperson
+drawback/SM
+drawee/MS
+draws/ecA
+dreamland/SM
+dressy/TP
+drip-dry
+drizzle/GDSMkY
+drogue/MS
+dromedary/SM
+drudge/kyMSDG
+drumstick/SM
+Dryden
+duchy/MS
+duck/GDZSMJ
+duct/CDISGF
+due/MoPS
+duel/RMDGJS
+dugout/SM
+dumbfound/SGD
+Dumont
+dump/DR2GZS
+dun/TDGS
+dunce/SM
+dunderhead/SM
+durability/SM
+Durex
+dustiness/S
+duxes
+dwelling/M
+dwindle/SGD
+dybbuk/SM
+dyeing/M
+dyke/SM
+dyslexia/SM
+dyspepsia/SM
+dyspeptic/S
+earache/MS
+earnestness/S
+earning/M
+earthquake/MS
+earth-shattering
+ease/EDMSG
+EastEnders
+easterly/S
+eavesdrop/RDSG
+ebb/GDS
+eccentric/MSY
+Echinodermata
+éclat/M
+ectopic
+ecumenical/Y
+edge/DZMGRpSJ
+Edgewood
+edict/SM
+edifice/SM
+Edison
+editor/FMS
+Eduard
+educ/nNxV
+educated/cfU
+educe/DNG7S
+effendi/SM
+effeteness/S
+efflorescence/SM
+effrontery/MS
+effulgence/MS
+Egerton
+eggplant/SM
+egocentric/YS
+egregious/YP
+egret/SM
+Egyptian/S
+Egyptology
+eiderdown/SM
+eigenvector/MS
+eighty-seven/H
+eighty-three/H
+eisteddfodau
+elaborateness/S
+elastic/SQ8Y
+Elba
+elbowroom/MS
+elder/SY
+elected/U
+election/SM
+electrical/P
+electrocardiograph/MSZ
+electrolyse/GWSD
+electrolysis/M
+electromyographic/Y
+electron/SW1M
+electronegative
+electroweak
+elegance/ISM
+elephantiasis/M
+Elgar/M
+eliminate/SVnNDG
+eliteness
+elixir/MS
+Elmsford
+elongate/GnSND
+Elroy
+elsewhere
+elude/DuVGvS
+elution/M
+elver/MS
+Elysée/M
+Elysium
+em/M
+embank/GLSD
+embarcadero
+embassy/MS
+embed/SDGJ
+embedder
+embellished/U
+embellisher/M
+emeriti
+Emerson
+Emilio/M
+Emory
+emotionalism/SM
+emperor/MS
+empiricism/MS
+empiricist
+employed/fUA
+employing/A
+employs/A
+empress/SM
+empty/SGDTP
+emu/MS
+emulate/nDVGSvN
+encase/GDLS
+enchain/DGS
+encipher/Sd
+enclosure/MS
+encomium/SM
+encyst/GLDS
+endocrine/S
+endorphins
+enduring/P
+enforcible/U
+Englander/S
+engraving/M
+Enid/M
+enjambment/MS
+enlightened/U
+enliven/LSd
+enormous/PY
+enshroud/SDG
+entente/MS
+entomb/DLGS
+enunciable
+enunciate/GSnDN
+environ/LdS
+environmental/3
+Ephesus
+epic/MSY
+epigenetic
+epinephrine/SM
+Epping
+equipage/SM
+equipped/UA
+equiv
+era/MS
+erasure/SM
+ergo
+Eric/M
+Eriksson/M
+erode/VDuNGxXSb
+erosive/P
+escadrille/M
+espionage/SM
+espousal/MS
+Essex/M
+Esterházy/M
+etch/RGSDJ
+ethanol/M
+ether/MQ8S
+Ethernet/MS
+ethnocentric
+ethylene/M
+Etruscan
+ETSI
+euphemism/SM
+euphoria/MS
+Euphrates
+eureka/S
+Europe/M
+euthanasia/SM
+evadable
+evangelic/Y
+Evangeline
+evenly/U
+evensong/MS
+eventfulness/S
+everyday/P
+evict/SGD
+evolute/SM
+exact/PSGYTDk
+exactitude/ISM
+exactness/IS
+example/MDGS
+exceptionable/U
+exceptional/UY
+excretory/S
+exculpate/SDNnyG
+excusable/IP
+excuse/RlGDS
+executive/MS
+exempt/DGS
+exertion/SMc
+exhaustible/I
+exhortation/M
+exigency/SM
+existent/F
+Exmoor/M
+exocrine
+exogamy/M
+exonerate/nSNVDG
+exotica
+expand/BDRXVNvGSu
+expediently/I
+expel/DSn7GN
+expended/U
+expender/M
+expenditure/MS
+expensiveness/IS
+explain/AGDS
+explanation/SM
+explicable/I
+exploit/RVM7GnDS
+expressibility/I
+expression/Mp
+expurgate/SDNGn
+extemporaneous/YP
+extempore/Qs89q-S
+extendedness/M
+extinct/V
+extort/GDVS
+extracellular/Y
+extra-curricular
+extramarital
+extraordinary/PYS
+extrasolar
+extraterrestrial/S
+extraterritoriality/SM
+extravaganza/MS
+extremeness/S
+extremism/MS
+extrusion/M
+exurbia/SM
+eyedropper/MS
+eye-level
+Ezra
+fable/MSDG
+face/CGKDASe
+faceless
+facelift
+face's/K
+face-saver
+facetiousness/S
+facilitate/yDGSNnV
+facing/MS
+facsimileing
+factionalism/SM
+facto
+factorial/SM
+Fagin
+Fairfax
+fair-weather
+fairy/MS
+Falkner
+fallibility/ISM
+fallible/PY
+fall's/ce
+falsify/RBGnDSN
+falter/rJdSk
+falutin
+fanatical/P
+fantasy/Q8Ws9DSGM
+fanzine/S
+farina/MS
+farmworker/S
+far-reaching
+fascicle/DSM
+fast-forward
+fatalism/MS
+fathom/7dMpS
+fathomable/U
+fatuity/SM
+fault-finding
+faultless/YP
+faulty/PTY
+faun/SM
+feathered/U
+feather-edge
+featherweight/SM
+feckless/YP
+fecund/ng
+fecundity/SM
+federalist
+feeding/M
+felicitously/I
+Felipe
+felony/SM
+felt-tip/S
+feminism/MS
+fences/C
+Fermanagh/M
+ferret/rdSM
+ferrite/M
+ferrule/DMSG
+ferryboat/MS
+fetlock/MS
+feud/DMSoG
+feudalism/SM
+fiat/MS
+fibrosis/M
+Fidel/M
+Fife/M
+fifty-twofold
+fightback
+fights/e
+fill/JDRYGS7
+filter-tipped
+filthiness/S
+finance/ASGD
+find/JRGS7
+fineness/SM
+finger/prdSMJ
+fingerprint/DGSM
+fingertip/MS
+finial/SM
+finite/CPYI
+finny/T
+fiord/MS
+fireplace/MS
+Firestone
+fire-storm/MS
+firewood/M
+fish-bowl/MS
+fished/c
+fisher/m
+fishmonger/SM
+fishy/PT
+fist/DMGS6
+fixity/MS
+flabby/TP
+flack/SDMG
+flagrant/Y
+flaker/M
+flaky/T
+flambé/GSD
+flame/pGZRSMDkJ
+flamen/M
+flammable/IS
+flapjack/MS
+flash-pan
+flattop/SM
+flawlessness/S
+flea/MS
+fleabites
+fleawort/M
+fleetingly/M
+fleshly/T
+flexibility/MIS
+flightpath
+flights/c
+flinty/TP
+flirtation/M
+floodlight/GSM
+floorspace
+florescence/MIS
+florist/SM
+floweriness/S
+flowstone
+fluency/SM
+fluoroscope/SGDMW
+flush/7DPTGS
+fly-fishing
+flywheel/MS
+foamer
+foamy/TP
+fo'c'sle
+focus/CdGDAS
+focusable
+focus's
+foeticide
+fogydom
+fogyish
+foldaway
+folklore/3WSM
+folly/MS
+fondle/GDS
+fondler/M
+Fontaine/M
+fool/GDMS
+footman/M
+footprint/SM
+footsie/MS
+forbidding/PY
+forced/U
+forcer/M
+foreclosure/MS
+forefront/MS
+forehead/SM
+foreknow/SG
+foreknown
+forensics/M
+forequarters
+forerunner/MS
+foresaw
+foreword/SM
+forfeit/DRMSG
+forgave
+forget-me-not/S
+forging/MS
+formality/SMI
+formate/MS
+formulate/DAGSNn
+formulated/U
+Forster
+forswear/GS
+forthwith
+fortified/U
+fortissimo/S
+forty-onefold
+forty-three/H
+forum/MS
+Foss
+foster/dS
+fought/e
+founded/FU
+Fourier/M
+four-leaved
+four-square
+fox/MDzZG2S
+foxhound/MS
+fr
+Francesca
+franchiser/SM
+Françoise/M
+Frankfurt
+frankness/S
+fraud's
+Freddie
+Fredrick
+free-born
+freedmen/M
+freemasonry
+Freeport
+freight/SMRDG
+Frentzen
+fresh-faced
+Freud/M
+friction/oMSp
+friend/DGYMpS
+frieze/MGSD
+frigate/SM
+fright/DGMjS6
+frighteners
+frigidity/SM
+Frisian
+frisk/ZGSDz2
+frivolity/SM
+frivolousness/S
+fronter/F
+frothy/TP
+frown/DGSk
+frowner/M
+frumpy/T
+fulcrum/SM
+fulfilled/U
+fulfiller
+Fullerton
+full-length
+fulsome/YP
+fume/GkDZS
+fundamentalist
+fundholding
+fund-raiser/SM
+funeral/MS
+fur/GM2JZSD
+furl/UGDS
+furring/M
+furtherance/SM
+fuselage/SM
+fuses/CA
+fusilier/SM
+fusspot/SM
+futurist/W
+fuzzy/TP
+gaberdine/M
+gadabout/MS
+Gail
+galen
+galley/MS
+gallstone/MS
+galvanic
+gamesmen
+Ganges
+gantry/MS
+gaper/M
+Garfunkel/M
+garnish/LSDG
+garnishee/GMS
+gas/FC
+gasoline/M
+gasometer/M
+gastronomy/MWS
+gastropod/SM
+gasworks/M
+Gateshead/M
+gather/drSJ
+gaucherie/MS
+gavel/DSMG
+gawker
+gazillion/S
+gee-gee/SM
+geezer/MS
+gel/DMGS
+gelable
+Gemini
+gender/MSp
+gendered
+generate/AnVCGDSN
+generator/AMS
+generous/YP
+generously/U
+Genevieve/M
+genie/oSM
+genocidal
+genotype/MS
+genuflection/SM
+Geoff/M
+geomagnetic/Y
+geomagnetism/MS
+geophysical/Y
+geopolitic/YS
+George/SM
+Georgetown/M
+Georgian/S
+Gerald
+geranium/SM
+Gerard
+Gerber
+germination/M
+ghillie/MS
+ghostlike
+ghost-written
+giant/MS
+giantess/MS
+giber/M
+giddy/PGYTDS
+Gideon
+gigacycle/MS
+Gilbert/M
+gilt/S
+gimcrack/S
+gimp/DMGZS
+gin/MDSG
+ginkgoes
+girlfriend/SM
+giveth
+gizmo's
+glacé/DGS
+glacial/Y
+Gladys
+glasnost
+glean/DRSGJ
+Gleason
+Glenda
+Glendale
+glib/TPY
+gloaming/MS
+global/3Y
+globularity/M
+Gloria
+glossy/TSP
+glow/GRDkSM
+glycogen/MS
+Glyndebourne/M
+Glynn
+gnarl/GSMD
+gnat/MS
+gnomic
+gnu/MS
+goad/GDMS
+go-ahead
+goalie/MS
+goalpost/S
+go-between
+godchildren
+god-damn/D
+godhead/S
+Goering
+Goethe/M
+goitrous
+Golding
+gold-plated
+gonococcal
+good-humoured/Y
+good-looking
+good-natured/Y
+Goran
+Gordon/M
+gotten
+gourmandise
+gouty/T
+grâce
+graced/E
+graceless/YP
+gradate/DSG
+grade/nRCSDG
+gradient/SM
+gradualism/SM
+graduation/M
+graffiti
+grampus/MS
+grandniece/MS
+grant/DRMGS
+granulate/SDG
+granulocytic
+gratitude/SIM
+gravitation/M
+Grayson
+graze/RSGD
+greasepaint/SM
+greenery/SM
+greenfield
+greenfinch/SM
+greet/DRGSJ
+grenadier/SM
+gridiron/MS
+gridlock/DSG
+grimy/TP
+grin/DGS
+grind/RGJSk
+gristle/SM
+grittiness/S
+groat/MS
+groin/SMGD
+groom/SDGM
+Groot
+grotesqueness/S
+grovel/DSGR
+grub/zRMZ2DGS
+grudger/M
+grumble/GRJkSD
+GU
+guanine/SM
+Guardia
+guardianship/SM
+Guenther/M
+guerrillas
+guerrilla's
+guess/DRG7S
+guessed/e
+guildhall/SM
+guilefulness
+guilty/TP
+Guinea-Bissau/M
+Guinness
+gumboot/S
+gumption/SM
+Gunderson
+gunmen/M
+gunnery/SM
+gunning/M
+gunnysack/MS
+guppy/MS
+Gus
+gusset/SM
+gusts/E
+gut/MRGpDS
+Gwangju
+gym/MS
+gypsite
+gyroscope/SMW
+ha
+Haag/M
+habitable/P
+habitation/IMF
+habituation/M
+Hackett
+hadj's
+haem/SM
+haematoma/M
+haemolytic
+haemophiliac/SM
+Hague
+ha-ha
+haiku/M
+hair-drier
+hairless/P
+hairlike
+hair-raising
+halcyon/S
+half-deck
+half-hour/YS
+halfpence
+half-sister/SM
+half-sovereign
+halfwit/hiSMD
+halibut/M
+halite/MS
+hall/SM
+hallelujah/S
+Halley/M
+hallow/DGS
+Halloween
+hallucinate/nyNVGDS
+hallway/SM
+halter-neck
+halvers
+hammerhead/SM
+hammering/M
+hand/h6RzZSipMGD2
+handbill/SM
+handedly/f
+handful/MS
+handgun/MS
+handling/M
+handstand/SM
+hangnail/SM
+hanker/Jd
+hankerer/M
+Hanoverian
+Hansen
+ha'penny
+haphazardness/S
+haplessness/S
+harbourage
+hard-line/R
+hardshell
+hardy/TP
+harken/S
+harlotry/SM
+harpsichord/M3S
+Harrison
+Harrisonburg
+harshen/d
+harvest/MRGDS
+harvestmen/M
+hassock/MS
+hast/zZ2D
+hatchet/dMS
+hatchway/MS
+hatefulness/S
+haughty/YPT
+haul/cDSG
+have-not/MS
+havoc/SDMG
+Hawaiian/S
+hawkishness/S
+headmen/M
+headteacher/SM
+headway/SM
+health/M6jzS2Z
+healthcare
+hearing/SM
+hearsay/SM
+heartburn/GSM
+heartlessness/S
+heartstrings
+heath/RSyM
+Heathkit
+heaven/MSY
+Hebrew/SM
+heck
+hectogram/SM
+hedonist/WMS
+heel/pRSGMD
+Heidfeld
+Helena/M
+helix/M
+hellebore/SM
+Hellenic
+helpfulness/U
+helplessness/S
+Helsinki/M
+hemp/SM
+hen/yMS
+Henley/M
+Hennessey/M
+Henri/M
+herald/WGSMDy
+herbalist
+Herbert/M
+here/FI
+hereabout/S
+herein
+heretofore
+heritable/I
+Hermes
+Hertfordshire/M
+hesitance/ZS
+heterosexual/MYS
+Hettie/M
+Heuser/M
+hew/RGSD
+Hewett/M
+hexagram/SM
+heyday/MS
+hgwy
+Hiawatha
+hiccough
+hideaway/MS
+hideout/MS
+hieroglyph/SW
+high-hat
+high-jump
+highland/RSM
+high-spiritedness
+high-stepper
+hike/RSGD
+Hilbert
+hilliness/S
+Hinckley
+Hindemith
+Hindi
+hindsight/SM
+Hinduism
+hint/RSGMD
+hip/TZMDSG
+hipbone/SM
+hiring/S
+Hirsch
+histology/3MSw
+historian/SM
+history/SK1MW
+histrionic/SY
+histrionics/M
+hitch/RDSG
+HIV
+hoard/MSRDJG
+hobgoblin/SM
+Hoff/M
+hogback/SM
+hoist/SDG
+hold/RSGJ7
+Holden
+Holstein
+homecoming/SM
+homeland/MS
+home-making/M
+homesickness/S
+homiletic/S
+homoeotherm/ZW
+homogamy/M
+homogeneousness
+homogenize/DRGnSN
+Hondo
+hone/STGDM
+honester
+honey/SMD
+hooded/P
+hoofer/M
+hookup/MS
+horned/P
+horse-trading
+horsier
+horsing/M
+hos/Sd
+ho's/F
+hospitably/I
+hostility/MS
+hotness/S
+hounding/M
+houseboy/MS
+housebreak/SRJG
+house's/e
+house-to-house
+house-warming/SM
+Hove/M
+hover/dS
+hovercraft/M
+Hoyt/M
+HQ
+Huffman/M
+huffy/TP
+Huguenot/SM
+Hull/M
+hum/RSDG
+human/sQ8Y3-q9PS
+humaneness/I
+humanist/W
+humanize/CRDnSNG
+humanly/I
+humerus/M
+humidification/CM
+Hummel/M
+humorousness/S
+Hungary/M
+Huntley/M
+hurriedness/M
+hurter/M
+husband/DYyGSM
+hussy/SM
+hybridism/MS
+Hyderabad
+hydrangea/MS
+hydrochloride/M
+hydrogenates/C
+hydrostatics/M
+Hyman
+hymnal/MS
+hyperbola/MS
+hyperboloidal
+hyperplane/MS
+hypertrophy/DGSM
+hypotenuse/SM
+hypothalami
+hypotheses
+hysterectomy/SM
+Hyundai/M
+ICC/M
+icebox/SM
+icicle/SM
+iconoclasm/MS
+iconography/WMS
+ICU
+Ida/M
+idealist/W1
+idealogical
+identical/PY
+idiocy/SM
+idiomatic/U
+idolatress/S
+idyllist
+if/FS
+ignitable
+ignorance/SM
+iguana/SM
+iii
+Ikea/M
+ill-behaved
+ill-defined
+ill-equipped
+ill-tempered
+illume/GD
+illuminable
+illustrate/NnGDvSV
+illustration/M
+illustrious/YP
+ilmenite
+imaginably/U
+imagine/lnSVuNJDvG
+imaginer/M
+imbibe/RSDG
+immanency/SM
+immensity/SM
+immerse/SNbDGX
+immerser
+immolate/DGnSN
+immortal/Q8
+imped/d
+impeder/M
+imperial/3SY
+imperturbability/MS
+impetuous/PY
+impishness/S
+impresario/MS
+imprint/M
+imprison/L
+improver/M
+impudent/Y
+inalterableness
+inappropriate/P
+inbound
+in-car
+incarnadine/DSG
+inception/MS
+incipience/MSZ
+incise/XVGvDNSu
+incommode/GD
+inconceivability/SM
+inconceivable/P
+incontrovertible/Y
+incorporated/EU
+increase/Jk
+incriminate/SDNnyG
+incubation/M
+indemnity/MS
+indentation/M
+indication/M
+indicator/MS
+indices/M
+indigent/YS
+indissoluble/YP
+indistinct/P
+indistinguishable/P
+indoctrination/M
+industrialist
+industriousness/S
+inebriation/M
+ineffable/PY
+inertness/S
+inexplicable/PY
+inexplicit
+infantry/mMS
+infatuate/DSGnN
+inferential/Y
+inflate/DSGNn
+inflated/c
+inflater/M
+inflect/GxSVD
+in-flight
+infraction
+infrastructural
+ingenuously/E
+ingot/SM
+ingratiate/nGDSkN
+inhibit/SVdyXN
+inhibitor/MS
+in-house
+initialised/U
+initialized/U
+injunctive
+inlay/GS
+innermost
+innovate/NVnGuDSyv
+innovation/M
+innovator/SM
+inoculate/VGNDSn
+inordinate/YP
+inquisitive/PY
+inscribe/RNX
+insert/DGAS
+insidiousness/S
+insinuate/DGknNSV
+insolence/SM
+insolent/Y
+insomnia/SM
+inspired/U
+inspirer/M
+instanter
+instigate/SVnDNG
+instituted/A
+insult/DGkS
+insupportable/P
+insurrectionist
+intensiveness/S
+intention/DSoM
+intentionality/M
+interaction/SM
+intercept/GSD
+intercessor/SM
+interchange/SlGBD
+interfacing/M
+interfere/kRSGD
+intergeneration/oM
+interject/xGSD
+intermarry/SGD
+intermezzi
+intermodule/Nn
+internationalism/MS
+interplanetary
+interplay/MGDS
+interposition/M
+interpret/daNAnS
+interprocess
+intersect/GSD
+interstate/S
+intersurvey
+interurban/S
+intervocalic
+intimidation/M
+intradepartmental
+in-tray/S
+intrude/RuNXSDGVv
+intrusiveness/S
+inure/GDS
+invective/YPMS
+inventiveness/S
+inventress/MS
+invincible/PY
+inviting/U
+invokable
+involve/LGhSD
+iodide/MS
+ion's/U
+Irani
+Ireland/M
+iridescent/Y
+Irishwomen/M
+irksome/PY
+Irma
+ironer/S
+ironwood's
+ironworker/M
+irrepressible/Y
+irrigable
+Irvine
+Irwin/M
+Isaacson
+Isis
+Islamabad/M
+Islamic
+island/RSM
+Islay/M
+Islington/M
+isn't
+isocline/M
+isopleth/SM
+Italian/SM
+Ithacan
+its
+ix
+jackknife/DGMS
+Jacqueline
+Jaeger/M
+jag/ZDhGiS
+jaggy/T
+Jaipur
+Jakarta
+Jamaican/S
+Jameson
+janitorial
+Jardine
+jasper/MS
+javelin/MS
+jawline
+jay/MS
+jazz/S2GMDZ
+Jeanie
+Jehoshaphat
+Jesse/M
+jetty/MS
+jib/DMGS
+jihad/MS
+jingoist/WSM
+Joanne/M
+Joaquin
+jock/MS
+John/S
+johnny/SM
+join/FRSDG
+joins/A
+jointures
+jolt/DSRG
+Jonathan
+Jorge
+Jorgenson
+Joshua/M
+joss/M
+jowl/YSM
+joyless/PY
+Juanita
+jubilant/Y
+judgemental
+juicy/YPT
+julep/SM
+jump-start/G
+juncture/FMS
+jungle/SM
+junket/SdM
+junta/MS
+jurist/W
+juster/M
+juvenile/SM
+kaiser/SM
+Kano
+kappa/M
+katydid/MS
+kcal/M
+Kearney
+Keats/M
+keener/M
+keening/M
+keepsake/MS
+Keith
+Kendal
+Kenyan/S
+Kepler/M
+kerb/SM
+kerchief/SDM
+kerned
+keyclick/MS
+keyhole/SM
+kg
+Khmer
+kickballs
+kicky/T
+kid/RDMSGp
+kiddish
+Kiev/M
+kif-gloves
+Kilimanjaro/M
+killjoy/S
+kills/c
+kilowatt-hour
+Kimberly/M
+kinda
+kindness/S
+Kingsbury
+Kiowa
+Kirby
+Kirkpatrick
+Kitakyushu/M
+kitbag/M
+kitsch/ZSM
+kittiwakes
+Klondike
+knack/SRM
+kneecap/SGMD
+knick-knackery
+knight/GMDYS
+knit/RGSDJ
+knitting/M
+knotty/TP
+know/GJk7S
+knowing/T
+knowledge/SlM
+Knowles
+Kodachrome/M
+kola/SM
+Kong
+kook's
+kooky/T
+Kremlin/M
+Kronecker/M
+Kuenning/M
+kumquat/SM
+KwaZulu
+l/3
+lab/oMS
+label/aGDSA
+labiodental
+laboratory/SM
+laburnum/MS
+labyrinth/SM
+laceration/M
+lachrymose
+lackadaisicalness
+lactation/M
+lacunae
+laddie/MS
+ladybug/SM
+laevorotatory
+Lamaism
+Lamellibranchia
+lamina/Mn
+laminate/DGS
+Lancaster/M
+Lancelot/M
+landforms
+land-use
+lantern/MS
+Laos/M
+laps/SGD
+lapse's
+larboard/SM
+larcenist/S
+larcenous
+larceny/SM
+lark/MGDS
+larkspur/SM
+lasciviousness/S
+latching/M
+latticing/M
+Latvia/M
+laudanum/MS
+lauds/M
+laughable/P
+Launceston
+lavatory/SM
+lawgiver/SM
+lawlessness/S
+lawmaking/M
+lawnmower/S
+lawrencium/M
+layette/SM
+laying/ca
+lays/faAec
+Lazar
+Lazarus
+lazybones/M
+leading/a
+leaf/pSD2GMZ
+leafstalk/MS
+leasing/M
+Leatherdale
+leavening/M
+Leavenworth
+lectureship/SM
+led/a
+lefty/S3M
+legally/I
+legislator/MS
+legitimately/I
+legitimating/I
+legitimization/M
+Leiden
+Leif
+Leigh
+Lenten
+leper/SM
+lettered/U
+level/SDTPRGY
+Lewes
+lexeme/MS
+Libby/M
+liberalism/MS
+libertarian/SM
+libertarianism/M
+Libra
+Libya/M
+lichen/SM
+Lieberman/M
+lieder
+lifetaking
+light-heartedness/S
+lignite/SM
+liking/MS
+limb/SDMWp
+limestone/MS
+limpid/YP
+Limpopo
+Lin/M
+Lindbergh/M
+linen/SM
+lines/eAf
+ling/f
+lingua/Mo
+linguini's
+linkage/SM
+linseed/MS
+lionizer/M
+lip-synch
+liquefy/DRSG
+liqueur/MS
+liquorish
+Lisa
+listed/U
+listing/M
+literalism/M
+lithology/Mw
+Lithuania/M
+litigiousness/S
+litre/SM
+little/TP
+liturgics's
+livelong/S
+liverwurst's
+ll/C
+loads/AUc
+loansharkings
+loathsomeness/S
+loaves/M
+loci/M
+Locke
+locks/UA
+lode/MS
+lodestar/SM
+Logan
+logia
+login/S
+Loki/M
+loneliness/S
+lonesomeness/S
+long-ago
+long-distance
+longhair/SM
+longing/M
+long-lived
+long-range
+long-time
+loose-leaf
+Lorraine
+lotto/SM
+loudspeaker/SM
+Loughborough/M
+Louisa/M
+lour/SDG
+louse/CDSG
+love/pMk7RSYlDG
+loveless/PY
+Lowell
+lowliness/S
+loyalty/ESM
+Lucia/M
+Lucretia
+Ludwig
+luge/CM
+lukewarm/PY
+lull/GSD
+lulu/M
+luminance/M
+luminescence/MS
+luminous/YP
+lumpish/YP
+luncheonette/MS
+luncher/M
+lunger/M
+lupus/MS
+lust/GZSDjz62M
+lye/M
+lymphatic/S
+lyre/MSwW1
+Mabel/M
+Macedon
+Macedonia/M
+macintosh/SM
+MacIntyre
+Mackenzie
+Mackie
+Macmillan/M
+macramé/S
+macro/SM
+macrosimulation
+mad/RTYPGD
+madden/dkS
+madhouse/MS
+Magellan
+magi
+magisterial/Y
+magnanimous/Y
+magnetic/S
+magnolia/SM
+maidenhead/SM
+maidenliness
+Maier
+mainstreamer
+major/MS
+making/MS
+Malagasy/M
+maleficence/SM
+maleness/S
+mallard/SM
+Mallory
+malnutrition/SM
+malocclusion/MS
+Malta/M
+Mammalia
+mammography/S
+mandate/SMGyD
+manège/SGD
+Manhattan/M
+manhole/SM
+manikin/MS
+manoeuvres/e
+mansard/MS
+mantilla/MS
+mantis/MS
+manure/RMGDS
+manuscript/MS
+man-year/S
+Maoism
+mapping/M
+maraca/MS
+margin/oMdS
+mariachi's
+marijuana/SM
+Marin
+marina/nMS
+Marjory/M
+marketability/MS
+marketable/U
+Marlowe/M
+Marquess/M
+marriage/MBS
+marrow/MS
+marsupial/MS
+Martel
+marten/MS
+Marvin
+Marx/3M
+marzipan/SM
+Masai
+master-work/S
+matchlock/MS
+matchplay
+matchwood/SM
+maternal/Y
+mating/M
+matriarchs
+matron/MSY
+matt/M
+matter/d
+maturely/KI
+maturity/KMI
+Maurice
+maverick/MS
+Mavis
+maxilla/yM
+maze/SZMGD
+McCracken/M
+McDonald/M
+McDowell/M
+McGill/M
+McGovern/M
+McGregor/M
+McKesson/M
+McLeod/M
+McMahon/M
+McNeil/M
+mealtime/MS
+mealy/TPS
+mean/CSG
+meanest
+meaninglessness/S
+measurement/A
+mechanism/MS
+mechanochemically
+media/oMn
+mediaevalism
+mediaevalist
+medicament/SM
+medication/M
+meditative/P
+megacycle/MS
+megalith/SWM
+Meister
+melamine/MS
+Melanesian
+Melbourne
+melted/A
+melts/A
+Melvyn
+memorable/PY
+memoriam
+mendacity/MS
+mendicancy/MS
+mendicant/S
+mending/SM
+Mendip
+menopause/SM
+menstrual/K
+menswear/M
+mentality/MS
+menthol/MS
+merchant/BSM
+merchantman/M
+mercilessness/S
+merited/U
+mescal/SM
+mesdames/M
+mesdemoiselles/M
+meta
+metabolism/SM
+metabolize
+metacarpus/M
+metastable
+metempsychoses
+meteor/WS1M
+Metford
+method/1SMw
+metre/S1Ww
+mettlesome
+Mexican/S
+MGM
+miasma/MS
+mice/M
+Michelson
+micra's
+microdensitometer
+microdot/SM
+microelectronic/S
+microfossils
+microlevel
+micrometeorite/SWM
+microprocessing
+microscope/SMWw1Z
+Microsoft/M
+microstore
+mid-band/M
+midfield/M
+Midlands
+mid-life
+milch/M
+mile/SM
+Millie
+millimetre/S
+milliner/ZSM
+millisecond/SM
+Milne
+mimesis/M
+mindless/YP
+mindset/S
+Minerva
+minesweeper/SM
+minimax/M
+minnow/MS
+minor/SM
+Minotaur/M
+Minsk/MZ
+minuscule/SM
+minutia/M
+minx/MS
+mischance
+misfeasance/SM
+mislay
+misprision/SM
+missive/4
+Missouri
+misty/T
+mistype/J
+misunderstand/R
+mizzen/SM
+mizzenmast/MS
+mnemonic/YMS
+mob/CSDG
+moccasin/MS
+mockery/SM
+modification/M
+modulation/MCS
+moduli
+Moen/M
+mogul/MS
+molal
+molecular/Y
+molecule/MS
+mollycoddle/SGD
+molybdenite/M
+momenta/y
+momentary/PY
+mom's
+moneymaker/MS
+mongoloid/S
+monodist/S
+monody/MWS
+monolingualism
+monopoly/SM
+monotone/WMS1Z
+Montclair
+Monza
+mooch/RGDS
+moon/DSpMG
+moorland/SM
+moped/MS
+moppet/SM
+Moran/M
+Moray/M
+Mordecai
+morning/M
+Morpeth
+morphophonemics/M
+morris
+mortality/IMS
+Moslem/M
+motel/MS
+motherhood/MS
+motionless/Y
+motorboat/MS
+motorway/MS
+mouldiness/S
+mound/MDGS
+mountaintop/MS
+mounted/U
+Moussorgsky/M
+moustache/MDS
+Moyer/M
+Moyra/M
+Mozambican/S
+mpg
+MPV
+Ms
+much-needed
+muck/DGMZS
+mudslide/S
+mufti/SM
+mugginess/S
+mulatto/M
+Muller/M
+multi-access
+multichannel/M
+multicolumn
+multicomponent
+Multics/M
+multidimensionality
+multifunctional
+multilateral/Y
+multiplex's
+multi-purpose
+multiracial
+mumble/RSDGJ
+mumbo-jumbo
+Mumford/M
+Muse's
+mushy/TP
+Muslim/SM
+mutable/FI4
+mutest
+muttonchops
+muzzle-loader
+myrrh/MS
+mystic/YMS
+nabob/MS
+nacelle/MS
+Nagasaki/M
+nailer/M
+Nairobi/M
+naked/PY
+namby-pamby
+namelessness
+nanometre/SM
+naphthalene/SM
+narcosis/M
+Narragansett/M
+narrow-minded
+Nassau/M
+Nathalie/M
+naturally/U
+nature/ohMDS
+navvy/MS
+Nazi/SM
+N'Djamena/M
+Neanderthal/S
+near-sighted/PY
+near-sightedness/S
+necktie's
+necromantic
+necropsy/M
+necrotic
+needle/D5GRSM
+needy/TP
+Neely/M
+nefariousness/S
+neglectful/P
+neglectfulness/S
+negligée/SM
+negligent/Y
+neighbourliness/S
+neoclassic/M
+neocolonialism/SM
+neologism/MS
+Nepal/M
+nephrite/MWS
+Neptune/M
+nestle/DSG
+neural/Y
+neuritides
+neuritis/M
+neuroscience
+neurosurgeon/SM
+neutralise/M
+nevus's
+Newmarket/M
+newsflash/S
+newsroom/S
+news-stand/MS
+newsy/TS
+next
+NFS
+nicety/MS
+niche/GMSD
+Nicholson/M
+Nielson/M
+nightclothes
+nightdress/MS
+night-long
+nightmare/MS
+nightstand's
+night-watchman
+nimble/TPY
+Nina/M
+nine/SMH
+ninepence/M
+ninety-onefold
+Nintendo/M
+Nipponese
+nitrous
+nm
+Nobel/M
+nobelium/M
+Noble's
+nocturnal/S
+nocturne/SoM
+nod/oDMGZS
+nodule/MS
+nohow
+noire/S
+noiseless/YP
+Noll/M
+nominal/SY
+non-abrasive
+non-absorbent
+non-active
+non-athletic
+non-basic
+non-belligerency
+non-belligerent/S
+non-business
+nonchalant/Y
+non-compliance/MS
+non-conducting
+non-conductor/SM
+nonconformist/SM
+non-corrosive
+non-crystalline
+nondescript/YS
+non-disclosure/S
+non-dramatic
+non-exclusive
+non-functional/Y
+non-hereditary
+non-literary
+non-member/MS
+non-metal/SWM
+non-metropolitan
+non-military
+non-negative
+non-operational/Y
+non-orthogonal
+non-orthogonality
+non-partisan/S
+non-paying
+non-peak
+non-performance/SM
+non-porous
+non-recognition/S
+non-redeemable
+non-reducing
+non-representational/Y
+non-resident/SM
+non-residential
+non-scientific
+nonsense/1SMw
+non-sexist
+non-slip
+non-staining
+non-swimmer
+non-tenured
+non-union/S
+non-verbal/Y
+non-voter/SM
+noontide/SM
+noontime/SM
+noradrenalin
+noradrenaline/M
+normalizes/A
+north/MSG
+north-east/M
+northern/RS
+north-West/M
+notarial
+notation's/F
+noticeable/U
+Nottinghamshire/M
+nourished/fU
+nourishment/f
+nouveau
+novel/-MQ3S
+novena/MS
+Novocaine
+NT
+nuclear-free
+nucleation/M
+nudge/GSD
+Nugent/M
+nuke/SGMD
+numberplate/M
+numbers/Ae
+nursemaid/SM
+nutriment/MS
+nutritiousness/S
+nutshell/MS
+nuttiness/S
+nymphomaniac/S
+Oakland/M
+ob.
+obeyer/EM
+obfuscation/M
+objurgate/GSDnN
+obligation/M
+obliging/YP
+obliteration/M
+oblong/PS
+obnoxiousness/S
+oboist/S
+observability/M
+observe/BxkNRlnSDG
+obstacle/SM
+obstetric/S
+obstructer's
+O'Connor/M
+octavo/SM
+octennial
+odalisque/SM
+ode/MS
+Odis/M
+Odom/M
+oestrous
+off/RGMJ
+offhandedness/S
+officiation/M
+off-licence/MS
+ogress/S
+oil/m2RZGMSD
+oilcloth/SM
+Ojibwa/SM
+okra/MS
+oleaginous
+O'Leary/M
+oles
+oligarchs
+Olivia/M
+Olympian/S
+Omagh/M
+Oneida/SM
+one-off
+on-line
+onomatopoeia/MS
+Onondaga/SM
+ons
+on-screen
+ontology/1wMS
+onyx/SM
+oodles
+opalescence/S
+open-handedness/S
+open-plan
+opera/nSvuMV
+operate/DSGFN
+oppressive/P
+opprobrium/SM
+opt/1xwGWSD
+optimized/U
+opulence/MS
+or/NMn
+orderly/S
+ordination's/F
+oregano/SM
+organic/S
+orientation/EMA
+orient's
+originality/MS
+origination/M
+orneriness's
+orographic/M
+orography/WM
+Ortiz/M
+Orwell/M
+Osborn/M
+oscillation/M
+osmium/M
+ostensible/Y
+osteoarthritis/M
+osteoporoses
+ought
+oughtn't
+our/S
+overbuild/G
+overburden/k
+overflight
+overhand
+over-ride/GS
+over-the-counter
+over-the-top
+overtone
+oviform
+ownership/MS
+oxide/Q-nSMs
+oxymoron/M
+ozone-friendly
+paced/e
+pacesetting
+pacifist/W
+Packard/M
+packing/MS
+Paddington/M
+paediatrics/M
+pageboy/SM
+Pahaji
+paint/DRSGMJ
+painted/AU
+painter/Y
+paints/A
+pairwise
+palaeoecologist
+paled/I
+Paleozoic
+paler/I
+palfrey/SM
+palladia
+palliation/M
+palm/DMG3SZ
+palmist/y
+palpably/I
+palsy/DMSG
+pamphlet/SM
+panchromatic
+pancreatic
+pane/MDS
+panellist/MS
+panic/GMSZD
+panky
+panorama/MS
+pantechnicon
+pantihose
+pantiles
+pantomime/3SMDG
+pants/f
+paparazzi
+Papeete/M
+paperweight/SM
+parade/RMGDS
+paragliding
+paragon/MS
+paragraph/DMSG
+Paraguay/M
+paralegals
+paralyse/RShGWDk
+paramagnet/MW
+paramoecia
+paramoecium/M
+paraplegic/S
+parapsychologist/S
+parapsychology/SM
+parasitism/SM
+parasitology/M
+parenthesise/D
+parenthesize/D
+parenthetical
+paresis/M
+parimutuel/S
+parka/MS
+Parker/M
+parody/G3DMS
+paroxysmal
+parricide/MS
+parse
+partake/RSG
+partials
+particle/SM
+particularism
+partisan/MS
+parvenu/MS
+pas/GRDJ
+passable/I
+passband
+passé/M
+passée
+passes/IcFf
+passing/Fc
+passionate/FEY
+passiveness/SI
+password/SMD
+pastoralism
+past's/A
+patch/DESG
+patcher/EM
+patellate
+path/pSM
+pathlessness
+pathogenesis/M
+patio/MS
+patriarchate/MS
+Patrice
+patrol/MDGS
+pawn/SGDM
+pawnbroker/SM
+payee/MS
+PC/M
+peaceable/P
+peak/DM2SiGZ
+peat/ZSM
+peaty/T
+pebbly/T
+peccadilloes
+peccary/MS
+pedestal/DGMS
+pedology
+peeled/U
+peignoir/MS
+pell
+Pembrokeshire
+pencil/MGDJS
+pending
+Pendle
+pendulous
+penetrator/SM
+peninsular
+penitence/SIM
+penmanship/MS
+pen-name/S
+pentatonic
+perceiver/SM
+perchlorination
+percolation/M
+percutaneous/Y
+perdition/MS
+perfectibility/MS
+perfectionist/SM
+perfidy/SM
+perfusion/M
+Pericles
+perigee/MS
+perinatal
+peripatetic/S
+perjure/DRSGZ
+permalloy/M
+permeability/SIM
+permissiveness/S
+permittivity
+peroration/SM
+peroxidase/M
+persistent/Y
+person/7oSM
+personable/P
+perspicacious/YP
+peruse/DRGS
+pervasiveness/S
+perverseness/S
+pest/SM
+pesticide/SM
+pewit/SM
+phalanges
+pharynges
+phi/MS
+philology/M13wS
+philosopher/MS
+phlebotomy
+phlegm/SM
+phobic/S
+phoneme/MS1
+phoney
+phonics/M
+phosphoresce
+photoengraver/SM
+photogenic/Y
+photomicrograph/ZM
+photorealism
+physiology/WM1Sw3
+physiotherapist/SM
+picaresque
+pick/DRSGZJ
+pickerel/MS
+pictogram
+pictograph/SMW
+picture-writing
+pidgin/SM
+pie/MS
+piecemeal
+piezoelectric
+piggish/YP
+piggyback/GDS
+pikestaff/MS
+piling/MS
+pimento/SM
+pimp/YSDMG
+pimply/MT
+pin/MGdDJS
+pinkie
+pinkness/S
+pinna
+pinnace/SM
+piñon/S
+piousness/IS
+pipit/SM
+pippin/SM
+piss/DSG
+pit-a-pat
+Pitcairn
+pitman/M
+placed/aUA
+placekick/SGD
+placemen
+placket/SM
+plagiarism/SM
+plaice/M
+planarity
+plankton/MS
+planned/KU
+plant/IGSDA4
+plasterboard/SM
+plateful/S
+platen/MS
+plausible/IY
+play/eGADESacf
+playing/S
+playwriting/M
+plead/SDRGJk
+pleater/M
+plenipotentiary/S
+plethora/MS
+pliable/P
+pliancy/MS
+pliantness/M
+plughole
+plumage/SDM
+plumpness/S
+plutonium/M
+pneumatics/M
+pocketknife/M
+podgy/TP
+podiatry/3SM
+poikilothermic
+point-duty
+poisonousness
+polarimeter/SM
+polarise/CRnSGD
+pole/MDS
+poliomyelitides
+polish/RDJGS
+poltergeist/SM
+polyandrous
+polyether/S
+polygynous
+polyhedron/SM
+polyisocyanates
+polymorphic
+polyphony/SMW
+polystyrene/MS
+polytopes
+polyunsaturated
+polyunsaturates
+polyurethane/SM
+polyvinyl/M
+pomposity/SM
+poorhouse/MS
+popcorn/SM
+poppy/MS
+porch/SM
+porphyry/SM
+portcullis/MS
+portentous/PY
+portière/SM
+posed/4AI
+poser/IMS
+posit/vuSVd
+position/CGADKS
+positionable
+positiveness/S
+posits/C
+possessiveness/S
+possible/SIY
+postage/SM
+postbag/M
+posterior/SY
+posteriori
+post-feminist
+post-free
+postillion
+postmark/MSGD
+post-orbit
+postscript/SM
+post-structural
+postulation/M
+posturer/M
+potage/M
+pot-belly/DSM
+potion/SM
+pouffe/S
+POW
+powerboat/SM
+powerful/P
+ppm
+PPS
+practiser/M
+Praia/M
+prance/RGSDk
+prank/SM
+prattle/DRSGk
+pre/Q8s
+preamble/M
+preceptor/MS
+preciousness/S
+precipitous/YP
+precision/IM
+predatory
+predicable/S
+predicted/U
+predominate/Y
+pre-elect
+pre-existence/SM
+prefab/DSMG
+prefix/M
+prehensile
+premed/wS
+premiership/SM
+premium/SM
+preparative/SM
+preponderance/MS
+pre-programmed
+present/NnLYRS7xlDG
+presentation/MAo
+presidential/Y
+press-up/S
+pressure/M8q-9GQsDS
+pressure-cooker
+presto/S
+Preston/M
+presumable
+pretzel/SM
+priapic
+priestess/MS
+primacy/SM
+prime/PS
+princedom/SM
+princely/PT
+Pringle/M
+priori
+prismatic
+pristine/Y
+prithee/S
+private/nYTQ8SN-qPVv
+privateer/MGS
+privilege/SDMG
+prizewinner/S
+probable/I
+procaine/SM
+pro-choice
+procrastination/M
+prodigal/SY
+produced/e
+producer/AMS
+producible
+profaner
+professionalism/MS
+professor/oSM
+professorial
+programme/WSM
+programming/C
+projectile/SM
+Prokofiev/M
+prolapse/GSDM
+prolate
+proletarian/Q8-qS
+prologise
+prologize
+promethium/M
+promising/UY
+promissory
+promotion/MS
+promulgate/GSNnD
+pronounced/U
+propagation/M
+propagator/SM
+propane/SM
+prophecy/SM
+proportionality/M
+proportioner/M
+propose/DRGSNxX
+proprioception
+pro-Republican
+proscribe/DSXVGN
+prosodic/S
+protactinium/M
+protections
+protoplasm/SWM
+Protozoa
+protozoan/SM
+protrude/XSVuvDGN
+protuberant
+proves/AI
+provision/GMD
+provocative/PS
+provocativeness/S
+prudish/PY
+psittacoses
+psyche/M
+psychocultural
+psycholinguistics/M
+psychoneurosis/M
+psychos/S
+psychotherapeutic/S
+psychotherapy/SM
+psychotic/SY
+pub/MWSDG
+puberty/MS
+publication/KMA
+public's/A
+pucker/dS
+puddling/M
+puffer/Z
+pugnacity/SM
+pulchritudinous/M
+pulley/SM
+pullover/SM
+pumping/M
+pumpkin/MS
+punctuality/UM
+punished/U
+Punjabi
+pupa/M
+pupil/SM
+puppetry/SM
+purblind
+purchasable
+purdah/SM
+pureness/S
+purlieus
+pursuance/MS
+purview/MS
+put/DRGZS
+putted/e
+pyromaniac/MS
+pyrotechnic/S
+pyruvic
+Pythagorean
+q.t.
+quack/DGS
+quadriceps/SM
+quadrille/SM
+quadrillion/HMS
+quaffer/M
+quantifiable/U
+quantify/7NRDGnS
+quantity/MS
+quarterdeck/SM
+quash/SGD
+quaternary/S
+Quayle
+quincentenary/M
+quisling/SM
+quoit/GDSM
+quorum/SM
+quota/MSn
+quoted/U
+quoth
+rabble-rousing
+racialism/M
+rack/SDGM
+racquet/SM
+radiance/MS
+radiant/Y
+radioactivity/M
+radiocarbon/MS
+radio-telegraph/SZ
+radio-telephone/MS
+radish/SM
+radium/M
+Raikkonen
+rain/DMGSpZ
+raincoat/SM
+Raith
+rajah/MS
+ramp/DMSG
+rampant/Y
+ramshackle
+ran/Aec
+rancorous/Y
+Rangoon/M
+rapeseed/M
+rapier/MS
+rapport/MS
+rare/YGTP
+rarebit/MS
+ratatouille
+rationalist/W
+ratline/MS
+rattle/RGYJDS
+ravish/DRGLSk
+raw/YTP
+reactive/Nn
+readdress/G
+realisable/U
+reappoint/LG
+rear/DRMGS
+Reba/M
+rebroadcast/M
+recalcitrant
+recitalist
+reckoner/M
+reclamation/MS
+recluse/MSVN
+recombinant
+recompile/Nn
+rectify/GN7nDRS
+recusance/Z
+redeclare/N
+red-eye
+Redford/M
+red-hot
+redo/G
+reductionism/M
+reek/SDG
+re-enumerate/N
+re-equip/G
+re-establish
+referential/Y
+referral/SM
+reflation/y
+reflexivity/M
+refluence
+refraction
+refractometry
+refractoriness
+refurnish/G
+refutation/M
+reg/o
+regale/DG
+Reggie/M
+rehearsed/Uf
+rehearser/M
+Reilly/M
+releasable
+relentless/Y
+relevance/MIZ
+reliability/UM
+relief/M
+relight/G
+religion/3SM
+religiosity/M
+reliquary/SM
+remembrance/MS
+renaissance/S
+renal
+rent/DMRSG
+rep/MS
+repair's/E
+repast
+repeatable/U
+repenter
+repetitious/Y
+replace/L
+reply/NRnGV
+repression/M
+reproach/kDS6G7j
+reprogram/GRD
+republic/nNS
+reputably/E
+requestion/G
+requital/SM
+rerecord/G
+resemble/DSG
+reserve/nNih3
+reservoir/MS
+reset/G
+reside/DG
+resign/inhN
+resistibly/I
+resolve/B
+responder/MS
+responsible/PIY
+restaurateur/SM
+retardant/SM
+retardation/M
+retention/SM
+reticulum/M
+retinue/MS
+retrench/L
+retrievable/I
+revel/nRJSDGyN
+reverberate/NDGSn
+reverberation/M
+reverenced
+reverse/GbY
+revise/NX
+revitalise/Rn
+Revlon/M
+revolvable
+rewritable
+Rex/M
+Rh
+rheology/w3M
+rheumatic/SZ
+rheumy-eyed
+rhinestone/MS
+rhinoceros/SM
+Rhodesia/M
+Rhonda/M
+rhythm/1MwSW
+ribosomal
+Richardo/M
+Rickard/M
+rickety/T
+ride/GCRS
+rider's/ce
+ridiculous/YP
+riding/M
+riff/MS
+riffle/DSG
+riff-raff/M
+rifle/mGSMD
+rifle-fire
+rifling/M
+right-angled
+rightist
+rightmost
+rigidify/S
+rigour/SM
+rime/SM
+ring-pull
+ringside/MRS
+rinser
+ripen/dS
+ripple/GMYDS
+ritzy/T
+Riva/MS
+rive/RGDS
+Riviera/M
+riving/C
+riyal/SM
+Roarke/M
+robbery/SM
+Roberson/M
+Robespierre/M
+Robinson/M
+robotic/S
+Robson/M
+rock-climber/S
+rocketry/SM
+Rockingham
+Rockland/M
+Rodolfo/M
+roll/GUSD
+roll-back/SM
+Rollin/MS
+Rollo/M
+Romero/M
+rooibos
+rootstock/M
+rope/GRD7SM
+Roquefort/M
+Roscoe/M
+Rosebery/M
+rose-coloured
+Roselle/M
+Rosenthal/M
+rose-red
+Rostov/M
+rotary/S
+rotation/M
+rough/GSDPTY
+rough-hewn
+roughshod
+roundelay/SM
+roundish
+rowdy/PTSY
+Roxie/M
+royalist
+Rs.
+RSPCA
+Ruben/MS
+rubicund
+rubout
+Rudy/M
+Ruhr/M
+rumble/SGDJ
+rumen/MS
+rummy/TM
+rumour/DGSM
+rumple/SGD
+Rundle/M
+rung/SM
+runnable
+runner/SM
+run-through
+ruse/SM
+rush-hour
+Ruskin/M
+Russ
+Russian/SM
+rustication/M
+Ruthie/M
+RV
+Sabin/M
+Sabrina/M
+sackcloth/M
+sacred/Y
+sag/GDSZ
+sahara
+said/U
+saintliness
+saintly/T
+sake/S
+saleable/U
+sallow/T
+Salo
+Saltley
+saltly
+saltness
+salubriousness
+salvo/M
+samarium/M
+Samuelson/M
+sandbank/MS
+sandbox/MS
+sanely/I
+saneness
+sanguinary
+sank
+Santo/SM
+sap/DMRZG2pS
+sarcoma/MS
+sarcophagi
+sartorial/Y
+Saskatchewan/M
+sate/S
+satiate/GnDSN
+satisfied/EU
+saturnalia
+saunterer
+savable
+savoury/U
+sawbones/M
+Saxon/MS
+say/RGJS
+scad/M
+scalability
+scald/GSD
+scam/MDGS
+scans/NX
+scarecrow/MS
+scaremongering
+scarification/M
+scarify/NGDS
+scarlet/M
+schist/M
+Schneider/M
+Schoenberg/M
+scholarship/MS
+school-age
+sciatic
+science/M3SW
+science's/FK
+scion/SM
+Scorpio/MS
+scot
+scot-free
+scour/SDRG
+scoutmaster/SM
+scowl/GSD
+scrawl/SDGY
+screed/SM
+screening/M
+scribble/RSGDJ
+scrivener/MS
+scrofulous
+scrutineers
+scurrility/MS
+scurrilous/YP
+seaboard/M
+seaquake/M
+searchable/U
+seasonableness/U
+seasoning/M
+seawall/S
+seaweed/SM
+secateurs
+seceder
+secondary/Y
+section's/E
+Seder/MS
+sedimentary
+seditiousness
+seduce/RDNVvuGSn
+sedulous/Y
+seemly/TP
+sees/c
+segregated/U
+Seidel/M
+seizable
+Selassie/M
+selectiveness
+Selena/M
+selenium/M
+Seleucid/M
+self-aware
+self-awareness
+self-censorship
+self-confident/Y
+self-contradiction
+self-deception
+self-interest/D
+self-satisfied
+self-taught
+Selkirk/M
+sell-by
+sell-out
+seltzer/S
+semiarid
+semi-duplex
+semi-infinite
+seminal/Y
+semi-rigid
+semi-skilled
+Semite/WSM
+semi-tone/MS
+semitransparent
+Senegalese
+senescent
+sensitising/C
+sensitivity/IMS
+sensitizing/C
+sentence/MGDS
+sepal/SM
+separability/I
+separableness
+separatism/MS
+Sephardic
+sept/NWM
+seraph/W1SM
+serene/TY
+serology/w1M
+serve/AGCSKDF
+server/CKSM
+serving/CS
+servitude/SM
+seventy-eight/H
+seventy-six/H
+seventy-twofold
+severe/oTY
+sexuality/MS
+Sgt.
+shabbiness
+shadowed/c
+shadower/M
+shadowing/c
+Shaftesbury/M
+shaky/YT
+shalom
+shamanism
+shame/6MjpS
+Shamus/M
+shapeless/PY
+shareholder/MS
+shark/SM
+sharpener/S
+sheepwalk/MS
+sheik/SM
+shellfire/M
+shellfish/M
+shelter/drSM
+sheltered/U
+shepherd/GMSD
+Sheridan/M
+Shetland/S
+shingle/DMSG
+Shintoism/S
+shoelace/MS
+shoemaking
+shop-boy/MS
+shop-floor
+shopping/M
+shortage/MS
+shortcrust
+short-sighted/Y
+shoulder/d
+shoulder-length
+shove/DSG
+showing/M
+show-place/MS
+shrank/K
+shriek/DRSMG
+shrubbery/MS
+shrubby/T
+shrug/SDG
+shush/DSG
+shutter/dp
+shyest
+sickish
+sick-list
+side-by-side
+side-chapel
+sided/Y
+sidedness
+sidelight/MS
+side's/f
+sidestep/GDS
+side-table/S
+Sidney/M
+Siegel/M
+sifter/SM
+significance/ISM
+signor/MF
+signorina/SM
+Sikh/SM
+silent/Y
+silverfish/SM
+Silverman/M
+Simmons/M
+simplicity/MS
+since
+single-handed/Y
+siren/SM
+Sisyphus/M
+sit/RGSJ
+sixty-six/H
+skating-rink
+skill/DSM
+skilled/U
+skin-tight
+skivvy/DMSG
+skiwear
+skulk/RGSD
+sky-blue
+Skylab/M
+skyline/MS
+slam/RGSD
+slanderous/Y
+slap-up
+sleazy/PTY
+sleeve/SMGDp
+sleuth/GMDS
+slob/SM
+slot/DGSM
+slouch/DSGZ
+Slough/M
+Slovak/S
+Slovakia/M
+slowdown/MS
+slue/DSG
+slumber/MdS
+slyness/M
+Sm
+smack/GSMDR
+small/ST
+smallholding/SM
+small-minded
+small-mindedness
+small-time
+small-town
+smash/RkSGD
+smash-and-grab
+smattering/SM
+smilax/MS
+smilies
+smocking/M
+smokescreen/S
+smoke-stone
+smoking-jacket
+smoothish
+smug/PTY
+snake/GZDMS
+snappy/TP
+snare/GDMS
+snarer/M
+snarl/SDGkY
+snicker/d
+snitch/GDS
+snobbish/Y
+snobbishness
+Snodgrass/M
+snooker/d
+snoot/SzM2Z
+snowdrift/SM
+snowfield/SM
+snub-nosed
+soapsuds
+sociometry/MW
+sock/DMSG
+socket/dMS
+soever
+soigné
+solely
+solicited/U
+solid-state
+Solis/M
+somalia
+someone/M
+son/MW1SZ
+sore/TSY
+sorrel/SM
+sorrower/M
+sorry/TPY
+sorter/SM
+sorts/K
+soulless/Y
+sound/GJSTMDRYp
+sounding/M
+sounds/A
+sow/RGDS
+spa/MS
+spaciest
+spadework/M
+sparest
+sparseness
+speaking/Ua
+spearhead/GSMD
+specialise/cnGDS
+specifies/A
+specimen/SM
+specious/PY
+spectrograph/Z1M
+spectrophotometer/MWS
+speculator/SM
+speechless/PY
+speedboater
+Spencer/M
+spew/DRSG
+spider/MZS
+Spielberg/M
+spiller
+spine-chilling
+spinet/SM
+spinneret/SM
+spiraea/MS
+spiritualness
+splashdown/SM
+splendiferousness
+split/SRGM
+spoil/CSRDG
+spokespeople
+spoonbill/MS
+spoor/SM
+sporran/SM
+spouse/SM
+sprang
+spread/CGcSe
+spread-eagled
+spreadsheet/S
+springy/TP
+spry
+spud/SDGM
+spurn/DSG
+spurner
+sputa
+squeegee/MSG
+squeezable
+Squibb/M
+squiredom
+squireship
+squirrel/YMGSD
+squirter/M
+stab/RYDJSG
+stability/MSI
+Staffordshire/M
+stallholders
+stalwart/YS
+stalwartness
+stand/SfGJ
+stand-off/S
+staphylococcal
+staphylococcus
+star-spangled
+start/RSDG
+starts/A
+statistical
+statistician/SM
+stator/SM
+stealer/M
+steam/zR2DGMZS
+steed/SM
+steel-clad
+steer/GSD7
+stegosaurus/S
+stem/pGMDS
+stentorian
+stepchildren
+stepladder/SM
+sterilise/ADSG
+stern/SYT
+stevedore/SM
+stick/RZS2GzM
+sticky/PT
+stiffen/rSd
+stigmatised/U
+stile/MS
+still/SDPTG
+stimuli/M
+stinting/U
+Stirling/M
+stirrup/SM
+stochastic/Y
+stocking/MSD
+stocktaking/M
+Stoddard/M
+stodge/2MZ
+stolid/Y
+stolidity
+stomach/R6pDMG
+stonemason/SM
+stonewort/M
+stopoff
+stopover/SM
+storey/S
+stork's-bill
+storm-cock/MS
+storm-door/SM
+Stornoway/M
+Stourbridge
+Strachan
+strafe/SGD
+straggly/T
+straight-eight
+strait/SMY
+strait-laced
+strategic/S
+strayer/M
+stressed/U
+stressfulness
+stretchy/T
+stridden
+strikebreak/RG
+strike-breaking
+string/AGS
+stringent/Y
+strobe/SM
+stroke/SGDM
+struck
+struggler/M
+strum/DGS
+strumpet/MS
+stuffy/YTP
+stumble/GSDRk
+stumpy/T
+suavity/M
+sub-aqua
+sub-basement/MS
+subcontractor/SM
+subdirectory/S
+subdivide/XSDGN
+sub-edit/d
+subfamily/MS
+subfusc
+subgenera/W
+subject/vGSDuMV
+subjectivism
+subjectivist/S
+subjectivity/SM
+sublet/SG
+submerse/SbXGDN
+submit/ANSGDX
+suborn/NGDS
+subscript/DGS
+subsidised/U
+subsist/GSD
+subspecies/M
+substation/SM
+substratum/M
+substructure/MS
+subsume/GSD
+subtend/SDG
+subtitle/MSGD
+subvert/SDG
+succour/SGMDp
+suds/Z
+suffix/nSGDM
+suffusion/M
+suicide/SoM
+sulky/T
+Sumatra/M
+summation/FMS
+sunburn/MSD
+sunglasses
+Sunni/MS
+Sunnyvale/M
+sunroof/S
+sunshade/SM
+superabundance/M
+supercilious/YP
+supercooled
+superficiality/S
+superfine
+superintend/DSG
+supernatant
+supernatural/PY
+superstar/SM
+superstition/SM
+superstructure/SM
+supervised/U
+supine/PY
+supplementary/S
+suppression/M
+supra
+Supt.
+Surabaya/M
+sure-footed/Y
+sure-footedness
+surface-active
+surface-to-air
+surface-to-surface
+surfboard/MGS
+surfeit/MGSD
+surgical/Y
+Surinamese
+surmise/DGS
+surreal
+Surrey/M
+susceptibility/MSI
+Suzanne/M
+suzerain/SM
+swashbuckler/SM
+sweatshirt/S
+sweaty/PT
+sweepstake/MS
+swineherd/SM
+swingeing/Y
+switch/DMRGS
+switch-over/M
+swoosh/DSG
+sword/SmM
+swung
+sycamore/SM
+syllabary
+symptomatology/M
+synaesthetic
+synchronized/CU
+synchronizer/CSM
+syndicalist
+synonymity
+synopsis/M
+synthesis/rQ9S8dM
+synthetic/SY
+syphilitic/S
+systematise/nRSGD
+systematize/NRSGnD
+tabbouleh/S
+tablespoonful/MS
+Taft/M
+taiga/SM
+tail/AMCDSG
+tailgate/G
+take-off/SM
+taker/cS
+Talbot/M
+Taliesin/M
+talkie
+tame/RTGDYS7
+tamper/rdS
+Tanaka/M
+tandoori/S
+tangy/T
+Tania/M
+tans/Z
+Taoism/MS
+tap-dance/G
+tar/DMZGS
+tarantula/SM
+Tarawa/M
+tarsus/M
+tartan/MS
+Tashkent/M
+Tasmania/M
+tasteless/PY
+taverna/S
+tawny/TM
+tax-deductible
+Tchaikovsky/M
+TCP
+teaching/M
+teacloth
+tear-off
+tease
+teasel/MS
+teazel
+teddy/MS
+teeter/dS
+teetotal/R
+Teignbridge
+Tel.
+telefacsimile
+telemeter/WSM
+telemetry/MS
+telepathic
+teletext
+temperamental
+temperateness
+temperature/MS
+tempt/SRnGDkN
+tenacious/Y
+tenet/SM
+tensioner/S
+tentativeness
+tenter/M
+tepidness
+tercentennial/S
+termini
+term-time
+ternary/S
+terrestrial/YSM
+Terrill/M
+tertiary/S
+Tessa/M
+tessellation/M
+testimony/MS
+test's/F
+test-tube
+tethered/U
+textile/SM
+Thai/S
+Thames
+thane/SM
+thanklessness
+Thatcher/M
+that'll
+thermionics/M
+thermochemical
+thermoplastic/S
+thesaurus/SM
+Thespian/S
+Thessaly/M
+thicken/Sdr
+thieve/GyDS
+thimbleful/MS
+thingamabob/MS
+third-class
+thirty-eight/H
+thoracic
+Thornton/M
+threadbare
+threat/SM
+three-cornered
+three-handed
+threepence/M
+threnody/SM
+thrombosis/M
+Thule/M
+thumbnail/SM
+thunderstruck
+Thurman/M
+thwart/SDG
+thyroid/S
+Ti
+ticklish/P
+tiddlywinks
+tight-arsed
+tilde/SM
+tilters
+time-and-motion
+timeless/Y
+timeslot/MS
+timestamped
+Timmy/M
+timpanist/S
+Timur/M
+tingle/GDS
+Tioga/M
+Tipton
+tiredness
+tithe/SMDG
+T-junction/S
+Tobin/M
+tog/MGSD
+Tokyo/M
+tolerance/ISM
+toleration/M
+toll-gate/SM
+Tolstoy/M
+Tompkins/M
+tonal
+tonality/SM
+tone-deaf
+tonguing/M
+tonsillitis/M
+Tony/M
+toolbox/MS
+toothbrush/SM
+tootsie/M
+top/MWwGpR1JDS
+top-notch
+Toronto/M
+torrential
+torrid/Y
+torture/RDGS
+torus/SM
+Tosca/M
+tote/GS
+toupee/MS
+tow-bar/MS
+tow-head/SMD
+townspeople/M
+toxicology/3Mw
+toy/MDSG
+toymaker
+track/GMRSDp
+track-laying
+tractably/I
+tractor/FSMCA
+tract's/F
+trade-in/S
+traducement
+traffic-calmed
+tragic/Y
+train/ADGS
+train-spotting
+trample/DSG
+transcendent/oY
+transgression/M
+translatable/U
+translated/aU
+transmission/AM
+transponder/M
+trapshooting/M
+trash/SGD2MZ
+travelled/U
+treadle/DSGM
+treatise/MS
+treatment/KSM
+trenchant/Y
+Trescothick
+triangulation/M
+tribalism/M
+tribe/SmM5
+trichina/M
+trichloroethane
+trigger/d
+trigger-happy
+trimonthly
+tripe/M
+tripwire/SM
+trisect/SGD
+trisector
+trod/A
+Trondheim/M
+troopship/MS
+troth/S
+trouble/DGSM
+troublemaker/MS
+trousseau/M
+trousseaux
+trueness
+Trujillo/M
+trump/SDGM
+truss/GSD
+trusted/U
+trustful/P
+trusting/Y
+try-out/MS
+T-shirt/S
+tubing/M
+tubule/SM
+Tuck's
+Tully/M
+tumblerful/S
+tumbrils
+tune/ACSGD
+tunic/SM
+Tupperware
+turbinate
+turbojet/SM
+turboprop/SM
+Turing/M
+turn-buckle/SM
+turnover/MS
+turpitude/MS
+tutorial/MS
+Tuttle/M
+tweet/SRGD
+twenty-first/S
+twenty-three/H
+twenty-two
+Twickenham
+twiddly/T
+twit/DGSM
+'twixt
+two-wheeler/MS
+type/aASGD
+tyrannosaurus/S
+tyro/SM
+UFO/S
+Ukrainian/S
+ulcerate/SGNDn
+ulcerous
+Ulrika/M
+ultra/S
+ultraconservative/S
+ultra-high
+ultramarine/SM
+umbrage/SM
+unable
+unaccustomed/Y
+unalterable/Y
+unanimity/SM
+unavailable
+unbelieving/Y
+unchristian
+unconfirmed
+uncork/G
+uncouple/G
+unctuousness
+uncut
+understandability
+undertaking/M
+unending/Y
+unessential
+unfair
+unfit/DG
+ungainly
+unguent/S
+ungulate/S
+unilateralism/M
+Uniondale
+union's/EA
+unipolar
+Unix/M
+unlike
+unload/G
+unmanly
+unmarried
+unmovable
+unpopular
+unprovable
+unread/2B
+unselfconsciousness
+unsettle/ki
+unsolder
+unsound
+unstable
+unstinting/Y
+unsure
+unsuspecting/Y
+untouchable/MS
+unutterable/Y
+Upanishads
+uplift/SDG
+upped
+upper/S
+uppermost
+Uranus/M
+urbanite/SZM
+URL
+user/aM
+USSR
+utensil/SM
+utmost
+utopian
+Utrecht/M
+uvula/SM
+Uzi/M
+vacant/Y
+vacuity/MS
+vacuolated
+vacuum/MS
+vainglorious/Y
+Val/M
+Valentino/M
+Valenzuela/M
+Valparaiso/M
+valuably/I
+value-added
+valueless
+values/fc
+Vance/M
+vandal/Q8MS
+vanquish/RGDS
+variegate/SnDGN
+various/Y
+varsity/SM
+vascular
+Vaseline/M
+Vatican/M
+vaunt/DGS
+Vegemite
+veggie/SM
+vehicular
+velocity/SM
+velour/MS
+velum/M
+Venables
+vendetta/MS
+venomous/Y
+ventilation/M
+ventricular
+ventriloquies
+venturesome/Y
+Verdi/M
+veridical
+verifiable/U
+Vern/M
+versatility/SM
+versify/GNRSnD
+version/MIFAS
+vertebrate/SIM
+vertices
+vesicle/MS
+vesiculate/NGS
+Vesta/M
+vestibular
+vestry/mSM
+vests/I
+vex/F
+vexatious/Y
+VF
+vibrational
+vice/CSM
+Vicente/M
+vicissitude/MS
+Victoria/M
+Vidal/M
+Viennese/M
+Viet
+viewpoint/SM
+vigilantism/SM
+vigorous/Y
+Vila/M
+vile/PYT
+villa/SM
+villus/M
+vinaigrette/SM
+vino/M
+violinist
+Virgil/M
+virile
+virtuoso/SM
+viscosity/MS
+visit/AdS
+vista/SM
+vitalized/C
+vitrification/M
+viva/S
+vivisect/xGDS
+vixen/MS
+vocabulary/SM
+vocation's/IFA
+vocoder
+voice-over/S
+voltmeter/SM
+voluble/Y
+voluntarily/I
+vomit/Sd
+voracious/Y
+vouch/GSRD
+Vreeland/M
+vulnerability/SI
+vulva/M
+WAC
+wagon/SM
+waitress/MS
+Waldemar/M
+Walt/MR
+Walther/M
+warble/GRDS
+warden/MS
+warmonger/MS
+warning/M
+Warsaw/M
+washbasin/SM
+washhouse/S
+Washington/M
+waste/Sj6
+watchword/SM
+watermark/MDGS
+water-resistant
+Watford/M
+wattage/MS
+Watusi/M
+wax/GMZDS
+weaners
+Wear
+Wear-Tees
+weathercock/SM
+Weatherford/M
+weds/A
+weft/SM
+weightless/Y
+weightlifter/S
+Weiss/M
+Weldon/M
+well-deserved
+wellness
+well-thought-of
+Welshwoman/M
+Wentworth/M
+westbound
+Western
+wetland/S
+wet-nurse/S
+Weymouth/M
+Whatley/M
+Wheatstone/M
+wheelbarrow/MS
+wheelbase/MS
+whelk/SM
+whereat
+where'd
+whims/1Zw
+whipper-snapper/SM
+whiskey/MS
+whistle-blower/S
+white/PSTGMY
+white-collar
+white-out/S
+Whitfield/M
+Whitney/M
+Whitsuntide
+whoever
+whore/SDGM
+who're
+whorehouse/MS
+whorl/SMD
+wickerwork/M
+wide-angle
+wide-ranging
+wifeliness
+Wigan/M
+Wiggins
+wild/TYPSG
+wildfowl/M
+Wiley/M
+wilful/YP
+Willamette/M
+Willem
+willing/UY
+Willy
+Wiltshire/M
+wimple/MDSG
+windburn/SM
+Windhoek/M
+winding/SM
+window-shop
+windowsill/SM
+wine/ZMS
+Winthrop
+wiry/T
+wisdom/MS
+Wiseman
+wishing-well
+witch/MyDSG
+with
+withdrew
+withstood
+Witwatersrand
+wizard/ySYM
+wizen
+woebegone
+woken
+Woking
+Wolff/M
+wolverine/MS
+wonderer/M
+wonderland/SM
+wood/mZDS2M
+woodchuck/SM
+woody/T
+woolliness
+woozy/TYP
+wordbook/SM
+workfare/S
+workman/M
+workmanship/MS
+workout/MS
+WorldCom
+world-view/S
+worn-out
+worst/D
+would-be
+wrap's
+wreathe/S
+wren/SM
+wriggly/T
+wrinkle/GDSMY
+wristwatch/SM
+write-off/S
+wrought/Ic
+WWW
+Wylie/M
+Xerxes
+Xi'an/M
+xylophone/SM
+Yakutsk
+Yalta
+Yankee/S
+Yankeeism
+Yarborough
+Yashmak
+yawn/kGRDS
+ye
+yell/SGD
+Yid
+yin
+yokel/SM
+yo-yo
+ytterbium/M
+Zadie
+Zaire/M
+zaniness
+zealously
+zebra/MS
+zeroes
+Zetland
+zip/UGDS
+zircon/M
+zone/ASDG
+Zulu/MS
+AA
+Ababa/M
+abaser/M
+abated/U
+abbot/SM
+Abbott/M
+abbreviated/U
+abdication/M
+abhor/SGD
+abhorrent/Y
+abjectness/S
+abnormality/SM
+aborter
+abortive/P
+aboveboard
+abrade/DGVXvuNS
+abrasive/MS
+abreast
+abrogation/M
+abstracter/M
+abstraction/3SM
+Abu/M
+abusable
+acceleration/M
+accelerometer/MS
+accession/MDG
+acculturation/M
+accuracy/ISM
+achieve/RSfDG
+acoustician/M
+acquit/DGS
+acrobat/M1SW
+action/IMS4A
+actionable
+actuation/M
+acuity/MS
+adaptor/S
+addend/SM
+addict/DSGVu
+additional
+additive/YSM
+add-on/S
+addressed/Aa
+adductor/M
+Aden/M
+adjective/SM
+admission/AM
+admixture/MS
+adolescence/SK
+adolescent/MYS
+Adolph/M
+adorn/DLSG
+adsorbate/M
+adulate/SDNnGy
+adulation/M
+adulthood/SM
+adventitious/PY
+adventure's/a
+adventurous/U
+adventurousness/SM
+adversarial
+adversity/SM
+advisability/I
+advise/BLRSGDlh
+advocacy/MS
+aerodynamics/M
+aestivate/N
+AFC
+affability/SM
+affect/hVvNnkDiSG
+affliction/SM
+affluent/Y
+aforementioned
+Afrikaans
+Afrikaner/SM
+afro
+agency/SM
+aggressor/MS
+agile/TY
+aglow
+agoraphobic/S
+agree/dESLlG
+agronomy/3SMW
+ague/MS
+Ahab/M
+Aida/M
+aide/MS
+aide-mémoire
+ail/LSDG
+airborne
+airframe/MS
+airfreight/DSG
+airhead/SM
+airing/M
+airsickness/S
+airtight/P
+air-to-air
+aisle/DGSM
+Ajax
+al/AFC
+Alabamian/M
+Aladdin/M
+alba/M
+Alberta/M
+Alden/M
+Alec/M
+ALGOL
+Al-Haili
+aligner/MS
+aliquot/S
+alkyl/M
+Allegheny/S
+allegory/1MWS3w
+allegretto/MS
+allier
+allocation's/CKA
+all-time
+almost
+aloha/MS
+Alpert/M
+alphabet/sQ-SW89q1Mw
+alphanumerical
+al-Qaeda/M
+al-Sharif
+altar/SM
+although
+altogether
+alumna/M
+Alvarez
+amalgamate/SDG
+ambassadorship/MS
+ambience/M
+ambivalent/Y
+ambulance/MS
+Amelia/M
+amener
+amenorrhoea/M
+ammoniac
+ammunition/SM
+amniocenteses
+amoeboid
+Amos
+amputee/SM
+anagram/GMDS
+Anaheim/M
+analgesic/S
+anarchist/W
+anastomoses
+ancestral/Y
+ancestress/SM
+andiron/MS
+androgyny/MS
+anecdotal
+anemometer/SM
+Anglicism/S
+Anglophile/SM
+angst/MS
+anhydrite/M
+aniline/MS
+animalcule/S
+animately/I
+anklet/MS
+Annie/M
+annihilation/M
+anniversary/SM
+annoy/DkRSG
+anonymous/Y
+another/M
+ans/M
+answerable/U
+answered/U
+ante/MW
+anthracite/MS
+anthropomorphism/SM
+anthropomorphous
+antibiotic/MS
+anticipation/M
+anticoagulant/S
+antimacassar/MS
+antipathy/SMW
+antiphonal/S
+antiquity/SM
+antiresonance/M
+antislavery
+antisymmetry/W
+antiterrorism
+Antoinette/M
+anus/MS
+anybody/SM
+anyhow
+aorta/WSM
+apart/PL
+apex/SM
+aphrodisiac/SM
+apish/YP
+apophthegm/SM
+apparatus/SM
+appealing/U
+appeased/U
+appellation/M
+appellative/M
+applicator/SM
+appoints/EA
+apposite/Yx
+apprehender/M
+apprentice/DSGM
+appropriator/SM
+appurtenant
+apt/TPY
+Arabian/SM
+arable/S
+Arapaho/M
+arbitrariness/S
+arbour/MDS
+Arbroath/M
+arc/SMDG
+archaeopteryx
+archdiocesan
+archipelago/SM
+Arcturus
+ardent/Y
+Ards/M
+arduous/YP
+area/MS
+aren't
+Aretha/M
+arguably/IU
+argued/e
+argument/SnMN
+ariser
+Aristophanes
+Aristotelian/M
+Aristotle/M
+arithmetical
+Arizona/M
+armada/SM
+Armagnac
+Armenia/M
+armlet/SM
+Armstrong/M
+aroma/WSM1
+aromatic/PS
+arras/M
+arrears
+arrogate/DNGnS
+arsenide/M
+arterial
+arteriole/SM
+artful/P
+arthritis/M
+Arthurian
+articulateness/S
+artificiality/SM
+artistic/IY
+ascetic/MYS
+ascorbic
+asexual/Y
+ash/SMDGZ
+Ashland/M
+Asia/M
+asked/U
+asocial
+asparagus/SM
+aspartame/S
+asperity/SM
+aspirate/SGD
+aspirer/M
+aspirin/SM
+Assad/M
+assay/GDRS
+assertiveness/S
+assessor/SM
+asseverate/SGnDN
+assigned/KACU
+assigns/KCA
+assimilate/DSVGnN
+assimilationist
+assister/M
+associative/Y
+assonant/S
+assuming/U
+assumption/M
+asthmatic/S
+astonish/SLkDG
+Astoria/M
+astronomer/SM
+astrophysical
+asymptomatic/Y
+asymptote/1MSW
+Atari/M
+attached/AU
+attainably/U
+attained/AU
+attempted/A
+attenuator/SM
+attitudinal/Y
+attract/VuS7DGv
+au
+audible/YI
+Augustinian
+auricle/SM
+Australasian/S
+authenticator/MS
+authenticities
+authorial
+authorizes/A
+authorship/MS
+autocross
+autogyro/MS
+available/P
+avant-gardism
+avarice/MS
+ave/S
+aver/DG
+aviary/SM
+avionic/S
+avocation/MoS
+avoidance/MS
+avow/GSED
+awestruck
+awhile
+axed/F
+axillary
+axolotl/MS
+baa/GSD
+Babcock/M
+babe/SZM
+baccalaureate/SM
+backache/MS
+backer/SM
+backing/SM
+backlash/SDGM
+backlit
+backplate/MS
+backstairs
+backtrack/RGSD
+Backus
+backwater/MS
+badge/SRGMD
+badger/d
+bagginess/S
+baggy/TPS
+bagpipe/MRS
+baguette/MS
+bake/RGSDy
+baking/M
+baksheesh/MS
+baldric/M
+ballast/SMGD
+ball-bearing/S
+ballgame/S
+ballyhoo/MDGS
+balun
+balustrade/MS
+bandmaster/MS
+bandstop
+banisher/M
+banjoist/MS
+bank/S7RGJMD
+Bantu/M
+baptise/DRSG
+baptistery/SM
+barbarian/SM
+barbarianism/MS
+barbershop/SM
+barcarole/SM
+bard/MSDGW
+Barents
+barkeep/RS
+barmaid/SM
+Barnet/M
+baronage/MS
+baronet/SM
+Barr/MZ
+bar-room/MS
+bar's
+Bartley/M
+bas/Sd1o
+baseplate/M
+basetting
+basket/6SMy
+Basque/MS
+bassinet/MS
+bate/CDASG
+bater/C
+batted
+battle/RDLMSG
+bauble/MS
+BBC/M
+beachcomber/SM
+beard/pSGiDM
+beatably/U
+beaten/U
+beating/M
+beatitude/MS
+beatnik/MS
+became
+beckon/Sd
+bedchamber/M
+bedim/GSD
+bedlam/SM
+bedridden
+beech/SM
+beefeater
+beermat/S
+Beersheba/M
+beeves/M
+befit/SGDM
+befitting/Y
+befriend/DGS
+behaviour/aSM
+behest/MS
+behold/GSR
+bejewel/DGS
+Belarus/M
+belated/P
+belief/SME
+believably/U
+bellow/SDG
+Bellwood
+belonging/M
+bemoan/SGD
+bench/GSDM
+Benedict/M
+benevolent/YP
+Benghazi/M
+Bentley/MS
+berkelium/M
+beside/S
+besot/SDG
+bespangle/DSG
+bespoken
+bestir/SDG
+bestow/DSG
+betake/SG
+bête/S
+bethought
+betwixt
+biased/U
+bicameral
+bicentennial/S
+bier/M
+biggie/M
+bikini/SMD
+biliary
+bimodal
+bin/DGSM
+binder/Z
+binomial/SYM
+bioengineering/M
+biotechnology/w3SM
+biplane/SM
+birthrate/MS
+bisyllabic
+bitterer
+Blackadder/M
+blackbodies
+blackmail/RGMDS
+Blackshirt/SM
+blacksmith/GSM
+Blackwell/M
+blameworthy/P
+bland/TPY
+blankness/S
+blarney/GSMD
+blaspheme/RDSZG
+blatherer
+blatting
+bleed/RSG
+blight/DGMS
+blighter/M
+blimey/S
+blinker/d
+blinks/M
+bliss/6jS
+blissful/P
+blizzard/SM
+blob/SMDG
+Bloch/M
+blockbuster/MS
+blonde/SM
+blondish
+blood-brother
+blood-heat
+bloodline/MS
+blood-money
+bloodroot/M
+bloodstone/M
+bloodymindedness
+Bloomington/M
+blot/GMRSD
+blotto
+blow-dry/GD
+blubber/dSZ
+blue/TZGSYPDMJ
+bluejeans
+bluer/M
+bluestocking/SM
+bluing/M
+boasted/e
+boat-hook/S
+boatyard/SM
+bock/SGD
+bodhisattva
+body/pDMSYG
+bodywork/MS
+boggle/DGSk
+boilerplate/SM
+Bois/M
+boisterous/YP
+boldness/S
+Bolivia/M
+bolt/UGSD
+bombast/WMS1
+bombed-out
+bonfire/SM
+bongo/MS
+bonhomie/SM
+bonny/T
+boohoo/SDG
+bookbindery/MS
+bookcase/SM
+booked/cA
+bookmaker/MS
+bookshelf/M
+bootie's
+bootleg/GSRD
+borate/DMS
+borderland/SM
+bore/RGSkDW
+boring/M
+born/AU
+boss/SzG2MDZ
+bossism/SM
+bosun/M
+bouffant
+bouillon/MS
+bouncy/YT
+bounded/P
+bountiful/P
+bout/MS
+Bowery
+bowl/R6MSDG
+bow-saw/MS
+boyfriend/SM
+bracket/dSM
+bracketing/M
+Brady
+brag/TSDRG
+brain/GD2pMZS
+brainchildren
+brainwash/SGD
+brainwave/S
+brambly/T
+bravura/MS
+bray/SGD
+Brazzaville/M
+bread-and-butter
+breadboard/DGMS
+breadwinner/SM
+break/eMS
+breeching/M
+Brett/M
+bridegroom/MS
+bridleway/S
+briefs/C
+Brigadoon/M
+brighten/drS
+brilliancy/SM
+brink/MS
+briquette/SM
+Bristol/M
+Britain/M
+Britten/M
+brittlely
+brochette/SM
+brogue/SM
+bronchiole/MS
+brooklet/SM
+Bros.
+brow/SM
+Brubeck/M
+brush/ZGSDM
+brushlike
+brush-off/S
+Brussels/M
+brutal/qQ8-
+Bryce/M
+BSkyB/M
+BTU
+Budapest/M
+budgie/MS
+Buena
+bug-eyed
+Buick/M
+building/MeS
+build-up/SM
+Bulawayo/M
+bulldoze/RGDS
+bullfight/RSMG
+bully/DGTMS
+bumble/DRkSG
+bunchy/T
+bunkhouse/MS
+burdening/c
+burdens/cU
+burgess/MS
+burglarious
+Burgoyne/M
+burlap/MS
+burler/M
+burliness/S
+bursa/yM
+bursar/MS
+bursty
+busher
+bushwhack/GRSD
+busty/T
+busyness
+but/DAGS
+Bute/M
+butterfat/MS
+butterfingers/M
+buzzard/SM
+byliner/M
+bypath/SM
+byword/SM
+Byzantine
+Byzantium
+cabal/GDSM
+caballero/SM
+cabbage/DGSM
+cabochon
+cabstand/SM
+cackle/DRSYG
+Caddick/M
+caddie
+caeca
+caecitis
+caffeine/SM
+cageyness
+cagoule/S
+calcification/M
+calcimine/DSMG
+Caledonia/M
+calfskin/SM
+call-boy
+calling/a
+callisthenic/S
+callisthenics/M
+Calvert/M
+Calvin/3M
+cambial
+came/c
+cameo/MSDG
+Canaveral
+cancerous/Y
+candelabrum/M
+candidness/S
+candour/SM
+cannabis/MS
+canyon/SM
+capable/IP
+capaciousness/S
+capacity/SMI
+capillarity/MS
+capital/-qMQs893S
+capped/U
+caprice/SM
+captor/SM
+captured/A
+carbohydrate/SM
+carbon/sQ9S8W-NqMn
+Carbondale
+carcinogenesis
+card-index
+cardiogram/SM
+careerism/M
+caresser/M
+cargo/M
+Caribbean
+carious/K
+car-jack/SDJRG
+Carlin/M
+Carline
+Carney/M
+Carnot
+carny/G
+Carolingian
+Carolyn
+carpet/dJSM
+carpeting/M
+carries/a
+cartridge/MS
+cash/DGSpM
+cash-book/MS
+cashew/SM
+cassette/MS
+casting/Mc
+Castro
+casual/PY
+cataclysm/WSM
+catacomb/MS
+catamaran/MS
+Catawba
+catcall/DGSM
+catchword/MS
+catkin/SM
+catlike
+cattiness/S
+catty/TP
+caucus/S
+caught/U
+cauldron/SM
+cause/GnDMoRSp
+cautiousness/I
+cavalier/YPSDG
+cave/mRSMDG
+caver/F
+Caxton
+CB
+CDs
+Cedric/M
+Celanese
+celebrant/SM
+celery/SM
+centenarian/SM
+centreboard/SM
+centrepiece/SM
+centring/M
+century/SM
+cephalic/S
+cerebral/S
+cert/SF
+cesspool/MS
+chador
+chafer/M
+chagrin/MS
+chain-smoke/GD
+chairmanship/MS
+chalcedony/SM
+chalk/MGZ2SD
+challenge/RDGSk
+championship/SM
+chancellery/SM
+chance's/a
+changeover/SM
+Channing
+chanticleer/SM
+chaos/MS
+charisma/M1W
+Charleston
+chart/RDG73MJS
+charter/dr
+chastity/SM
+chateaubriand
+Chattahoochee
+cheap/TY
+checkpoint/MS
+cheesy/PT
+chef/SM
+chemistry/SM
+cheroot/MS
+chestful/S
+chevron/SM
+chicer
+chicken-livered
+chilblain/SM
+childrearing
+Chilean/S
+chill/TDk2PRGMYS
+Chiltern/S
+chinchilla/MS
+Chinese/M
+chinstrap/S
+chipping/M
+chivalrous/PY
+chlorination/M
+chocoholic/S
+chocolatey
+choice/TSPYM
+chokeberry/M
+cholinesterase/M
+chopstick/SM
+chording/M
+Chorley
+chortle/RGDS
+chosen
+christening/MS
+Christie
+Christmastime
+chromatogram/MS
+chumminess/S
+Churchillian
+churlish/YP
+churn/RDGSM
+chutney/SM
+chyme/MS
+ciao/S
+CID
+cilium/M
+Cinerama
+cinnamon/SM
+circa
+Circe
+circle/GDSM
+circulating/A
+circumference/SM
+circumspect/Y
+cissy
+cistern/SM
+citadel/SM
+civil/s9qQ-8Y
+civility/ISM
+clairvoyance/MS
+clamour/GMDRS
+clarification/M
+clarify/NDGSn
+clarity/SM
+Clarke/M
+clasper/M
+class-conciousness
+classicism/SM
+classicist
+Claudio
+clavichord/SM
+clavier/MS
+clean-cut
+cleanlinesses
+clearness/S
+Cleopatra/M
+clericalism/MS
+clew/SMDG
+click/RSGDM
+cliffhanger/SM
+climacteric/MS
+clime/WSM
+clinical/K
+cliometric/S
+clip/RGSDJM
+cliquish/YP
+clitorides
+cloaca/M
+cloisonné
+close-hauled
+closure/GDSM
+clothbound
+clothes-peg/SM
+cloudiness/S
+clouds/c
+cloudscape/SM
+clownishness/S
+clubroom/SM
+clued-up
+cluster/MdSJ
+cm
+Co
+coagulator/S
+cobblestone/SDM
+coca/SM
+coccyx/M
+cockade/MS
+cockney/MS
+coded/K4
+codeine/MS
+coding/4
+Coelenterata
+coelenterate/MS
+coffee-cup/SM
+coffer-dam/MS
+cognisance
+cognizance/AMS
+cogwheel/SM
+coherence/SIMZ
+cohesive/YP
+coke/SMDG
+cokey
+cola/SM
+Colby
+Coldfield
+collide/XDGxNS
+collimate/SCNDG
+colonel/SM
+colonialness
+colonised/U
+colorimeter/SMW
+colourant/SM
+Columbia/M
+column/D3SQ8M
+combustive
+cometary
+comfits/E
+comfortably/U
+comforter/SM
+comic/YMS
+coming/c
+Commander
+commando/SM
+commender/AM
+commensurably
+commenting
+commits/A
+committable
+commode/ESI
+communicate/BDxSVvGnNu
+communicates/a
+communicative/P
+commutable/I
+Compaq/M
+comparator/MS
+compatible/SIY
+compel/7NGSDnk
+compendium/MS
+compensable
+compiles/A
+complex/GxDYTPNXS
+complexity/cM
+complicate/GcDS
+complicit
+complicity/MS
+complimentary/U
+compose/CRDSXGN
+composing/EA
+comprehensibility/IMS
+compulsive/YSP
+compulsory/YS
+Comte
+conceitedness/S
+conceive/KSDaG
+conciliator/SM
+conclave/S
+condemn/Nn7RGDS
+condemnation/M
+conditioning/M
+conduction/M
+confab/DSMG
+confectioner/Z
+confessor/SM
+confident/cY
+configuration/AM
+Cong
+congener/SM
+congenial/U
+Congo/M
+Congolese
+congress/mxM5GSD
+congruency/M
+conk/RSD
+connection/MES
+connection's/A
+conscious/YU
+consequential/IY
+consequently/I
+consequentness
+conservatism/SM
+considerate/YnN
+consignment/A
+consistence/ZS
+consolatory
+consolidator/MS
+consonant/YSM
+conspirator/SoM
+conspire/G
+constipate/NGDSn
+constipation/M
+constructibility
+construe/DS7G
+construed/a
+construes/a
+cont
+contemplative/PS
+contemporaneity/MS
+contra/yS
+contraceptive/S
+contrite/P
+conundrum/MS
+convalesce/DSG
+convene/GADS
+convention/SoM
+convergence/SM
+converts/A
+conveyor/MS
+convince/RGDSk
+convinced/U
+convoke/GDNnS
+Conway/M
+cooker/SMZ
+cooled/c
+coop/RDGM
+co-operate/VSDGuNv
+coordinate/DGV
+Copernican
+copious/YP
+copula/nMSV
+coracle/SM
+coral/SM
+cord/EGSAMD
+cordial/PYS
+coriander/MS
+corm/SM
+corncrake/M
+cornstalk/MS
+coronate
+corporal/MS
+correction/SM
+corroborated/U
+corrugate/DSNnG
+corundum/M
+cos/S
+cosmic/Y
+cosset/Sd
+costly/TP
+cote/SM
+couch/DGSM
+councilperson/S
+countably/U
+counterbalance/MSDG
+counterexample/S
+counterfeit/GRSD
+counter-intelligence/MS
+counterpoise/DMGS
+counter-productive
+countervail/SGD
+Couperin
+courgette/SM
+courser/ESM
+courtesied
+courtesy/ESM
+couscous/MS
+coverlet/SM
+coveter/M
+cowardice/SM
+cowardliness/S
+cow-parsley/M
+co-written
+CPU/SM
+crab-apple/SM
+crabbiness/S
+crabbing/M
+crabgrass/S
+cradler/M
+craftiness/S
+Craig
+cramper/M
+crane/MDSG
+cranial
+Cranleigh
+crash-land/GD
+crawdad/S
+crawly/ST
+crazy/YSPT
+creaky/PT
+creamer/Z
+crease/GISCD
+creating/A
+credential/MS
+credibility/ISM
+creditor/MS
+credit's
+creditworthy
+creel/DGMS
+Creighton
+crème
+crescendos/C
+cress/S
+cretinous
+crevice/MS
+Crichton
+crispness/S
+criticism/MS
+Croatian
+crooked/P
+cross-check/DGS
+crossly
+crossness/MS
+cross-section/oS
+crotchet/MSZ2
+crucifix/XNMS
+crucifixion/M
+cruise/RSDG
+crumble/SJDG
+crummy/T
+crumple/SDG
+crusade/MRSDG
+crustacean/MS
+cry/CRSGD
+cryptanalytic
+crystallographer/MS
+crystallography/WM
+CSEU
+cu.
+cuckold/MDGyS
+cud/SM
+cudgel/DSGMJ
+culotte/S
+cultivation/M
+culvert/MS
+cum/S
+cumber/Sd
+cummerbund/SM
+cunning/TYP
+cupful/MS
+cupidity/SM
+curability/SM
+curator/SM
+curbside
+curettage/SM
+curium/M
+curled/U
+curling/M
+curls/U
+curmudgeon/MYS
+Currie
+curry/DGMS
+currycomb/SMDG
+curvature/MS
+curvilinearity/M
+cuspate
+Custer/M
+customhouse/S
+customised/C
+custom-made
+cutaway/SM
+cutlet/MS
+cut-off/SM
+cut-out/SM
+cutup/MS
+cyanate/M
+cycloidal
+cynosure/MS
+Cyrus
+cyst/SWM
+czarina/MS
+czarist
+d/to
+damaged/U
+Damascus/M
+dancelike
+Dane/S
+dangerous/YP
+danseuse/SM
+dark/PSDTGY
+dart/MGSRD
+Darwin
+DAT
+dative/S
+daughter-in-law
+daunted/U
+dauntlessness/S
+Davison/M
+deadbeat/SM
+deadliness/S
+deadwood/SM
+deaf/PYT
+deaf-and-dumb
+deafness/S
+death/pYMS
+deathblow/MS
+Debbie/M
+debt/MS
+Decalogue
+decimation/M
+declination/M
+décolleté
+decorum/SM
+decoupage/DGSM
+découpage
+decree/SMdG
+decry/J
+dedicative
+deeds/a
+deepen/dS
+defecation/M
+defenceless/Y
+defended/U
+defiance/SM
+deficient/Y
+deficit/SM
+defile/L
+defined/U
+Defoe
+deg
+deification/M
+Deighton/M
+deign/DGS
+de-industrialization
+deleterious/PY
+deliciousness/S
+delicti
+delighted/P
+demean/D
+demented/PY
+demist/G
+demonstrableness/M
+demonstrably/I
+demur/GDS
+demurral/MS
+dengue/SM
+deniable/U
+denial/MS
+denoter
+density/SM
+depend/BSDGl
+dependently/I
+depicter/M
+deploy/LD7G
+deployed/A
+deportation/M
+depreciate/DnvGkSVN
+Derby/M
+dereference/R
+derivative/MPS
+descendant/SM
+descriptivism
+deserve/kih
+desiccator/SM
+designator/SM
+desired/U
+Desiree
+despise/SRGD
+dessert/SM
+destructor/M
+detonator/SM
+detract/DGVv
+deuteron/M
+Deuteronomy
+develop/cdAS
+deviant/MYS
+devil/DLyMGS
+devitalize
+devolution/SM
+devotee/SM
+devotion/SM
+dewclaw/SM
+dexterous/PY
+diagnosed/U
+diagonal/tQ+8SY
+diamondback/SM
+Diane
+diapason/SM
+Dibley
+dibs
+dichloride/M
+dicta/nM
+dictate/DGS
+dictator/MoS
+die-hard/S
+Dieppe
+dietician/MS
+Dietz
+difference/IMS
+digest/SKGD
+digestion's/I
+dilapidate/DGSNn
+dilator/MS
+dildo/SM
+dimethylglyoxime
+dimorphic
+ding/zDG2Z
+dingle/SM
+dinky/ST
+dinnertime/S
+dinosaur/SM
+diphtheria/SM
+directional/S
+director/MAS
+directors'
+disadvantage/i
+discern/LbkSGD
+discernible/I
+discipline/GDSM
+disconnectedness/S
+disconsolate/Y
+discotheque/SM
+discriminate/SnNDVGky
+disguise/GRDh
+disjointedness/S
+disjointness
+disorderly/P
+dispatch/R
+dispensate
+disproportion/N
+disproportionation/M
+dissatisfy
+dissociation/M
+dissoluteness/S
+distil/NS7VnG
+distributorship/M
+disulphide/M
+ditch/DSMG
+ditherer/S
+dive-bombing
+diversifier/M
+diversify/SGNDn
+diversity/SM
+divertimento/M
+divide/RuDSGxVXvN
+divided/AU
+divides/A
+divvy/DSMG
+dizziness/S
+DMZ
+doc/RSMDG
+document/NMRDGSn
+Dodoma/M
+does/ecUA
+doff/SDG
+doggerel/SM
+dog-paddle
+dome/SMGD
+domination/KM
+Dominic
+Dominique/M
+dona/SM
+donation/M
+Doncaster
+Donnelly
+doorpost
+doorstop/SM
+doorway/SM
+Doreen/M
+Doris
+dormant
+dotty/T
+double-edged
+doubtful/YP
+doubtless/PY
+dour/PTY
+douse/SGD
+dove/SM
+doveish
+downhearted/PY
+downhiller
+downlink/SGD
+downpour/SM
+downstage/S
+down-to-earth
+draggy/T
+Dramamine
+draw/SRG7J
+dreaminess/S
+dreariness/S
+dreg/SM
+dressiness/S
+dressmaker/SM
+Drew's
+Drexel
+driblet/SM
+drinkable/U
+drive-ins
+Druidical
+Druid's
+Drummond/M
+DTP
+duality/MS
+Dubuque
+dull/PYGSDT
+dullard/MS
+dumbness/S
+Dunbar/M
+Dunfermline/M
+dunghill/SM
+duo/SM
+duologue/M
+duopoly/3M
+dupe/RSMGD
+duplexer/M
+duplicability/M
+duration/MS
+Durham/M
+dusk/GSDM2Z
+Düsseldorf
+dust/2MZGSzRDp
+dustcart/M
+Dutchwomen/M
+duty/6jMS7
+Duxford/M
+dwarfism/MS
+dwell/GRJS
+Dwight
+dynasty/SMW
+eagerly/c
+eaglet/SM
+Ealham
+earful/SM
+ear-splitting
+earthmover/M
+earthy/PT
+East/RM
+eastward/S
+Ebrahim
+EC
+ecclesiology/3w
+éclair/SM
+ecocide/SM
+ectoplasm/M
+Ecuadorian
+ed.
+Edgerton
+edibleness/S
+Edith
+Editor-At-Large
+Edmundsbury
+Edna
+educatedness
+educationalist
+eelgrass/M
+e'er
+EFT
+egalitarian/S
+Egan/M
+egomania/SM
+eight/HMZS
+eighty-five/H
+ejaculate/nDGSNy
+ejector/MS
+elapse/SGD
+elastodynamics
+electability
+electrologist/SM
+electroluminescent
+electromagnetism/SM
+electrostatics/M
+elegy/MS
+elephant/SM
+elephantine
+elfish
+elicitation/M
+elision/M
+Ellen/M
+Ellie
+ellipsoidal
+Ellwood/M
+eloquence/SM
+elucidate/VNDSGn
+elucidation/M
+elves/M
+Ely/M
+email/MDGS
+emanate/DnVGSN
+emancipation/M
+embarkation/MSE
+emboss/GDRS
+embryology/S3wM
+emendation/M
+emerald/MS
+emerita
+Emil/M
+Emile/MZ
+emirate/MS
+Emirates/M
+emissary/SM
+emollient/S
+emphasized/c
+employ/DGLSRB
+employments/f
+empower/LSd
+empty-handed
+en/7M
+enable/RDGS
+enact/GLSD
+enacting/A
+enactment/A
+enamel/GMRDJS
+encapsulation/M
+encompass/DGS
+encounter/Sd
+encyclical/SM
+endothelial
+endpapers
+endurable/U
+enfeeble/LSDG
+England/M
+English-speaker
+engrosser/M
+enjoinder
+enlarge/RLDSG
+ennui/MS
+enormousness/S
+enqueue/SD
+enquiry/S
+enrobed
+enrollee/MS
+ensign/SM
+entirety/SM
+entitle/SDLG
+entity/SM
+entranceway/M
+environment/o
+envoy/MS
+epicentre/MS
+epicurean/S
+episode/W1SM
+epitaph/MS
+epithelium/SM
+equability/MS
+equable/YP
+equality/IMS
+equilibration/M
+equinox/MS
+equipoise/MSDG
+equiproportional/Y
+equips/A
+equispaced
+equivalent/YS
+equivocate/GDNSn
+Erickson
+erk
+ermine/SDM
+Erwin
+escalator/MS
+escallop/SM
+escapade/MS
+escapee/SM
+esp/Z
+espalier/SDGM
+especial/Y
+established/A
+esteem/EDGS
+Ethan
+Ethel
+EU
+euclidean
+Euston/M
+evaluate/xNVDGSn
+evangelist/WSM
+Evansville
+even/YdSPJ
+even-handed/Y
+evening/M
+eventful/P
+evocative/P
+evoke/VGuvSnDN
+evolutionary/Y
+Ewing
+exacerbation/M
+exacting/P
+exampled/U
+Excalibur
+excavation/M
+excel/DGS
+exchangeable
+excitatory
+excite/lknGNLRDSBh
+exciting/Uc
+exciton/M
+exclamation/MS
+excremental
+excrete/ynDGSN
+excruciate/DSNkG
+excruciation/M
+excursion/3MS
+excursiveness/S
+excusably/I
+exemption/MS
+exercises/c
+exhale/GNDSn
+exhibitionism/MS
+exhibitionist
+exhilarate/DSVNGkn
+exhume/GDSn
+exit/dSM
+exorbitant/Y
+expatiate/GNDSn
+expedient/YS
+expend/Du7VSGv
+experiences
+experimentalist
+experimentation/M
+exploded/U
+exploitative
+explorable
+exponential/YS
+exported/A
+exporting/A
+exposit/yXN
+expunge/SGD
+exquisite/YP
+extended/c
+extensibility/M
+extensive/FY
+extermination/M
+extinction/SM
+extragalactic
+extravehicular
+extremal
+extricate/GnDSN
+exultation/M
+eye-catching
+eyeglass/SM
+eyelid/SM
+eye-shadow
+eye-teeth
+eyrie's
+fa/M
+Fabians
+façade/SM
+face-saving
+facilitator/SM
+fading/M
+Faeroe/M
+faery/SM
+faint/RGSPYTD
+fair/DTZPSGpJY
+Fairview
+faithful/UY
+Falk
+fallen
+falsifiability/M
+Falstaff
+familiar/9Qsq8-SY
+familiarise/k
+famously/I
+fanatic/MYS
+fang/SDM
+fantastic/Y
+far/d
+Farmington
+farmstead/MS
+farrier/SM
+far-sighted/YP
+farthest
+fascia/MS
+fascinate/DGSnkN
+fashions/A
+fasten/dASU
+fatherland/SM
+faultiness/S
+fauvism/S
+faux
+Fayetteville
+feature/DMGSp
+feature's/a
+federate/FNGnSD
+federative/Y
+feeling/PM
+feldspar/SM
+felicitate/DGSNn
+fellahin
+fellate
+fellatio/MS
+fellator
+felting/M
+feminise/nSGD
+feminize/nSNGD
+fenced/U
+Ferguson/M
+Ferreira
+fervent/Y
+fête/SM
+fetishism/MS
+feverish/YP
+fewness/S
+FIA
+fiancée/MS
+fibrillate/SGD
+fiche/SM
+fidget/SdZ
+fiducial/Y
+fiefdom/S
+fierce/TPY
+fifth-generation
+film/ZS2DMG
+filmy/TP
+fine/CFSDAG
+finer/FCA
+fingering/M
+fingernail/MS
+firebrand/SM
+fire-break/SM
+fire-eater
+fireside/M
+fire-water
+firmest
+firmly/I
+firmness/SM
+first-born/S
+first-class
+first-day
+Fishguard/M
+fishing/M
+fissionable/S
+fistulous
+fitness/S
+Fitzgerald
+fixative/S
+flaccid/Y
+flagellate/DSG
+flagship/SM
+flair/SM
+flammability/ISM
+flank's
+flattery/SM
+flattest/M
+flaunt/DkGS
+flaxen
+Fledermaus
+fledged/U
+fleet/DkGSTYPM
+fleeting/P
+fleshpot/SM
+flexes/A
+flexural
+flibbertigibbet/SM
+flighty/TP
+flinger/M
+flintlock/SM
+Flintshire/M
+flip-flop/S
+flirt/NDGZSn
+float/DGZSRN
+flock/DMJGS
+flog/DSGJR
+flogging/M
+floodlit
+floorboard/SM
+flop/2DGSzZ
+floppiness/S
+flowerbed/MS
+Floyd
+fluffy/PT
+fluid/Q8s9PSYM
+fluke/SGDMZ
+flung
+fluoride/nMS
+flyleaves
+flysheet/SM
+focussed/U
+fog/CGDS
+föhn
+fold-out/SM
+foliate/CGSnDN
+fondness/S
+fontanelle/SM
+food/SM
+footlocker/SM
+footmarks
+footwear/M
+fop/GSMD
+fora
+foray/DSGM
+forbear/MSG
+foregather
+foregathered
+foreignness/S
+forensic/SY
+foreseen/U
+foreshorten/dS
+foresight/SMiDh
+forestall/GRSD
+forewent
+forger/SZM
+forgettably/U
+forgiveness/S
+forgoes
+formidable/PY
+form's
+forsooth
+forsworn
+fortify/DAGS
+fortuitous/YP
+fortunateness/M
+fortune-teller/SM
+fortuning
+forward/DYSTPRG
+fouls/M
+foundational
+founding/F
+foundling/SM
+fourpence/M
+four-wheel
+foveate
+foxtail/M
+fragmentation/M
+fragrant/Y
+frail/PTY
+Francesco
+frangibility/SM
+frangible
+frankincense/MS
+Fraser/M
+Frazer
+frazzle/GDS
+free/mTSYPdG
+freebase/DSG
+frequented/U
+frequently/I
+Fresnel
+fricassee/GSM
+fries/M
+frig/SJGD
+Fritz
+frogmarched
+froid
+frolic/SRDMG
+froufrou/SM
+fructose/SM
+frugal/Y
+frustration/M
+frustum/MS
+fudge/MSDG
+Fujitsu/M
+Fukuoka
+full-blown
+fulness's
+functionary/MS
+fungible/M
+fungoid/S
+fungus/M
+funk/S2DGMZ
+fun-loving
+furious/YP
+furnish/RSGDJ
+furnishes/A
+furniture/SM
+furtive/YP
+fusible
+fuzz/DZMGz2S
+FYI
+gab/GZSD2
+gabardine/MS
+gabby/T
+gabler
+Gabrielle
+gadget/SMy
+Gagarin
+gaiety/SM
+galactic
+Galahad
+galaxy/SM
+gale/AS
+gallant/SGDY
+gallon/SM
+gallonage/M
+Gallup
+galumph/SGD
+Galveston
+Gambian/S
+gambol/SGD
+ganglion/MW
+gangrenous
+gangway/MS
+garble/GDS
+Garbo/M
+garçon/SM
+garden/dSrM
+gargantuan
+garments/f
+garment's/f
+garrulity/MS
+garrulousness/S
+Garry
+garter/dSM
+gasohol/S
+Gaspar
+gas's
+gastroenteritides
+Gatsby
+Gaylord
+gelatine
+geld/SGJD
+gem/SZMDG
+gemmology/3M
+gendarme/SM
+gene/SM
+general/Q8Ptq93+s-SM
+generalist
+generality/SM
+generation/CMA
+genital/YF
+genius/MS
+Genoa/M
+gentian/SM
+genus
+geodesic/S
+germander
+germanium/M
+germicidal
+germinal/Y
+Gershwin
+gestation/M
+gesundheit
+Gethsemane
+getup/MS
+Gewürztraminer
+ghostliness/S
+gibbet/SMd
+giddiness/S
+gill/MSGD
+girdler/M
+giro/M
+girth/GDSM
+gist/M
+gladness/S
+glamorous/UY
+glass/2D6MGZzSp
+glassiness/S
+glass-making
+glimmer/dJS
+glueing
+gluon/M
+glyph/MS
+go/fGe
+goalmouth
+goalscorer/S
+gobbledegook/M
+godfather/SdM
+godliness/S
+godsend/MS
+goggle-box/SM
+goings-on
+goldenseal/M
+goldsmith/SM
+golf/MRSGD
+gollywog
+gong/SDMG
+goniometry
+Gonville
+Goober
+Goodman
+good-oh
+good-tempered
+googly/S
+gooseberry/SM
+goosebumps
+gorgeous/YP
+Gorham
+gorse/MS
+gosling/M
+gouge/DRGS
+Gough
+gourdful/S
+gourmandism
+grab/RSJDG
+grace/DpG6MjS
+gracing/E
+graciousness/MS
+graduand/SM
+grainer/M
+granddaughter/MS
+granite/MWS
+Grantham
+grantor's
+granularity/MS
+granule/nNMVS
+grapefruit/M
+graph/MWGwD1S
+graphite/MS
+grasp/Gk7DS
+grassland/SM
+grassy/T
+gravamen/MS
+graveside/S
+graveyard/MS
+gravid/YP
+gravity/SM
+gravy/MS
+Gray
+greasiness/S
+greatness/S
+Greenberg
+greengage/MS
+greensward/SM
+Gregorian
+grenadine/MS
+Gretchen
+griffon/M
+Grimaldi/M
+grimness/S
+grindstone/MS
+gringo/SM
+grisly/PT
+groove/GSDMZ
+Grosz
+grotto/SM
+grouchy/T
+ground-plan
+ground's/f
+groundwork/M
+groups/A
+grout/MGDS
+growth/eSAIMcf
+grunge/SZ
+grunter/M
+Guam/M
+guard/RmGDhMiS
+gudgeon/M
+guessing/e
+guff/MS
+GUI
+Guildford
+guru/SM
+gush/GZRSD
+gutta-percha
+guttering/M
+Guyana/M
+Gwynedd
+gyps/Z
+gypsum/SM
+gyromagnetic
+haberdasher/ZMS
+Habib/M
+hackle/DSMG
+had
+hadji's
+Hadley/M
+haematite/SM
+haggard/PY
+haggardness/S
+hairpiece/SM
+hairspray
+Hal/M
+halberd/SM
+half-blood/D
+halfbreed
+half-century
+half-cut
+half-eaten
+half-hardy
+half-seas-over
+half-term/S
+halfway
+halfword/SM
+halide/SM
+hallo/GSD
+hallowed/U
+hallucination/M
+halve/DSG
+ham/DGSRZM
+hamburger/SM
+Hamish
+Hampshire
+hamstring/SGM
+Hancock/M
+handbarrow/SM
+handicraft/SM
+handmaid/SM
+handshake/SMG
+handsomeness/S
+handwriting/M
+handy/mPT
+Haney/M
+hangar/SdM
+hankie/M
+Hanna/M
+Hans
+happy-go-lucky
+Hapsburg/M
+Harbin/M
+hardboard/M
+hard-hearted/PY
+hard-heartedness/S
+hardship/MS
+hard-wire/SDG
+hard-working
+harebrained
+harmer/M
+harmless/PY
+harmonica/SM
+harmonics/M
+harnesser/M
+harp/RMDG3ZJS
+harpist
+harpoon/RSDGM
+harrogate/M
+hash's
+Haskell
+hasn't
+hassle/DMGS
+hastener/M
+hasty/TP
+hatchback/SM
+hatred/SM
+haughtiness/S
+Hauptmann
+Hawkins/M
+hawthorn/SM
+haycock/SM
+Haydn/M
+hazel/SM
+hdqrs
+heading/M
+headquarters
+headship/SM
+headstrong
+headwall/S
+healthfulness/S
+heard/UacA
+hearted/P
+heartedness/S
+heartfelt
+heart-to-heart
+heat/RJ7MGDSh
+heathendom/SM
+heavenward/S
+heavier-than-air
+heavy-handed
+hectare/SM
+hectic/Y
+heed/6MGDjpS
+heinous/PY
+heiress/MS
+helicopter/dSM
+heliocentric
+heliport/MS
+hell/MS
+hell-raiser
+helluva
+helpfully/U
+helpline/S
+hemline/MS
+henchman/M
+henna/DMGS
+heptane/M
+heptathlon/S
+Herculaneum
+herculean
+hereat
+hero/W1M
+Herrington
+Herzegovina/M
+hesitancy/SM
+hesitation/M
+Hewitt/M
+hex/DSG
+Heywood
+HGV
+Hickey/S
+Higgins/M
+high-falutin
+high-risk
+high-sounding
+highway/mMS
+hilt/GMDS
+Himalayas
+Hindu/MS
+Hinkle
+hipness/S
+hire/GADS
+hiss/SM
+histogram/MS
+hoarse/PYT
+hob/SZGMD
+Hoboken
+hogwash/MS
+Holbrook
+Holcomb/M
+hole/GDSM
+Hollister
+hollyhock/SM
+holmium/M
+holograph/DSZGWM
+Holst
+home-builder/S
+homeless/P
+homelike
+homely/TP
+home-made
+home-maker/SM
+homepage
+homeyness/S
+homicidal
+homing/M
+homoeostases
+homogenisation
+homosexual/SMY
+homozygous/Y
+Honecker
+honorary/SY
+hoofmark/S
+hook/RGSMD
+hooray/S
+hoot/RMDGS
+Hoover's
+hopeful/SP
+horde/MS
+Horgan
+horoscope/SM
+horror/SM
+horse/YmG5DMSp
+horseflesh/M
+horsefly/SM
+horselike
+horseradish/SM
+horticulture/3SM
+hosepipe
+hostile/Y
+hot/PDSYGT
+hothead/SDihM
+hotpot/M
+hotspot/S
+Houdini
+houseful/SM
+housemaid/SM
+houses/eA
+Houston
+however
+hue/SM
+Hugo
+humanity/SMI
+humid/Y
+hummable
+hummingbird/SM
+humus/SM
+Huron
+hurray/S
+hurt/kjG6S
+husbander/M
+hydrating/CA
+hydrocephali
+hydrofluoric
+hydrogenate/SMGD
+hydrophilic
+hydroponic/SY
+hydrostatic/S
+hydroxylate
+hymnographer
+hyperactivity/SM
+hyperglycaemia
+hyperventilate/GSnDN
+hypoactive
+hypophyseal
+hypoxic
+hysteria/MS
+I
+Ian/M
+iatrogenic
+ibex/SM
+Ibiza
+icecap/MS
+ICM
+icy/TPY
+Idaho
+idea/MoS
+idealization/M
+identifiable/U
+ideograph/WMS
+ides
+idiolect/M
+idiomaticness
+idyll/SMW1
+IEE
+IEEE
+iffiness/S
+Ignatius
+ignorant/SY
+ignore/GDS
+ilia
+ill-assorted
+ill-bred
+illimitable/P
+illuminated/U
+Imagen/M
+imaginable/U
+imbecile/MWS
+imitate/DVGvNunS
+imitative/P
+imitator/SM
+immanence/ZS
+immunodeficient
+impactor/SM
+impair/LG
+impart/GN
+impassioned/U
+impel/NRSGnD
+imperil/LGD
+imping/G
+implausibility/M
+implode/SNDGX
+implore/SkDG
+implosion/M
+imprimatur/MS
+improbable/P
+impulsion/M
+inauthentic
+inborn
+incapacitation/M
+incentive/ESM
+incident/Fo
+incineration/M
+incognito/S
+income/M
+incommunicado
+incontinent
+inconvenience/DG
+increment/NMSDGo
+incumbency/MS
+indeed
+indemnification/M
+indented/U
+indenter/M
+indeterminable/Y
+indeterminacy/SM
+indicative/S
+indict/LSD7G
+indigenous/YP
+indigo/SM
+indisputable/P
+individuality/MS
+Indochina
+industrialised/U
+industrious/PY
+industry/oMS
+infancy/M
+infectiousness/S
+infer/DS7G
+infest/nSDGNR
+infirmity/SM
+inflame/XN
+infra
+infrasonic
+infrequent
+ingenious/YP
+ingeniousness/S
+ingenuity/MS
+Ingham
+inguinal
+inhalation/M
+initialler
+initiation/M
+in-law/S
+innumerable/PY
+inquisitorial
+inscrutable/YP
+inseminate/NnDSG
+insemination/M
+inseparability/MS
+inside-out
+insidious/PY
+inspectorate/MS
+inspectors'
+inspiration/M
+instant/SYM
+instantness
+in-store
+instructor/SM
+instrument/GNoSDnM
+instrumentality/SM
+insularity/MS
+insulated/U
+insurrection/3MS
+integrability/M
+integrate/EADSGN
+intellectuality/M
+intercalate/DGVSN
+intercase
+interchanger/M
+interconnectivity
+intergovernmental
+interim/S
+interindex
+interlayer
+interleave/CGDS
+interlobular
+intermeshed
+internet
+internuclear
+interpersonal/Y
+inter-personal
+Interpol/M
+interposer/M
+interpretable
+interpretation/AMa
+interquartile
+interrupted/U
+interruptibility
+interstellar
+intertidal
+intertwine/DSG
+intestinal
+intestine/SoM
+intractability/SM
+intransigent/SY
+intransitive/S
+intrasectoral
+intrigue/RSkDG
+intro/S
+introduction/MA
+intrusion/M
+invariant/MY
+investigatory
+investor/SM
+inviolate/PYB
+Iolanthe/M
+Iona
+ionosphere/SMW
+Iowa
+Iran/M
+iridium/M
+ironmongery/M
+irreproachable/PY
+irresolute/P
+irresponsible/S
+irrigate/GDNnS
+irritability/SM
+isolationism/SM
+isolationist/W
+Isolde/M
+isometrics/M
+itemised/U
+it'll
+IUD/S
+I've
+ivory/SM
+jabber/SdrJ
+jack/MDRSJG
+Jacobi/M
+Jacobson/M
+jacquard/MS
+jadedness/S
+Jaime/M
+jalopy/SM
+Jamaica/M
+jamboree/SM
+James
+Janeiro
+jangle/DRSGY
+janissary/SM
+Jansen
+January/SM
+jato/MS
+Jean
+Jeep/SM
+Jekyll
+jenny/SM
+jeopardy/MQ8S
+Jeremy/M
+Jericho/M
+jerker/M
+jersey/MS
+Jerusalem/M
+Jessica
+jetliner's
+jettison/dS
+jewel/RGSMD
+Jewish
+Jewishness
+jiff/ZS
+jigging/M
+jimmied
+jingly/T
+jinni's
+jinrikisha's
+jitsu
+jiu
+jive/MDGS
+jnr.
+jocosity/SM
+jocund/Y
+Joe/M
+Johannesburg/M
+jointed/EPY
+joist/SMD
+joky/YT
+jolliness/S
+Jon/MZ
+Joplin
+Jovanovich
+jowly/T
+joyride/RGMS
+joystick/S
+ju/y
+judicious/IYP
+Judy/M
+jugful/SM
+jugglery/SM
+jujitsu/MS
+ju-ju/M
+jujube/MS
+Julius
+junco/MS
+juniper/SM
+jussive
+Juvenal
+kaboom
+kaput/M
+Kaufman/M
+Kellogg
+Kelsey/M
+kept
+Kermit
+kernel/SM
+kerosene/MS
+Kesteven
+kestrel/SM
+ketch/MS
+Keynesian
+keynote/SRGMD
+K-factor
+khan/MS
+kick-off/MS
+Kidderminster
+Kikuyu/M
+kilohertz/M
+kilowatt/SM
+kiloword
+Kim
+kin/5SmM
+kinesics
+kingship/SM
+Kinsey
+kirk/SM
+kite-flying
+kitten/MdS
+kitty/MS
+kiwi/SM
+klystron/SM
+knees-up
+knobby/T
+knock/RDJSG
+knock-out
+knockwurst's
+Knutsen
+Konrad/M
+kowtow/GDS
+kraal/MS
+Kremlinology
+krill/MS
+Krishna
+krone/M
+Krueger
+Kurd/SM
+kV
+Lab
+labium/M
+lac/DGSM
+lace-ups
+lactic
+lade/ZG
+Laden's
+lagoon/SM
+laity/MS
+Lakehurst
+Lakeland
+Lamar/M
+Lambert
+lame/YDPT
+lamination/M
+lampooner/MZ
+Lancashire/M
+lance/DRGMS
+landowning/M
+Langford
+languidness/S
+lapel/MS
+Laphroaig
+Lapp
+lapwing/SM
+largehearted
+large-scale
+largish
+larva/M
+lasagne/M
+lash/SDMJG
+lashed/U
+lasher/M
+latch/GMDS
+latices/M
+laudatory
+laughter/SM
+Laura/M
+Laurence
+lave/DSG
+lavish/DPTSGY
+laxes/A
+lay-bys
+layering/M
+layover/MS
+layup/MS
+Lazio
+lazy/GDTPY
+leads/a
+leap/DGS
+leaper/M
+learning/SM
+Lebanon/M
+lebensraum
+lecher/SMZ
+lechery/SM
+LEDs
+lee/SyM
+leer/DGkS2
+leeway/SM
+leftism/MS
+leftmost
+leftover/MS
+legatee/MS
+legendary/YS
+Lego/M
+legwork/MS
+Lehman/M
+lengthy/TP
+Lenin
+Leningrad
+lenitive/S
+Leona
+Leopold
+Leopoldville
+Leroy
+Lesotho/M
+let-down/SM
+lethal/Y
+let's/e
+lettering/M
+Lev
+Levi/S
+lexical/Y
+libel/DRSMG
+liberals
+Liberian/S
+Lib-Lab
+Lichtenstein
+lier's/F
+lifeboatmen
+lifebuoy/S
+life-force
+lifelong
+life-size/D
+LIFO
+lift-off/MS
+ligation/M
+light-fingered
+lighthouse/SM
+likeability/SM
+likelihood/UM
+likest
+lily/SDM
+Limerick/M
+limitless/PY
+Lincoln/M
+Lind/M
+Linda/M
+linden/MS
+linebacker/MS
+links/U
+Linotype/M
+lip/pSDZGM
+liposuction/S
+Lipscomb/M
+lip-service
+lipstick/MS
+liquidation/M
+lira/M
+listen/rdS
+listeria
+literati
+litter/d
+littoral/S
+liveability/SM
+livery/DmMS
+livestock/MS
+Lloyd/M
+loath/JGDPR
+loathsome/PY
+lobe/DSM
+lodges/E
+logging/M
+loincloth/MS
+lollipop/SM
+Lomb/M
+longer-term
+Longfellow
+longitudinal/Y
+long-playing
+long-sightedness
+longsword
+long-tailed
+longways
+lookahead
+looking/c
+loop/DMZSG
+looper/M
+loophole/SMGD
+lord/DcSMG
+Lorentz
+Lori/M
+Louie/M
+Louth/M
+Lovejoy
+lovestruck
+loyalism/SM
+Lubbock
+lucid/YP
+lucubrate/GnSND
+luggage/MS
+lugsail/MS
+lugubriousness/S
+lumbering/M
+luminescent
+Luna/M
+lunacy/SM
+lunchroom's
+lune/NM
+lunge/SM
+luridness/S
+lusty/TP
+lutetium/M
+Lutheran/MS
+Luxembourg/RM
+luxuriation/M
+luxury/SM
+Luzon/M
+lycée
+Lyn
+lynch/GRDSJ
+Lynchburg
+Lyon/MS
+lyrist
+ma'am
+macadam/QMS
+Macao
+macaronic
+macer/M
+Machiavellian
+machinate/GSD
+machinelike
+macron/SM
+Madagascar/M
+Maddox
+Madeline/M
+Madonna/M
+maestri
+magazine/MGDS
+magenta/MS
+magistracy/SM
+magnesium/M
+magnet/WqQ8-SMt+1
+magnetodynamics
+magnetron/M
+magniloquence/SM
+maharani/SM
+Maidstone/M
+maillot/SM
+mail-order
+mainstream/SM
+majolica/MS
+malathion/S
+Malawi/M
+Malcolm/M
+malfeasance/MS
+malice/SM
+malign/YRSDG
+malodorous
+maltreat/LDSG
+Mammon/M
+mammoth/SM
+man/61YRGDMjW
+Managua
+Manasseh
+Mandelbrot/M
+maniac/SM
+manifest/DYSGNn
+Manitoba
+Manitowoc
+Mann/M
+mannerism/SM
+mannerist/M
+mannerly/P
+mannish/PY
+manoeuvrability/SM
+manoeuvre/SBMGDJ
+man-of-war
+manometer/SM
+manqué/M
+mantelpiece/SM
+manufacture/RBSGJD
+Manville
+maps/A
+marabout's
+maraschino/MS
+marbler/M
+Marcel
+Marilyn
+marimba/MS
+marjoram/MS
+mark/RmDJhGSM7
+markdown/MS
+marlinespike/SM
+Marmite
+marmoreal
+Marrakesh
+marriage's/A
+Marriott
+Marseilles
+marsh/MZS2
+marshland/MS
+marshy/PT
+mart/MGSD
+martyrdom/MS
+Mary/M
+Marylebone/M
+Maseru/M
+massage/DMSG
+masseur/SM
+mass-producing
+mastoid/S
+matching/c
+matchless/Y
+Mateo/M
+materialist/W1
+materiality/IM
+Mathis
+Matsushita
+mattress/MS
+maturer/M
+Maud
+Mauritania/M
+maw/DSGM
+Maxtor/M
+Maxwellian
+Mayan/S
+mayflower/SM
+mayfly/MS
+mayhem/MS
+Mayo/M
+mayoral
+mayoress/SM
+McConnell/M
+McDougall/M
+McFarland/M
+McKinney/M
+meadow/SM
+meaning/M6jpS
+meantime
+mechanise/BnRSDG
+mechanize/nBDNG
+mediaeval/3MYS
+medial/S
+Medici
+medico/SM
+medico-legal
+meditate/VSGDvuNn
+meerschaum/MS
+meeter/M
+megavolt/M
+megawatt/SM
+mêlée/MS
+melodic/S
+melodramatic/S
+Melvin
+memoires
+Mendelssohn
+menfolk/M
+meningeal
+meningitis/M
+Mensa
+mensuration/SM
+mentalist
+mentionable/U
+menu-driven
+Menuhin/M
+Mercedes
+merchandise/RSDGJM
+merciful/P
+mercifully/U
+mercurial/S
+meringue/MS
+meritocratic
+Merrill
+Merritt/M
+mesmerized
+Mesopotamia/M
+mesozoic
+messiness/S
+metalinguistic
+metalworking/M
+metatarsal/S
+metatarsi
+metavariable
+methodicalness/S
+Methodism
+methyl/SM
+metropolis/SM
+Mexico/M
+Meyer/S
+Meyerbeer
+mezzo/S
+mi/C
+Michael/SM
+Michaelmas
+Mick/M
+micro/S
+microanalyses
+microanalytic
+microprocessor/MS
+microvolt/MS
+midday/SM
+middlebrow/SM
+middle-class
+middle-of-the-road
+middler
+Middletown
+midmost/S
+midterm/MS
+midtowns
+midwife/My
+migraine/MS
+milkiness/S
+milky/TP
+millennialism
+Millgarth
+millibar/S
+millinery/SM
+million/MHS
+Millward
+MIMD
+Mindanao/M
+mind-reader
+minds/A
+mingle/FGDS
+minidress's
+minimalism/S
+minimalist/W
+ministration/M
+mintage/MS
+Miocene
+MIPS
+miracle/MS
+Miranda
+Miriam
+mirror/dMS
+mirth/6SpMj
+misbehaver/M
+misfeature
+mishap/M
+mishmash/MS
+missions/4
+mission's/A4
+mistiness/S
+mistral/SM
+mistruster/M
+mists/C
+mitigated/U
+mitigation/M
+mks
+mobber
+mobile/IQ-+9stq8
+mode/FMS
+models/A
+modernness/S
+modi vivendi
+Mogadishu/M
+Mohawk/M
+moil/GSD
+Moldova/M
+Molokai
+momentousness/S
+momma/S
+monastery/MS
+monaural/Y
+Monmouthshire/M
+monochrome/MSW
+monoclinic
+monogamous/Y
+monolith/S1MW
+monomaniac/SM
+monotheism/MS
+Monsieur/M
+Monsignori
+monstrosity/MS
+Montevideo/M
+Montezuma
+Montmartre/M
+moonrise
+mopish
+Morant/M
+Moravia
+morgue/MS
+Moriarty
+moron/WM1S
+morphia/S
+Morrison/M
+mortgagor/MS
+Mortimer/M
+mosque/MS
+Mossberg/M
+motherliness/S
+motile/S
+mottler/M
+mould/2MZJDRGS
+mouldy/TP
+mournful/T
+mouth/M6ZDGS2
+mouthful/SM
+mouthwatering
+mouthy/PT
+move/ARSDG
+Mozart/M
+Mozes/M
+MP3
+mph
+MST
+Mt
+mudslinging/M
+Mueller/M
+Muenster
+muesli/M
+mugshot/S
+mulberry/SM
+mull/SDG
+mullet/SM
+multicellular
+multidimensional/Y
+multiform
+multilingualism/S
+multimedia
+multiplex/CGDRS
+multiplicand/MS
+multi-site
+multitudinous/PY
+multi-user
+mumbo
+mummer/Z
+munch/DMRGS
+munition/DSG
+murky/T
+Murphy/M
+murrain/SM
+Murrow/M
+muscle-bound
+muscular/Y
+musk/ZM2
+Muskegon/M
+musket-ball
+must/zZS2
+mustang/MS
+mustard/SM
+must-have
+mutilate/GnSND
+mutineer/MS
+muumuu/SM
+muzzle/DGUS
+mW
+Mycenaean
+myelitides
+Myra/M
+Myrna/M
+nadir/MS
+nag/RDSGM
+Nakamura/M
+Nancy/M
+nap/pRSZGMD
+Napier/M
+narrator/MS
+Nasser/M
+Natasha/M
+nation/M
+navigable/P
+nay/SM
+Nazareth/M
+nebular
+necroses
+needed/U
+needer/M
+needlepoint/SM
+needlework/MS
+negativeness/S
+Negev/M
+Negroes
+Nehru/M
+neighbourly/P
+neonatal
+neoprene/SM
+Nepalese
+nepenthe/SM
+nester/M
+netball/M
+nethermost
+nettle/MSGD
+neurasthenia/MS
+neurology/13MSw
+neurone/S
+neurotransmitter/S
+neutral/Q8-SsY
+neutralism/MS
+Nevis/M
+newbie/S
+new-found
+Newfoundland/RM
+newish
+new-laid
+newline/SM
+Newry/M
+newsboy/SM
+newsdealer's
+Nguyen/M
+NHL
+niacin/MS
+nib/SGMD
+nice/TPY
+nickname/MGDS
+nighthawk/MS
+nightspot/SM
+nightwear/M
+NIH
+nihilism/MS
+Nike/M
+Nils
+ninepins/M
+nineteen/HSM
+ninety-four/H
+Nineveh/M
+nit/SM
+nitre/MNSnW
+nitride/SM
+nitroglycerin/M
+Nixon/M
+Nkrumah/M
+Nomi/M
+non
+non-agricultural
+non-aligned
+non-allergic
+non-competing
+non-contagious
+non-critical
+non-cumulative
+non-custodial
+non-destructive/Y
+non-discriminatory
+non-drying
+non-executive
+non-exempt
+non-intellectual/S
+non-linear/Y
+non-logical
+non-magnetic
+non-person/S
+non-professional/SY
+non-profit-making
+non-proliferation/S
+non-racial
+non-resistant/S
+non-response
+non-scoring
+non-singing
+non-singular
+non-smoking
+non-specializing
+non-starter/S
+non-successive
+non-sympathiser/M
+non-tarnishable
+noon/SM
+noonday/SM
+Nordstrom/M
+normalize/CGSD
+normalizer/S
+Northfield/M
+north-north-east
+Northumbria
+north-west's
+no-show/S
+nostalgic/YS
+nosy/TYP
+noteworthy/P
+nothing/PS
+nourisher/M
+nouvelle
+Nov
+novelette/SM
+now
+noway
+Np
+nubile
+nuclease/M
+numismatics/M
+numismatist/MS
+Nunavut
+nuptial/S
+Nyquist/M
+oar/DSM
+oarlock/SM
+Oberon/M
+obfuscate/DNnyGS
+obit/MS
+obliqueness/S
+obliviousness/S
+obloquy/M
+oboe/SM
+obscure/NSDTGYP
+obsequies
+observance/MS
+obsession/M
+obtrusive/UY
+occasional
+occupational/Y
+occupied/U
+ocean/MWS
+ocean-going
+Oceania/M
+o'Clock
+octet/MS
+octoroon/M
+oculist/SM
+odorous/Y
+oedematous
+off-air
+officeholder/SM
+officer/d
+offish
+Ogden/M
+O'Hara
+oilseed/SM
+okay/DMG
+old-age
+olden
+old-fashioned
+oleomargarine/SM
+oligarchy/SM
+olive/MS
+Olivier/M
+Ollie/M
+ombudsman/M
+omega/MS
+omnivorous/YP
+once
+oncogene/S
+oncologist/S
+one-half
+oneself
+one-sidedness
+on-street
+ooze/DZSG
+OPEC
+open-and-shut
+open-eyed
+openness/S
+opportunity/MS
+opposition/M
+optician/MS
+optionality/M
+optometry/SMW
+oral/S
+orangery/SM
+orang-outang/S
+oration/M
+oratory/SM
+orbiter/S
+orchid/SM
+ordains/K
+Oregon/M
+Oregonian/S
+Orestes
+organdie/MS
+organelle/SM
+organisation/oM
+organism/MWS
+organization/oM
+organometallic
+orig
+Orlando/M
+Orpington
+orthodontic/S
+orthodoxy/SM
+orthogonal/Q8q-Y
+orthorhombic
+OTB
+otherwise
+OTT
+outboast
+outcry/M
+outdo/G
+outermost
+outfox/G
+outline
+outpace
+outpoint/DG
+overbid/G
+overdraw/G
+overgraze
+overgrow
+overlier
+overshoe
+overtime
+overwhelm/k
+owlet/MS
+oxidizing
+Oxonian
+oxygenate/DMGS
+oxygenation/M
+pace/DRMSG
+pacemaker/SM
+package/JRGDMS
+packer/SM
+packsaddle/SM
+Padraig/M
+paean/MS
+paediatric/S
+pagoda/SM
+paid-up
+painkilling
+Pakistani/S
+palace/SM
+palaeobotanist
+palaeobotany/w
+palaeography/MSw1W
+Palau/M
+pale/DTSYG
+pales/I
+palliative/S
+palmetto/MS
+paltry/TP
+panacea/MS
+panama/S
+Panamanian/S
+pancreas/SM
+pan-European
+pangolin/M
+panjandrum/M
+panther/SM
+pantograph/SM
+Panza/M
+Paolo/M
+papilla/yM
+papyri
+papyrus/M
+paradisal
+parallel/S
+paralleled/U
+paramour/MS
+parathion/SM
+paratroop/RS
+paring/M
+parishioner/MS
+Parisian/S
+parliament/MS
+paroxysm/MS
+parrakeet's
+parricidal
+parsec/SM
+parsonage/MS
+partaken
+participation/M
+particleboard/S
+partition/MGDS
+partizan's
+partly
+partook
+paschal/S
+passage/DMSG
+passenger-mile
+passim
+passivity/IS
+passmark
+paste/SM
+pastrami/MS
+pasts/A
+pat/DSMZG
+patriarch/ZM
+patriarchal
+patronize/k
+pay-bed
+peal/SAGD
+Pearson/M
+peashooter/SM
+pecuniary
+pederasty/SM
+pediment/ISM
+peeling/M
+peen/SGDM
+peerless/PY
+pelagic
+pelican/SM
+pellucid
+pendulum/SM
+penetration/M
+penguin/SM
+penile
+penitent/ISY
+penny-pinching
+pentecostal
+pepperoni/S
+peppy/PT
+perambulator/SM
+percentage/SM
+perch/DGMS
+percuss/DNvuSGXV
+percussion/3M
+percussion's/A
+perfidious/PY
+perforate/SNDGn
+perforation/M
+perfumer/Z
+perhaps
+perils/I
+peristalses
+peristyle/MS
+peritoneal
+periwinkle/MS
+permafrost/MS
+permissibility/M
+perpetuate/GnSDN
+perpetuity/SM
+perquisite/MS
+persecution/SM
+persistence/SM
+personality/SM
+pertness/S
+Peru/M
+pessary/S
+pestiferous
+Peterhead/M
+petite/PS
+petrel/SM
+petrographic
+petroleum/M
+pettifog/RGDS
+petunia/SM
+pewee/SM
+phaeton/MS
+phagocyte/MS
+phantasy's
+Pharisaic
+philodendron/MS
+philosophy/w1sWQ8S9M
+phlebitides
+phoenix/MS
+phonemic/S
+phonology/13wSM
+phosphine/M
+photochemistry/M
+photoengraving/MS
+photograph/R1GZDWSM
+photolytic
+photoreceptor
+phrasal
+pianoforte/MS
+pibrochs
+picked/U
+Pickering
+pickle/DSMG
+picoseconds
+pictorial/YPS
+piffle/DSMG
+pigeon-fancier/MS
+pigment/DNnG
+pigmentation/M
+pikemen
+pilaster/MS
+pilau's
+pilgrim/MS
+pilgrimage/MSDG
+pill/SM
+pillbox/MS
+pillion/MS
+pillow/GDMS
+pilothouse/SM
+pimiento/MS
+pimpernel/MS
+pince-nez
+pincered
+pincher/M
+pineapple/SM
+pinfeather/SM
+pinhead/SDiM
+pinky/S
+pinning/fS
+pinstripe/DSM
+pipe/MS
+pistol/SDGM
+pistole/M
+pitch/RGDS
+pitch-and-toss
+pithiness/S
+pithy/TP
+piton/MS
+pittance/MS
+pity/SGMRjpklD76
+pivoting/M
+pix
+pixie/SM
+place/EDRSLG
+placental/S
+plainchant
+plainness/S
+planting/S
+plantlike
+plant's
+plasm/M
+platitude/MS
+platoon/GMDS
+plaudit/MS
+play-acting/M
+playgoer/SM
+plea/MS
+pleading/M
+pleas/SkDGJ
+please/EGDS
+plenty/M6j
+plied/AIF
+plight/DGMS
+plighter
+plodding/Y
+plumpish
+plunderer/S
+plunk/RGDS
+plushy/T
+plywood/SM
+PM/M
+po/QY
+pocketknives
+podium/SM
+poetic/S
+poignant/Y
+pointillist/MS
+polariscope/M
+politicking/MS
+polka/DGSM
+pollinator/MS
+polo/MS
+polonaise/SM
+polonium/M
+polyethylene/SM
+polymer/Q8-qMS
+polynomial/MSY
+pomegranate/MS
+pompadour/SMD
+pompousness/S
+poncho/SM
+ponderer/SM
+pong/D
+pony/SM
+pool/GSDM
+popgun/SM
+popularities
+population/CMc
+populist/SM
+porcupine/SM
+portage's
+ported/A4EFCI
+porticoes
+port's/A
+pose/FNCRxDGSEX
+poses/IA4
+post-doctoral
+post-horn/MS
+postilion/MS
+post-impressionist/W
+postprandial
+post-town/MS
+potent/YIS
+potful/SM
+pothole/SMGD
+pot-pourri/SM
+pots/C
+pottery/SM
+potty/TS
+Poulenc/M
+powderpuff
+powered/cf
+powerhouse/SM
+powering/c
+praiseworthy/P
+praxes
+prayerful/P
+PRC
+prebendary/M
+precariousness/S
+precept/VvMS
+precise/NPIXY
+preciseness/IS
+prefect/MS
+prejudice/SDMG
+preliterate
+premeditated/U
+premier/MS
+pre-process/G
+presbyter/MZS
+presbyterial
+prescriptivism
+presser/MS
+presser's/I
+pressing/YS
+pressmen/M
+prestidigitate/Nn
+prestidigitator/M
+presumer/M
+pre-teen/S
+pretentiousness/U
+preterite/M
+prevaricator/MS
+pre-war
+pricer/MS
+prickly/T
+pride/DGj6SM
+Priestley/M
+primitivism/M
+primp/GSD
+principality/SM
+print/IDAGSaKc
+printout/S
+prise/FSAGD
+prissiness/S
+prize/M
+prizefight/RJSMG
+pro/SM
+pro-American
+probably/I
+probe/BnDGlS
+proboscis/SM
+procession/M
+procrastinate/SNGDn
+prodigy/SM
+produces/e
+producing/e
+productive/UY
+proffer/dS
+proficiency/SM
+programs/A
+prolonger/M
+promise/FRkDGS
+prophesy/RDSG
+prophet/1WSwM
+propulsive
+propylene/M
+prosody/WSM
+prospectus/MS
+prostate/SM
+prostitute/MGDS
+prostration/M
+protectionism/SM
+protective/SY
+proteolytic
+protozoon's
+protraction/MS
+provenance/SM
+proverbial
+providence/SIM
+provost/SM
+prudishness/S
+prune/DGRSM
+psych/1GSWDw
+psycho/SM
+psychophysical/Y
+psychotropic/S
+publicised/U
+publicized/U
+public-spirited
+pudenda
+Pudsey
+puerile/Y
+puff/RSZD2MG
+puffery/M
+pulsation/M
+pummel/DGS
+punditry/S
+punster/SM
+purée/DMS
+purer/I
+purge/DRSGNV
+puritan/wS1M
+purl/GSDM
+purloin/SDG
+purloiner/M
+purplish
+purposefulness/S
+pursuant
+pursue/DRSG
+push/SR72GzDZ
+pushcart/MS
+push-pull
+putrid/PY
+pyaemia
+pygmy/MS
+pyramidal
+pyrimidine/SM
+pyrolyse/SW
+pyroxene/MS
+Qa'ida/M
+qt
+quadrangle/MS
+quadrilateral/S
+quadriplegia/SM
+quadruped/SM
+quaff/DSG
+quagmire/SM
+quake/SGZD
+qualification/EM
+qualm/SM
+quarterer/M
+quarterstaff/SM
+quartic/S
+quasi
+quaternion/MS
+quay/SM
+queasiness/S
+quest/ADSRGM
+questioned/AU
+quiescence/SM
+quietness/S
+quintet/SM
+quit/RSGD
+quoin/DSMG
+quorate/I
+quotable
+rabbinic/Y
+rabid/PY
+RAC
+radar/MS
+radical/SQ
+radiochemistry/M
+ragamuffin/SM
+rage/eSMGD
+railer/M
+railing/M
+raillery
+rain-shadow/SM
+raise/RGDS
+ramble/kJDRSG
+ramekin/MS
+ramify/nSDGN
+ramjet/SM
+rampart/SM
+Ramsay/M
+Ranchi
+rand/2ZM
+rapacious/YP
+rape/SM3
+Raphaelite/SM
+rapprochement/MS
+raspberry/MS
+ratio/SM
+rational/s8-39Qq
+rattletrap/MS
+raunchy/TY
+razorback/MS
+razorbills
+readout/MS
+realness
+Realpolitik/M
+rearguard/MS
+reasonably/U
+reassemble/Y
+receipt/GMDS
+receive/DRGS
+received/U
+recessional/S
+reciprocation/M
+recite/R
+recompose/D
+recompute
+reconcilable/UI
+reconsign/G
+record/RJ37
+recouple
+recreate/x
+recrudescent
+recto/SyM
+rector/SMF
+rectory/SM
+recyclable/S
+redecorate
+redeemed/U
+red-faced
+redirection
+redolent
+redound/GDS
+reedy/PT
+reel/SRGDM
+refectory/MS
+reference/CDSG
+reflate/N
+reflexiveness/M
+reflexology
+reformism/M
+regalia/M
+regicide/SM
+regimen/SM
+Regina/M
+register/KdNSn
+registrar/SM
+regress/XGVDvSuN
+regularity/IMS
+rehabilitate/DNVGSn
+rehearsal/SM
+rehouse
+rein/GDM
+reinforced/U
+relater/SM
+relationship/MS
+reliably/U
+remind/G
+remobilise/B
+remorsefulness
+remorseless/YP
+remunerated/U
+Renfrewshire/M
+rennet/M
+renouncement
+renumber/d
+repairs/E
+reparation/SM
+repatriate/GnDNS
+repeat/BRDGh
+repent/SDG
+repletion/M
+reported/faU
+repository/SM
+reprehensible/Y
+represent/anNGSD
+representable
+repress/NuvXV
+reprisal/SM
+reproacher/M
+reprobate/GD
+reproducible/U
+repudiator/S
+repulsion/M
+re-release/DGS
+resection/G
+residence/MZS
+residue/SM
+resiny
+resistible/YI
+re-site/SDG
+resolute/IY
+resonant/Y
+resourceful/P
+respectfulness
+restive/P
+restraint/MS
+reticulation/M
+retract/DG
+retreat/G
+retrofire/SM
+retrofit/GSD
+retrospect/MvV
+return/7
+reunion
+reveal/RSD7Gk
+reverential/Y
+revocable/I
+rewarding/U
+rewed/GD
+rework/7
+Rhee/M
+rhenium/M
+rheostat/MS
+rhetorical
+Rhine/M
+Rhinelander/M
+Rhode/S
+rhombus/SWM
+Rhum/M
+rhymester/SM
+riboflavin/M
+Ricardo/M
+Richardson/M
+rickshaw/MS
+Rico/M
+ridiculer/M
+righteous/UY
+rightish
+right-wing
+Rinaldo/M
+ringworm/SM
+rink/MS
+riper
+ripping/Y
+Rita/M
+rite/SM
+ritual/QS8YM
+RMI
+roadblock/SM
+road-hog/S
+road-test
+roadwork/SM
+rockfall/S
+Rockford/M
+Rockwell/M
+rocky/T
+rod/SM
+Rodrigo/M
+rollick/SGkD
+romantic/8Q3MYS
+Rome/M
+Rona/M
+Ronan
+Rontgen
+room-mate/MS
+roomy/PT
+rootlet/MS
+rosemary/M
+rostrum/SM
+rottenness
+rotunda/SM
+roughen/dS
+roughneck/SM
+roundworm/MS
+route/aDSA
+routing/M
+Rowan/M
+rowdyism/SM
+rowel/MGDS
+RPO
+RSC
+rubber-stamp/DG
+rubdown/SM
+ruction/SM
+ruddy/PT
+Rudolf/M
+Rudolph/M
+Rudyard/M
+ruffian/SM
+ruffled/U
+Rufus/M
+rug/hSMDi
+runaway/S
+runners-up
+rural/Y
+rurality
+russet/MS
+rusticity/S
+Rutland/M
+Rwanda/M
+SA
+sabbatical/S
+saboteur/SM
+sabra/S
+saccharin
+sachet/SM
+Sachs/M
+sack/M6JS
+sacramental
+sacrilege/MS
+sacristan/SM
+saddlebag/MS
+SAE
+safekeeping
+safflower/SM
+sailborders
+sailing-ship/SM
+Salas/M
+salient/Y
+salinity/SM
+salivate/NDSG
+sally/DMSG
+saloon/SM
+salt/CSDG
+salter/SM
+salt-spoon/MS
+salve/RMSNnG
+sampled/c
+Sampson/M
+Sanborn/M
+sanctimony/SM
+sanctioned/U
+sandbar/S
+Sandusky/M
+sandy/T
+sangria/MS
+sanitary/UI
+sapience/M
+Sara/M
+Saran/M
+sarong/SM
+Sasha/M
+satanic
+satchel/SM
+satire/WQ8wM1S3
+saturnine/Y
+sauna/MS
+sawdust/M
+sawn-off
+saw-pit
+Saxony/M
+SBA
+Scala/M
+scale/DAGS
+scaled/U
+scallywag/SM
+scan/ADSG
+scansion/M
+scarceness
+scarer/M
+Scarlatti/M
+scatterbrain/MDS
+scenarist/MS
+scented/U
+scentless
+sch.
+scheduled/UA
+scheduling/A
+schemata
+schismatic
+schlep/GDS
+schoolbook/MS
+Schumann/M
+Schwartzkopf/M
+scissoring
+scold/DRJSG
+scoliosis
+scone/SM
+scorch/RSkGD
+scoreless
+scorn/jDRMG6S
+scornfulness
+scourge/SDMG
+scramble/UGCSD
+scratch/D2zJZRSG
+scratched/U
+screechy/T
+screwdriver/MS
+scribe's
+Scripps/M
+scriptwriter/MS
+scrotum/M
+sculler/Z
+sculpture/GDoSM
+Se
+sea/cS
+seabed
+sea-chest
+seagull/S
+seahorse/S
+seamier
+seamlessness
+Sean/M
+seaport/MS
+sear/GSDk
+seasonal/UY
+seat's
+Seattle/M
+secant/MS
+seclusion/M
+second/RGLSYD
+second-hand
+second-rate
+sectarianism/MS
+sectary/SM
+sedan/SM
+Sedgefield/M
+seedbed/MS
+seedling/SM
+seek/GRS
+segment/GonNMSD
+segue/DSG
+Seiko/M
+selenography/M
+self-closing
+self-consistent
+self-control
+self-correcting
+self-determined
+self-esteem
+self-evident/Y
+self-feeding
+self-governing
+self-immolation
+self-important
+selfish/UY
+self-knowledge
+self-locking
+selfness
+self-restraint
+self-revelation
+sell-off
+selvage/SM
+semblance/AMES
+semi-annual/Y
+semi-automatic
+semi-conscious
+semiquavers
+semisweet
+semi-weekly
+sempre
+Semtex
+send-off/S
+senescence/M
+seniority/SM
+senna/M
+sensational/Q83
+sensibleness
+sensualist/MS
+sent/FEKUA
+sentience/IM
+sentimentalist
+septa/M
+sepulchral
+sequences/FA
+sequestrate/SDG
+Sergio/M
+Seri/M
+sermon/Q8SM
+settable/A
+seventy-five/H
+seventy-seven/H
+sex-linked
+sexpot/SM
+sextillion/M
+sexy/T3
+sforzandi
+shade/MDpJSZG2
+shaded/U
+Shaffer/M
+shaggy/T
+shakeable/YU
+shaman/MS
+Sharon/M
+sharpness
+Shasta/M
+shatter-proof
+Shavian
+shear/RDGS
+sheathing/M
+sheave/DSG
+sheeplike
+sheepshank/SM
+sheet/DSMG
+Shelagh/M
+shelf/6M
+shelflike
+Shem/M
+Shenandoah/M
+sheriff/SM
+Sherpa/SM
+Sherwood/M
+shiatsu
+shiftlessness/S
+shifty/TP
+shin-pad/SM
+ship-fever
+shipowner/MS
+shipwreck/GMDS
+shirt/DpSMG
+shitty/T
+shiverer/M
+Shockley/M
+shod/zZ2
+shoemaker/SM
+shoestring/SM
+shooting-break
+short-range
+short-winded
+shorty/M
+Shostakovich/M
+shotgun/MS
+shot-put
+showroom/SM
+shrapnel/M
+shrike/SM
+shrimp/SM
+Shropshire/M
+shunter/M
+shy/DTSG
+Siam/M
+Sib/M
+sibilance/MZ
+sic/TDG
+siccative
+sickbay/M
+sick-benefit/SM
+side/ISAKef
+sidebar/MS
+side-bet
+side-door
+side-on
+side-stroke/SDMG
+sidle/DSG
+sightliness/U
+Sihanouk/M
+siltation/M
+Silurian
+silver/dMZS2
+silversmith/SM
+Simla
+Simms/M
+Simone/M
+Singaporean/S
+singlet/SM
+sing-song
+sinless/Y
+sins/A
+Siobhan/M
+Sisyphean
+Siva/M
+sixth-former/S
+sixty-nine/H
+sizzler/M
+skein/MS
+skeleton/MS
+skew/DPRGS
+skew-eyed
+skiff/MS
+skip/RSDG
+skyless
+sky-writing/SM
+slack/DGTRPYS
+Slade/M
+slain
+slapstick/M
+slash/SDGR
+slave-bangle
+sleep/R2MZGSzp
+sleepwear/M
+slenderer
+Sligo/M
+slink/GZS
+slippered
+slipshod
+sliver/dSM
+slobber/ZdS
+Slocum/M
+sloth/6Mj
+Slovene/S
+Slovenian/S
+slovenly/TP
+sludge/ZM
+sluggard/SM
+slump/GDS
+smallish
+smarty-pants
+smearer/M
+smiter/M
+smock/DGSM
+smother/Sd
+smoulder/Skd
+smuggle/RSGJD
+Sn
+snafu/MS
+snail/SM
+snakebite/SM
+snaps/U
+snatch/GDRS
+Sneed/M
+snoopy/T
+snore/GDRS
+snowbound
+snowfall/MS
+snowstorm/SM
+snowy/T
+Snyder/M
+soak/DGJS
+so-and-so/M
+soberer
+soberest
+social/Q8s39Sq-Y
+socialite/ZSM
+Sofia/M
+softly-softly
+soft-spoken
+Soho/M
+sojourn/RMDGS
+solenoidal
+sol-fa
+solicitousness
+solicitude/MS
+solider
+solidest
+Sol's
+solutes/E
+solute's
+solution/ASME
+Somalia/M
+somebody/SM
+somebody'll
+sometime/S
+somewhat
+somewhere
+sommelier/SM
+sonatina/SM
+songster/SM
+sonnet/MS
+sophist/S1yMWw
+sorcerer/MS
+sottish
+soufflé/SM
+sought-after
+soul/pS6Mj
+soundness/U
+soundproofing/M
+south/M
+south-east
+south-Easterly
+Southend-on-Sea
+southward/S
+south-West/M
+spaceship/SM
+space-time
+Spackle
+Spain/M
+spam/RDG
+Spaniard/SM
+spark/DYGZSM
+sparling/SM
+spate/SM
+spatio
+speakership/M
+special/Q-8q3S
+specialism/MS
+specialist/W
+specialness
+specificity/S
+specify/SBl1nRDWNG
+spectacle/DSM
+spectral
+specular
+speculate/NDnSvVG
+speculation/M
+speedy/TP
+speleologist/S
+spent/Ufcea
+spermatozoon/M
+spermicidal
+spheroid/oMS
+spice/DGSZM
+spiderwort/M
+spillover/SM
+spilt
+spiracle/SM
+spiritualism/MS
+spirituality/SM
+spiteful/PY
+splenetic
+splutter/dS
+spool/MRSDG
+spoonerism/SM
+spoon-feed/SG
+sportive/P
+sportsman/Y
+sportsmanship/M
+spot/2GDRSZzMp
+spotted/U
+springbok/MS
+spring-clean/D
+spring-loaded
+sprout/DGS
+spun
+squadron/MS
+squalid/YP
+squander/dS
+square/PMTDSYG
+squashy/TP
+squawk/RMDSG
+squeaky/T
+squid/MGDS
+squinter/M
+squireling
+SS
+SSE
+SSW
+st.
+stabling
+stably/U
+stadium/SM
+Stafford/M
+stage/SZBM2
+stagnancy/MS
+stagnate/nNDSG
+stalagmite/MS
+Staley/M
+Stamford/M
+staminate
+stanchion/SM
+stand-in/S
+Stanley/M
+Stanton/M
+Stanwood/M
+starch/SzMGD2Z
+stationariness
+stationery/MS
+status/MWS
+statutory/Y
+steadfast/PY
+steady-going
+steamboat/MS
+steel/DMGZ2S
+Stefanie/M
+stein/MS
+stellated
+stepchild/M
+step's/aI
+steradians
+stereography/MW
+stereoscopy/M
+Stevenson/M
+stew/DMGS
+stiff/YPTS
+stigmata
+stinky/T
+stipend/MS
+stirring/Y
+stocked/f
+stockinet's
+stockpile/DSG
+stock's
+STOL
+stomachful/S
+stomachs
+stonecutter/MS
+stoner/M
+stopgap/MS
+storehouse/MS
+stowaway/SM
+strangulate/GnSND
+stratagem/MS
+Stratford/M
+strawberry/SM
+stray/GDSM
+streamline/GDS
+strenuous/YP
+stress/cD
+stressing
+stretched/c
+stride/MSG
+strident/Y
+stringency/S
+striper/M
+strive/DSGJ
+Strolz/M
+structuralist
+Stuart/MS
+stubby/T
+stud/DSMG
+studied/U
+stuffs
+stupidest
+stupor/MS
+stutterer/S
+styli
+stylish/Y
+subaltern/MS
+subcultural
+subcutaneous/Y
+sublunary
+submerge/GDS
+submersible/S
+submicroscopic
+suborbital
+sub-Saharan
+subservience/M
+subsoil/MS
+subtenancy/SM
+subtype/SM
+suburb/SM
+suburbanite/MS
+subversive/PSY
+successive/P
+successor/SM
+Sudanese/M
+suffocate/SGkDnN
+suffragette/MS
+sugar/dMpS
+suggestive/P
+Sukarno/M
+sultan/SM
+summer/dZ
+summons/SGDM
+sunbonnet/MS
+sunburnt
+sun-dried
+sunflower/SM
+sung/U
+sunlamp/S
+sunlit
+Sunnite/MS
+sunset/SM
+supercomputer/MS
+supercomputing
+superior/SMY
+superiority/SM
+supermodel/S
+superstore/S
+supposed/Y
+supremo/M
+surcharge/GDSM
+Surinam/M
+surrender/Sd
+survival/SM
+Susan/M
+Susanne/M
+suspecting/U
+suspense/M6
+suspension/M
+Susquehanna/M
+Suzette/M
+Sven/M
+swaddle/DGS
+SWAK
+swampy/T
+swank/GDT2ZSz
+Swanson/M
+swarm/MDSG
+swatch/MS
+swearword/MS
+Swedish
+sweetbread/SM
+sweetened/U
+sweptback
+swim/SRG
+swinishness
+swoon/DSG
+swore
+Sydney/M
+syllabification/M
+symbiosis/M
+symbiotic/Y
+symbol/13WQ8-qSwM
+synclinal
+syndrome/SM
+synonymousness
+synonymy/SM
+syntax/SM
+synthesise/ADGS
+syrupy
+system/W1SM
+systematic/S
+systemic/Y
+Ta
+table/MSGD
+tablecloth/SM
+tabloid/SM
+tabular/Y
+tactile/Y
+tactility
+taffeta/MS
+Tagalog/M
+tailor/dSM
+Taipei/M
+take/RfGSJ
+takeaway/S
+takes/IacA
+taking/Aac
+talebearer/MS
+tally-ho's
+Talmud/W3M
+tamarack/MS
+tank/GMR6DS
+tantalum/sQ-98qM
+Tantalus/M
+tantamount
+taper/d
+taramasalata
+tardiness
+target/dSM
+tarragon/MS
+tarry/DTSG
+Tarrytown/M
+tasting/S
+Taunton
+tauten/dS
+tawdry/PTY
+taxies
+taximeter/SM
+Taylor/M
+TDD
+tea-leaves
+tearaway
+teaspoonful/MS
+teazle
+technocrat/WS
+Teledyne/M
+telefax
+telegraph/WZD1GSM3R
+telegraphy/3M
+telephony/M
+telephoto/S
+telex/SDGM
+Telford/M
+tell-tale/SM
+tempestuous/Y
+temporary/FS
+tempts/F
+tenant/MGSD
+tendentious/PY
+tenderfoot/MS
+tendinitis
+tens/xNTSDXG
+tensioned
+termagant/SM
+terns/I
+terrapin/MS
+territorial
+territory/MSo
+tertian
+testate/I
+testicle/MS
+tetanus/M
+tête
+tetrachord/SM
+tetraplegia
+tetravalent
+than
+thaw/DGS
+Theadora/M
+theft/MS
+their/S
+Theodore/M
+Theodosius/M
+theory/Qs-89q3MS
+therapist/SM
+Theravada/M
+there/M
+thereby
+thereto
+therewith
+thermoelectric
+thermopile/M
+thermostat/1MSW
+they
+thicket/MS
+thievish
+thigh-bone/MS
+Thimphu/M
+think/RJ7GS
+thirty/HMS
+thirty-onefold
+Thoreau/M
+thorn/M2ZS
+thoroughfare/MS
+Thorpe/M
+thou
+thought's
+thrash/RJSDG
+three-phase
+thrice-married
+thrive/DSkG
+throws/c
+thuggish
+thumb/DGMS
+thump/MGSD
+Thurrock/M
+thyrotrophic
+ticket/SMdZ
+tickety-boo
+tie/RSMDG
+tie-break
+tier/D
+Tijuana/M
+Tim/ZSM
+timely/TP
+time-spans
+time-work
+timpani
+tin/DGZSMz2
+tincture/DSMG
+tinker/dMS
+tinkle/DSGY
+tinny/TP
+Tipperary/M
+tippet/SM
+tips/zZ2
+tobacconist/MS
+Tobago/M
+toboggan/S3rMd
+tock/GMDS
+today/M
+together
+toiletry/MS
+tolerate/NDGBSn
+tomboyish
+tom-tom
+tonelessness
+Tonga/M
+tonight/M
+tonne/MS
+top-heavy
+topic/MS
+topping/M
+tore
+Torfaen/M
+torn
+tornadoes
+toroid/oSM
+torrent/SM
+Tórshavn/M
+torsion/MSo
+tortilla/MS
+tortoise/MS
+tortoiseshell/SM
+toss/GRSD
+toss-up/SM
+totality/SM
+totter/Sdk
+tough/GYPTSD
+tourmaline/SM
+tout/DSG
+tower/dk
+Towsley/M
+tracheae
+traffic/DRMGS
+trampoline/SM
+transcendental/3
+transform/R7
+transformed/U
+transgress/NSDVGX
+translatability/M
+translation/aSM
+translator/MS
+transmogrify/nSDNG
+transposed/U
+transsexualism/MS
+Transvaal/M
+transvestite/SM
+Transylvania/M
+trap/JSRDMG
+Trappist/SM
+tray/SM
+treachery/MS
+treasonous
+treatable/U
+trenchancy/SM
+trendsetting
+trendy/T
+Trevino/M
+Trevor/M
+trialling
+triangle/SM
+triceps/M
+trichinoses
+trickle/DSG
+tricolour/SDM
+trident/SM
+trimmed/U
+trimming/M
+trinket/SM
+triode/SM
+triphthong/S
+triple/SGD
+tripodal
+tripping/Y
+triumphalism
+triumvirate/MS
+troika/SM
+Trojan/MS
+troll/DGMS
+trolled/F
+trousered
+truce/SM
+trudge/SDG
+Trudi/M
+truffle/MS
+Trumann/M
+trusty/TMS
+tsar/S
+tsarina's
+TTL
+tub/drSMZ
+tuberculin/M
+tuberculoses
+Tudor/SM
+tuft/DSGZM
+tularaemic
+tulle/MS
+tumble-drier
+tumidity/SM
+tummy/MS
+tuneless/Y
+Tunisian/S
+turbocharger/SM
+turbofan/MS
+Turkic/M
+Turkmenistan/M
+Turks/M
+turn-down
+Turpin/M
+turret/MS
+turvy
+Tuskegee/M
+tut/SGD
+tutor/dSM
+Tuvalu/M
+twang/DGZSM
+twenty-eight/H
+twenty-twenty
+twiddle/YGDS
+twine/SM
+twinkle/YGDS
+two-sided
+Tyler/M
+typeset/RSG
+typewriter/MS
+typo/3MS
+tyranny/8SQ1Mw
+Tyrone/M
+tzarina/MS
+UAR
+Ugandan/S
+ugliness
+UK/M
+ulster/MS
+ultralight/S
+ultramontane
+ululation/M
+Ulysses
+um
+unaffected
+unbeknownst
+uncloak/G
+uncompress/G
+uncouthness
+uncover/d
+undaunted/Y
+undercount
+underdog
+undergone
+underneath/S
+undersea
+understandable/Y
+understanding/aM
+understudy/M
+uneatable
+unenviable
+uneven
+unfeminine
+unhappiness
+unhurt
+unicast
+unisex
+unit/d
+universal/8QS
+unmistakable/Y
+unmistakeable/Y
+unprofessional
+unrelated
+untidy/T
+unwieldy
+UPC
+upland/SM
+uppercut/S
+uppish
+uprising/SM
+upstream
+urbanism/M
+urbanity/MS
+Uriah
+urinal/SM
+urinalyses
+useless/Y
+usherette/SM
+usurp/DRNSnG
+usurpation/M
+utile/-8qQ
+utterance/SM
+uttered/U
+Uzbekistan/M
+v
+vacation/M
+vaccine/NnMS
+vacuousness
+Vader/M
+Vaduz/M
+vaginal
+vainglory/SM
+valediction/SM
+valency/SM
+Valerian/M
+valet/SMd
+valorous/Y
+valuation/f
+valued/Ufc
+valuer/SM
+van/SM
+Vandyke/M
+Vanessa/M
+varicoloured
+vaudeville/SM
+vault/RSGMD
+VAXes
+vectors
+veg
+vehement/Y
+vendor/SM
+Venezuela/M
+venial/Y
+venous/Y
+ventriloquist/MS
+veracities/I
+veracity's/I
+verifiability/M
+vermouth/MS
+Vernen/M
+verse's
+versification/M
+vessel/SM
+VG
+VHS
+viable/Y
+vibrate/DGnyNS
+vibrator/SM
+vice-like
+vice-President/SM
+viceroy/MS
+vicious/Y
+Vick/M
+victor/MS
+videodisc/MS
+vii
+viii
+vilification/M
+villi
+Villiers
+Vince
+Vincent/M
+vinyl/M
+viol/MS73
+violates
+virago/MS
+Virginian/S
+Virgo/SM
+virologist/S
+virtuosity/SM
+viscid/Y
+viscous/Y
+viscus
+visible/IY
+vision/yGM
+visionary/S
+visioning/K
+visitor/SM
+vita/oM
+vitae
+vital/Q8S-q
+vituperate/DnNSVvG
+viz.
+Vlei
+vocative/YS
+voiceless/Y
+voilà
+vol-au-vent
+volition/oMS
+volitional
+volitionality
+Volkswagen/SM
+voltaic
+voraciousness
+VP
+VPN
+vulpine
+waddle/DSG
+wag/DdrSMG
+waggishness
+waggle/DSG
+wakefulness
+Walbridge/M
+walkway/MS
+wall-to-wall
+Wally's
+Walsall/M
+wander/JSdr
+wanderlust/MS
+warmed/A
+warm-heartedness
+warmongering/M
+warmth/M
+wars/C
+Wartburg/M
+washboard/MS
+wastrel/SM
+watched/U
+Waterhouse/M
+Watson/M
+watt/SM
+Wausau/M
+wavelike
+waver/dkS
+way/SM
+we/GzJ
+wean/SDG
+weanling/M
+weathervane/SM
+Webber/M
+Wedgwood/M
+wed's
+weep/SZG
+weighty/YT
+weir/SM
+well-earned
+Weller/M
+Wellesley/M
+well-founded
+well-structured
+well-tried
+welter/d
+Wembley/M
+wench/MS
+Wensleydale/M
+werewolves
+Werther/M
+Westhampton/M
+wetness
+wharves
+what/M
+wheat/M
+Wheaton/M
+wherefore/S
+whereon
+whetstone/MS
+Whiggery
+whimsy/S
+whippet/MS
+whisper/kdrJS
+whitefly
+white-hot
+Whitlock/M
+who/M
+who'd
+wholeness
+whomever
+whoopee/S
+whoosh/GMDS
+wickedest
+widen/rdS
+Wilde/M
+wile/DSMG
+Willa/M
+Williamsburg/M
+Willis
+Winchester/S
+Winckelmann
+windburnt
+windedness
+windjammer/MS
+windowpane/SM
+wind's
+Winnipeg
+wino/MS
+winter/cdS
+Wirral
+wishy-washy
+wistfulness
+wit/zSM2pPGZD
+WNO
+woe/jSM6
+Wolcott
+Wolfgang
+wombat/MS
+womenfolk/M
+won
+wontedly/U
+Woodberry
+woodblock/S
+woodcock/SM
+woodlice
+woodpecker/MS
+woodworm/M
+woollen/S
+Worcester
+word-blindness
+work/ADeScG
+workably
+workaround/MS
+workbench/SM
+workhorse/MS
+working-class
+work's/e
+workspace/S
+worm-eaten
+worst-case
+wouldn't
+wow/GSD
+WRAF
+wretch/MiDhS
+wriggle/YRDSG
+Wrigley
+wring/RGS
+written/fUcaA
+xiv
+Yahweh
+yak/M
+yardage/MS
+yearlong
+year-round
+yeast/SM2Z
+yippee
+yo
+yoke's
+Yorktown
+youngish
+youth/jSM6
+Yule
+yum-yum
+Zadie'
+Zeitgeist
+Zellick'sF
+Zen
+zero/GSDM
+zest/6Mj
+Zimmerman/M
+zinc/M
+zirconium/M
+Zoroaster
+Zoroastrian/S
+A
+abalone/MS
+abdomen/MS
+Aberdeenshire/M
+abettor/SM
+abidance/MS
+abide/kGDS
+able/nVvYNT
+abnegation/M
+abominable/Y
+absentia/M
+absent-minded/Y
+absent-mindedness/S
+absolutism/SM
+abstention/MS
+abstracted/P
+abstractness/S
+absurdity/MS
+abundant/Y
+abyss/SM
+acceptableness/S
+acceptant
+acclaim/DSG
+accredit/Snd
+accreted
+acerbic/Y
+acetate/SM
+ache/DGkZSM
+ached/FKA
+acknowledge/LRGShD
+acorn/MS
+acquaint/ASDG
+acquaintanceship/S
+across
+acrylate/M
+activate/SINnDCG
+activation/IMCA
+actuality/SM
+ad/AC
+Adam/SM
+adapted/P
+ADC
+addenda
+addressee/MS
+adeptness/S
+adequate/IYP
+adiabatic/Y
+adieu/S
+administrate/DGSvV
+administration/M
+admit/SANDGX
+admonition/SM
+ado/M
+adopts/A
+adrenalin
+adventist/S
+adversary/MS
+advice/MS
+Aeneid
+aeolian
+Aeolus
+aeration/M
+aetiology/W1wM
+AFAIK
+affectation/M
+affection/EMS
+affine
+aflame
+afraid/U
+afterlives
+Agaa/M
+agglomerate/nVDNSG
+aggression/MS
+aggressiveness/S
+Agnes/M
+agriculture/M3oS
+aid/RGDS
+Aidan/M
+aim/RGDpSy
+airbase/S
+aircraft/M
+airfare/S
+airfield/SM
+airline/RMS
+airmail/DMG
+alack
+Alameda
+Albanian/MS
+Albrecht/M
+albumen/SM
+Alderney/M
+algaecide
+algebraist
+Algeria/M
+Ali/M
+alienist
+alimony/SM
+aliphatic
+al-Jazeera
+all-clear
+allot/SLGD
+alluvia
+alluvions
+ally/SGD
+almighty/P
+aloofness/S
+alphanumeric/YS
+Al-Qa'ida/M
+Alsatian/S
+also
+alternative/PMS
+aluminium/M
+alveolar/Y
+alveoli
+am/A
+Amalie/M
+amanuensis/M
+amaretto/S
+Amarillo/M
+amaze/LDhkGS
+amber/MS
+ambidexterity/SM
+ambrosia/MSo
+ambulation/M
+ambulatory/S
+ambuscade/SMDG
+Amerada
+Americana
+amicable/PY
+amidst
+amity/MS
+amnesiac/SM
+Amoco/M
+amorousness/S
+amorphousness/S
+amphora/M
+amphorae
+amt.
+analects
+analysable
+analysand/MS
+analytical
+anaphora/1WM
+Anatolian
+anchor/m5dSM
+Andes
+Andrew/MS
+Angelo/M
+anger/MdS
+Angola/M
+Anheuser/M
+anhydride/M
+animateness/I
+animé
+anisotropy/MWS
+annal/3SM
+annexation/M
+announced/U
+annual/Q8YS
+annuitant/SM
+annuity/SM
+anode/8MQSW
+ant/E
+anterior/SY
+anthology/Q8SM3
+anthropic/a
+anti-aircraft
+anti-Americanism
+anti-apartheid
+anticancer
+anticommunist/MS
+antidote/SDMG
+anti-heroes
+antiparticle/SM
+antiperspirant/SM
+antiquary/SM
+antitheses
+Antrim/M
+anxiety/SM
+anxiousness/S
+anything
+apartheid/M
+aperiodicity/M
+aperture/DMS
+aplomb/SM
+apparatchik/S
+appearance/AMES
+appendices
+appendix/MS
+applause/MS
+application/AM
+applying/a
+Appomattox
+appreciably/I
+appreciator/MS
+apprehensible
+apprehension/aMS
+apprise/kSGD
+appropriable
+apricot/MS
+apse/SM
+aquifer/MS
+Arabic/M
+arachnoid/M
+arbitrageur/S
+archaic/Y
+archaism/MS
+archduke/MS
+archetypal
+archiepiscopal
+architectonic/S
+arenaceous
+arid/PY
+arithmetic/YM
+Arkansas/M
+Arkwright/M
+Arlen/M
+arm/RELGDS
+armature/DMGS
+armchair/SM
+Armco
+arraign/LGDS
+arranges/AEK
+arrestee/SM
+arrival/MS
+arrive/GSD
+arrogation/M
+arrow/MGSD
+arroyo/MS
+Artemis
+arterioscleroses
+artificial/P
+ascendency
+Asheville/M
+Ashford/M
+Ashton/M
+ashtray/SM
+Asian/SM
+Asimov/M
+askew
+asphalter
+aspic/MS
+assen
+assent/GMSD
+assertion/MAS
+assessed/A
+asst
+Assyrian/M
+astern
+Aston/M
+astraddle
+astral/Y
+astringency/SM
+astronautic/S
+asylum-seeker/S
+ate/c
+Athena/M
+Athens/M
+athletics/M
+atomicity/M
+attainable/P
+attar/MS
+attendant/MS
+attested/U
+attester/M
+Aubrey/M
+auctioneer/DSMG
+audiophile/MS
+august/YPT
+Augustan
+aura/WSMo
+aureole/MDSG
+auricular
+auscultation/M
+auspice/SM
+austere/YPT
+Austin/M
+Austrian/MS
+authentication/M
+author/Qs-9d8qSM
+authoress/S
+authoritarian/S
+authorization/M
+authorize/KA
+autistic
+autograph/GMSD
+autoloader
+automation/M
+autorepeat/GS
+auto-suggestibility/M
+auxiliary/S
+avant
+aviatrices
+avocado/MS
+avouch/DSG
+avowed/Y
+awakened/A
+awkward/YPT
+Azores
+Babbage/M
+back/eM
+backbone/MS
+backdrop/DSMG
+backhoe/S
+backrest/SM
+backspace/DGS
+back-up/S
+backyard/SM
+bad-egg
+badminton/M
+bad-tempered
+Bahamas/M
+Bahrain/M
+bailer
+baldness/S
+baleful/TP
+balefulness/S
+ballad/MyS
+balladry/SM
+Ballard/M
+balloonist
+ballot/dMS
+Ballymoney/M
+banal
+Banbury/M
+banking/M
+banner/d
+Bannerman/M
+bannock/MS
+baptist/SM
+barbarism/SM
+barbarize/DSG
+barbiturate/SM
+bare/YPDTSG
+barehanded
+bareheaded
+bargain-basement
+barge/DmMSZG
+barked/C
+barleycorn/SM
+Barlow/M
+barmen/M
+barn/MDS6G
+Barnum/M
+baronetcy/SM
+Barrichello/M
+barrier/MS
+barrio/MS
+Barron/M
+bartender/SM
+baselessness
+basher
+basis/M
+bass/S3M
+Basseterre/M
+bat/FdMS
+battleaxe
+bauxite/M
+bawl/DGS
+bazaar/MS
+beach/GSDM
+bear/JlRSG7
+beastly/TP
+beaux/M
+Beaverton/M
+bêche
+bed/F
+bedder/SM
+bedsit/S
+bedsore/SM
+bed-wetting
+beehive/SM
+Beelzebub/M
+beet/MS
+beetle/DMSG
+befall/GS
+before
+beginning/M
+begrudger
+behavioural/Y
+behove/DS
+believable/YU
+bellicose/YP
+belligerent/YSM
+bellybutton/SM
+belting/M
+bemuse/DLhSG
+bent/U
+Benton/M
+bequest/SM
+bereave/LGDS
+Bergerac/M
+berm/MS
+Bernadette/M
+Berne/M
+berrylike
+Bertha/M
+betide/DGS
+bêtise
+betoken/dS
+Bette/MZ
+better-off
+bi/M
+bibliography/Ww1MS
+bibulous
+bicycle/RG3SMD
+biddy/SM
+bide/S
+bighead/MS
+bigotry/SM
+billion/MHS
+biochemist/SyM
+biodegradability/S
+biofeedback/SM
+biography/SM
+biology/w3MW1S
+biomass/MS
+biometric/S
+biometry/WM
+bionics/M
+biotin/MS
+bipartite/Y
+bipedalism
+biretta/MS
+Birmingham/M
+bisect/GSD
+bison/M
+biter/SM
+bitmap/MS
+bitter/YPSd
+bitterest
+bitwise
+blackberry/MSG
+blackener/M
+Blackfoot/M
+blackhead/SM
+blackish
+blackness/S
+Blanche/M
+blandish/DGLS
+blandness/S
+blazon/Sd
+bless/hGSDiJ
+blitheness/S
+blithering
+bloc/GDMSR
+blockade/DMGRS
+Blomberg/M
+blond/PMST
+blood-lust
+bloodsucker/MS
+bloodthirsty/PTY
+blotch/SGMZD
+blowpipe/MS
+bluebill/M
+bluebonnet/SM
+bluesy/T
+blunder/dkrJMS
+blurring/Y
+blurter
+blushing/UY
+BMW/M
+boast/DRG6jJS
+boasting/e
+boat/MDRGS
+bobble/SGMD
+boccie/SM
+body-blow
+Boer/SM
+boll/MS
+bollard/SM
+Bologna/M
+bolometer/WSM
+Bolshevism/M
+Bolshevist/WMS
+Bolshoi/M
+bolt's
+bombproof
+bond/MmDJRGS
+bonemeal
+bonito/MS
+bonus/MS
+bookbind/RGJ
+bookbinding/M
+bookkeep/RGJ
+bookmarker
+boolean
+boonies
+boor/MS
+bootprints
+Borden/M
+border/dMS
+borderline/MS
+borrowing/M
+borstal/MS
+Bosnia-Herzegovina/M
+Boston/M
+bothersome
+Botswana/M
+bougainvillea/M
+boulevard/MS
+bound/ADSG
+bourgeoisie/MS
+bourses
+bower/d
+bow-legs
+bowlful/S
+bowstring/DMGS
+boyscout
+BP
+bracelet/SM
+bracer/M
+Brachiopoda
+bracken/SM
+bracteal
+Bradley/M
+Bragg/M
+braggadocio/MS
+Brahmanism
+braider/M
+braiding/M
+bramble/GMYDS
+Brandenburg/M
+Braun/M
+braveness/S
+braze/DSG
+bread/HDMSG
+breakout/MS
+breastfed
+breasting/M
+breastwork/MS
+breezy/TPY
+Brentwood/M
+Brest/M
+brevet/MGDS
+brewer/Z
+bric/DG
+bricklaying/SM
+brickmason/S
+brickyard/M
+Briggs/M
+brilliance/SMZ
+brindle/MDS
+briner/M
+bristly/T
+bristols
+bro
+broaden/Srd
+broad-mindedness
+broadside/SMGD
+Bromley/M
+Bromwich/M
+brontosaurus/SM
+broom/GMSD
+browbeaten
+Bruce/M
+brucellosis/M
+Bruckner/M
+brusque/PTY
+brutish/PY
+bucket/Sd6M
+Buckingham/M
+buckling/M
+buck-passing
+budget/rSdM
+Budweiser/M
+buffalo/M
+buffet/SdJM
+Bulawayo'sc
+bulky/TP
+bullfinch/MS
+bullheaded/P
+bullied/M
+bullshit/RSDMG
+bullying/M
+bummed/M
+bung/GMDS
+bunghole/SM
+bunker/d
+bunting/M
+burgeon/SDG
+burier/M
+burlesque/DYRMSG
+burnout/MS
+burr/MS
+bursting
+Burundi/M
+busmen
+butterfingered
+buttoner/M
+bye/MS
+byname
+Byrd/M
+byroad/MS
+CAA
+cabdriver/MS
+cabinet/MyS
+cachet/MdS
+cad/MZS
+cadenza/MS
+cafeteria/MS
+cairn/DSM
+cajolery/SM
+cake/MDGS
+calamitous/PY
+calculated/aA
+callous/PDYSG
+calmness/S
+calumet/MS
+cam/MSD
+camber/dMWS
+Cambridge/M
+Cambridgeshire/M
+Camino
+camisole/MS
+camphor/SM
+canard/MS
+cancel/RDGS
+Candace
+candelabra/S
+candidacy/MS
+candy-striped
+cannier
+canny/UPY
+canst
+cant/DCRGS
+cantabile
+cantaloupe/SM
+capability/ISM
+capacitance/SM
+capitalised/Uc
+Capote
+capricious/YP
+Capricorn
+cap's
+carapace/MS
+carbonyl/M
+carburettor/SM
+carcase/MS
+carcass/MS
+carcinoma/SM
+card/DERGS
+cardiac/S
+cardinality/MS
+cardsharp/RMS
+caregiver/S
+carillon/MS
+Carlton
+carol/DRGSM
+carotene/SM
+carousal/SM
+carouse/RGDS
+carpentering/M
+Carr/M
+Carrie
+carry-on
+carthorse/MS
+Cartier
+carton/dMS
+cartoon/G3DMS
+cartoonist
+Cartwright
+carve/RSJGDy
+carven
+casaba/SM
+casbah/M
+cascade/GDSM
+cashier/GMDS
+cassia/SM
+castanet/SM
+Castlereagh/M
+castrato
+cast's/e
+casualty/SM
+casuist/SMWy
+catafalque/SM
+catalyse/SDWG
+Cauchy
+causality/MS
+causative/S
+Cavan/M
+cayenne/MS
+cease/CDSG
+ceaselessness/S
+cede/FKAGDS
+ceiling/MSD
+celebration/M
+celesta/SM
+celestial/Y
+cement/RGDSM
+censor/dSM
+censorious/PY
+censure/GRMSD
+Centralia
+centre/GDRMJ3WoS
+centripetal/Y
+cerebration/M
+ceremoniousness/SM
+ceremony/SMo
+CERN
+certain/UY
+certainty/USM
+Chablis
+chain's
+chairperson/SM
+chalet/SM
+chamberpot/S
+chamomile/MS
+chancy/T
+changeability/MS
+changeably/U
+change-ringing
+Chantilly
+characteristic/UY
+characteristics
+Chardonnay/S
+charming/T
+charted/U
+chasing/M
+château/SM
+chattiness/S
+chauvinism/MS
+cheapish
+cheddar/S
+cheerio/S
+cheesecloth/MS
+cheetah/SM
+Chelmsleywood
+chemiluminescent
+chemotherapeutic/S
+chequebook/MS
+cherry/MS
+chess/mSM
+Cheviot/SM
+chiaroscuro/MS
+chief/SMa
+chigger/SM
+childproof/GD
+chipmunk/MS
+chiral
+chirography/SM
+chiropody/3SM
+chiropractic/MS
+chiropractor/SM
+chisel/RDSGJM
+chivalry/WSM
+chloroform/GDSM
+choirmaster/SM
+choosiness/S
+chorion/M
+chorister/SM
+Christendom
+christened/U
+Christmastide
+chuck/SDGM
+chukka/S
+chute/SGMD
+cicerone/SM
+cider/CMS
+cinch/DSGM
+Cincinnati
+cinema/WMS
+circumpolar
+cirrhoses
+citation/MA
+citing/I
+citizen/MYyS
+Citroen/M
+clad/JGS
+claim/ERSGCAD
+clam/GMzZD2S
+clammy/TP
+clamshell/SM
+claptrap/MS
+clarinet/MS
+clarinettist/MS
+clarion/MDSG
+clasp-knife
+classicality
+classy/TP
+clatter/dSZk
+Clausen
+claustrophobia/SM
+clave/FM
+clayiest
+cleanse
+clearway/M
+cleat/GMDS
+clef/SM
+Cleveland/M
+cliché/MS
+clichéd
+cliff/SM
+climatology/S3Mw1
+clinch/SRGkD
+clipping/M
+clique/DMGSZ
+close-fitting
+clot/GDMS
+clothe/UGD
+clotheshorse/SM
+clouded/cU
+clue/pMDGS
+Clwyd
+Clyde
+CMG
+CNAA
+coagulate/nGSDN
+coalescence/SM
+coarsen/dS
+coast-to-coast
+coater/S
+coating's/c
+cob/GMSD
+Cobb/M
+cobweb/MZSGD
+cobwebby/T
+cocci/MS
+co-channel
+cochlea/MS
+cochlear
+cock/zGMDZS2
+cock-and-bull
+cockneyism
+cock-of-the-walk
+cocktail/GDSM
+cocoon/MGSD
+codicil/SM
+coequal
+coffee/SM
+coffee-house/SM
+Cohn
+coin/RMDG
+Colbert
+collagen/M
+collate/GSD
+collect/bSivDV7hG
+collectivism/SM
+collector/MS
+collects/A
+collegian/MS
+Colombo/M
+colonelcy/SM
+colonial/S3
+colophon/SM
+colour-fast/P
+colt/MS
+coltish/PY
+combinator/oWSM
+combustion/MS
+Comdex/M
+comeliness/S
+comely/PT
+comes's
+comicality/SM
+commemoration/M
+commendation/AM
+commiseration/M
+commitment/cS
+commodious/PIY
+commonness/U
+communion/MS
+commutator/M
+commute/R
+Comoros/M
+comp/DGS
+compaction/M
+companionship/SM
+comparabilities
+compartmental/-8qQ
+compassionate/P
+compatriot
+compete/SDG
+competency/IS
+complacent/Y
+complement/DMGSRN
+composed/PY
+compressibility/MI
+compression/MC
+compulsion/M
+computerese
+concerns
+concerted/E
+concierge/SM
+conciousness
+conclude/RNGXDSvVu
+concoct/SDGV
+concordance/MS
+Concordia
+concurrence/SM
+condemnatory
+condescension/M
+condom/SM
+conductance's
+confabulate/NSnDG
+confidant/SM
+confirm/nANGSD
+confiscation/M
+conflate/GnDSN
+conflictual
+confound/h
+congruence/ZMS
+congruent/Y
+conical/P
+conifer/MS
+coniferous
+conjectural
+conjugal/Y
+conjunctivitis/SM
+connective/MS
+connector/SM
+connexion/SM
+connive/RSDG
+conscience/p
+consecrated/U
+consecration/MA
+consequentiality/SM
+consistory/MS
+consolation/EM
+consolidated/AU
+consolidation/M
+conspectus/MS
+conspicuousness/SI
+constancy/IMS
+consternate/DnNGS
+constraint/SM
+constructionist/SM
+constructor/SM
+contaminator/SM
+contemplate/VNDvuGn
+content/LEDhGMS
+contested/U
+continent/oYSM
+contingency/MS
+continua/on
+continuousness/E
+contract/GbD
+contrail/M
+contrariness/S
+contrary/PSY
+contravener/M
+contribute/DvGVy
+contribution/SM
+contrive/RDSG
+control/BRMSlG
+controlled/U
+convenor
+conventionalism/M
+conversation/Mo
+conversationalist
+converser
+convolution's
+Cooke/M
+cookery/M
+Coolidge
+cooling-off
+cooperage/MS
+coordinated/U
+coper/M
+coquetry/SM
+cordite/MS
+core/MDRGS
+Corey/M
+coriaceous
+corn/R2ZSMzDG
+cornea/SM
+Coronado
+coronation/M
+corporates/I
+corporeal/IY
+corpuscle/MS
+correctness/S
+corrigendum/M
+corrigible/I
+corroborate/DSnVvGyN
+corrupt/VPTbvSDGY
+corrupter/M
+corruption/MS
+corticosteroid/MS
+cosiness/S
+cosmology/1S3Mw
+cosponsor/Sd
+cost-effective
+cost-effectiveness
+Costello
+costliness/S
+cot/RMSD
+cottered
+cougher/M
+councillor/MS
+countdown/MS
+counter-claim/GSMD
+counter-culture/SM
+countermand/SGD
+counterpoint/DSMG
+countersunk
+countess/SM
+country/5mMS
+couplet/MS
+course/SMFE
+courteous/YEP
+court-martial
+covalent/Y
+covariate/SN
+covered/EAU
+covert/PY
+covertness/S
+cover-up/S
+cowl/DGMS
+cowrie/SM
+coxcomb/MS
+coyote/SM
+cozenage/SM
+crag/MZS2
+crane-flies
+Cranford
+cranky/TP
+crap/GDMZS
+crash/RSDGk
+crass/TYP
+crayon/MdS
+creaminess/S
+creature/YSM
+creaturely/P
+credulous/PY
+creekside
+creep/RZSG2z
+creepy/PTS
+crenellated
+cretonne/MS
+crevasse/MGDS
+crib/DRGSM
+criminalise/CnDSG
+criminalize/CGNnDS
+criterion/M
+criticise/k
+criticize/k
+croaky/T
+Croat
+crone/SZM
+crookeder
+crosier/SM
+crossbow/mSM
+cross-bred/S
+cross-grained
+cross-refer/S
+crow/MDSG
+crozier/SM
+crude/PTY
+cruelty-free
+crumby/T
+crump
+crunch/RSDZG2
+cruse/SM
+Crustacea
+crustal
+cryostat/M
+cryptanalysis/M
+crystallise/AnDSG
+CSA
+cue/DaMSG
+cuisine/MS
+Culloden
+Cully
+cultivator/MS
+culture/SMoDG
+cumbersome/PY
+cumulate/DNvGnSV
+cumulation/M
+curfew/SM
+curio/SM
+currently/AF
+curse/M
+Curtis
+cussedness/M
+cw
+cybernetic/S
+cycled/A
+cyclopaedia/MS
+cyclotron/MS
+cynic/SMY
+Czechoslovakia/M
+Czechoslovakian
+dachshund/SM
+Dacron
+Dada
+daddy/SM
+Dahl/M
+dalliance/MS
+dame/MS
+dammit/S
+damn/lDGkNS7n
+damneder
+damnedest
+dampen/drS
+Dan/ZM
+dance/SDRG
+dapperest
+darken/rdS
+darning/M
+Dartford
+dash/GRSDk
+dastardliness/S
+dateline/SMDG
+dauphin/MS
+Daventry
+Davidson
+davit/SM
+dazzle/SRGkD
+dBm
+DCM
+deathly/T
+death-roll
+debaucher/M
+debouch/DGS
+debtor/SM
+decapitator/MS
+decayer
+decease's
+deceitfulness/S
+deceptiveness/S
+decide/DBGVivhNxXuS
+decided/U
+decisioning
+decking/M
+declaim/y
+declared/KUA
+décolletée
+dedicatory
+deduce/DGnbNVvS
+deep-fried
+deep-laid
+deer/M
+defalcate/GDSNn
+defalcation/M
+defeated/U
+defectiveness/S
+defiant/Y
+deflatable
+Deirdre/M
+deist/WMS
+DeKastere
+Delaney/M
+delectation/SM
+delicateness/S
+delicatessen/MS
+deliquesce/GDS
+deliverance/SM
+Delphi
+Delport
+demagoguery/SM
+demagogy/MW
+demander/M
+demarcate/SNGnD
+demarcation/M
+democratic/UY
+demolish/DSG
+demoniac/S
+demonstrative/UY
+demount/7
+demythologise/n
+dental/Y
+dentifrice/MS
+dependency/MS
+deprecation/M
+Derbyshire/M
+dereliction/MS
+dermis/SM
+derogate/NVSGnyD
+descend/FSGD
+desert/RGMDS
+deservedness/M
+designs/A
+desirability/UM
+desorption/M
+despair/SkDG
+despot/1W
+deterers
+determinable/IP
+determining/KA
+determinism/SM
+determinism's/I
+deterrence/SM
+dethrone/LG
+detonation/M
+d'être
+deviousness/S
+devoid
+devotional/S
+dewar
+dexter
+Dhabi/M
+diabolic/Y
+diacritic/MSY
+diagnosable
+dialectal
+dialectic/MS
+dials/A
+diamond/MSDG
+diary/3MS
+diastole/WSM
+diathermy/MS
+diatribe/MS
+dickiest
+die-cast
+differentiator/MS
+difficulty/MS
+digestion/MS
+digitalis/M
+digression/M
+Dillon
+dilute/PYVGDS
+dinette/MS
+dipterous
+directivity/M
+directness/IS
+directorate/SM
+dis/M
+disagreeable/S
+disallow
+discipleship/SM
+disciplined/UI
+disclosed/U
+discography/MS
+discoloured/M
+discomfit/d
+discontinue/nN
+discourage/LDGk
+discrepancy/MS
+discrimination/MI
+disgracer/M
+disjunctive/S
+dismalness
+dismay/DSk
+disparate/PSY
+dispel/DGS
+dispensary/SM
+dispersion/M
+disposable/S
+disposition/KMI
+disputable/I
+disrepute/M
+dissimilar/S
+distancing/e
+distinctive/P
+distortion/SM
+distract/GhikD
+distributive/YPS
+dither/Sd
+dividing/A
+divisive/P
+Dixieland
+dizzy/PTYDSGk
+docile/Y
+dockyard/SM
+Dodgson/M
+dodo/MS
+doesn't
+d'oeuvre
+dog-box
+dog-eared
+doggy-paddle
+dog-leg/D
+dogmatism/SM
+dog's/f
+dogtooth/M
+dog-tooth
+dogtrot/GSDM
+doily/SM
+do-it-yourself
+dolomite/SWM
+domes/W
+Domesday
+domesticate/SGD
+dominator/M
+Domingo/M
+Donovan
+doodle/SRGD
+Dooley/M
+dopiness/S
+dorm/RMS
+Dorothea/M
+dote/S
+double/SRDGY
+double-dealing
+doublespeak/S
+doubletalk
+doubting/Y
+doughnut/GMDS
+dourness/S
+dovecot
+dovecote/MS
+downgrade/SGD
+downriver
+downy/T
+dozenth
+dragon/MS
+drain/GRSMD
+dreadful/P
+dreadnought/SM
+dredge/GRMSD
+driftwood/SM
+drilling/M
+drink/7SGR
+drivenness
+driveway/SM
+droner
+drool/DRSG
+drop-in
+drove/GSDR
+drowsy/PTY
+drug/DMGS
+druggie/TS
+drumhead/M
+drunkenness/S
+Drury
+drywall/GDS
+Du
+dual/S
+ductility/MS
+duct's/F
+duffel/M
+dug/S
+Duisburg
+dumbbell/SM
+dumpiness/S
+Dumpty
+dune/MS
+Dunkirk/M
+Dunstable
+duplicator/MS
+durum/MS
+dustbin/SM
+dustman/M
+dusty/TP
+duteous/Y
+dutiful/U
+dynamo/MS
+dysfunctional
+DZ
+e
+each
+earliness/S
+earthbound
+earthly/PT
+earthwork/SM
+easel/SM
+easier
+Eastbourne/M
+eastern/R
+Eastertide
+Eastwood
+easy/UY
+Ebola
+Ecclesiastes
+ecclesiastical
+eclectic/SY
+econometrics/M
+Ecuador/M
+Eddie
+edgy/TPY
+edification/M
+Edinburgh/M
+Editor
+editorial/s3Q89SY
+EDT
+Edward/MS
+EEG
+efferent/YS
+effervesce/SGD
+effusion/M
+egger/M
+egocentricity/MS
+Egypt/M
+eidetic
+eightpence
+eighty/HMS
+eighty-eight/H
+eighty-four/H
+Eire/M
+élan/M
+elater/M
+elderflower
+elect/DAGS7
+electrocution/SM
+electrodynamic/SY
+electroencephalogram/SM
+electromagnet/W1MS
+electronics/M
+electrotherapy
+element/SMo
+elephantiases
+elevate/DSnGN
+Elgin
+eligibility/IMS
+Eliot
+Elisha/M
+elite/S3M
+ellipse/SMW
+Ellsworth
+Elmira
+eloquent/IY
+Elton/M
+elusiveness/S
+Elvira
+emasculate/DSGNn
+embroider/rZdS
+embroil/DLSG
+emergent/S
+emeritae
+emery/MS
+Emmanuel
+empanelled
+emphases/c
+emulator/SM
+enchilada/MS
+encircle/DGSL
+enclosed/U
+encrypt/GSD
+endemic/SY
+endless/PY
+endlessness/S
+endoscope/MSWZ
+endure/SGklD
+end-user/S
+energetic/YS
+energised/U
+enfranchise/EDLSG
+enfranchiser/SM
+engorge/LDSG
+engrained
+engram/M
+enhanceable
+enigma/SWM1
+enjoyable/P
+enlargeable
+enlighten/dSL
+enormity/SM
+enough
+entanglers
+enterprise/RSGMk
+entice/SRLkJGD
+entrust/DGS
+enumerating/A
+enuresis/M
+envelop/LrdS
+enzymatic/Y
+epidemic/MYS
+epidemiology/SM31w
+episcopacy/SM
+episcopate/SM
+Epstein
+equally/UF
+equiangular
+equip/LDSG
+equiproportionate
+equivocator/SM
+eradicator/SM
+Eratosthenes
+erecter
+erectile
+erection/SM
+ergosterol/MS
+Erie
+Erika/M
+Erin
+Erlang/M
+Ernest
+Esau
+escaper/M
+escapology
+Eskimo/S
+ETA
+etalon
+ethane/M
+Ethiopia/M
+ethnic/SY
+Eugenia
+eugenicist
+eunuchs
+euphony/SM
+evacuation/M
+eve/yMS
+evenest
+even-handedness
+Everett
+evergreen/S
+Everhart/M
+ever-increasing
+everliving
+evermore
+everybody/M
+ex
+exactly/I
+exceeder/M
+excision/M
+exclusion/My
+excommunication/M
+exculpation/M
+excursionist
+exemplify/SGRnND
+Exeter/M
+exhalation/M
+exhibit/XVdSN
+exhibitor/SM
+exhorter/M
+exigent/SY
+exiguity/MS
+existentialist/W
+exogamous
+exoskeleton/MS
+exoticism/SM
+expandability/M
+expanded/U
+ex-partners
+expectancy/MS
+expectoration/M
+expendable/S
+expense/MGSD
+expensive/IPY
+experimental/3
+experts
+expiate/GyNnSD
+expired/U
+expiry/MS
+explainer/SM
+explanatory
+explored/U
+exponent/SM
+exposed/U
+ex-president
+expressible/IY
+expressiveness/SI
+extol/SDG
+extorter/M
+extortionate/Y
+extradition/SM
+extrapolate/SDnGNV
+extruder/M
+eyebrow/SM
+eyesight/MS
+Fabergé/M
+fabrication/MK
+facelessness
+facial/YS
+faculty/SM
+fadeout
+faeces
+faerie/M
+fail-safe
+failure/MS
+Fairchild
+Fairfield
+fairground/SM
+Fairmont
+falsity/SM
+familiarize/k
+fantasia/MS
+farad/MS
+farce/w1MS
+far-flung
+Fargo
+Farrell
+farther
+fas
+fatten/drS
+fatuous/PY
+fatwa/MS
+faze/DGS
+fearful/TP
+feather-head/D
+Feb
+feebleness/S
+feeds/c
+feelingly/U
+feign/RGSD
+feisty/T
+Felixstowe/M
+feminine/PYS
+feminist/SM
+femur/MS
+fencepost/M
+fermentation/M
+ferociousness/S
+Ferrari/MS
+Ferris
+ferroelectric
+festering
+festiveness/S
+feta/MS
+fetish/M3S
+fettuccine/S
+fiasco/SM
+fibre/MSD
+fibreboard/SM
+fibrous/PY
+fibula/M
+fiction/MSOo
+fictitious/YP
+fictive/Y
+fiddle/RGYMJDS
+fidelity/IMS
+fie/y
+fief/MS
+fiery/TYP
+fiesta/MS
+fifty-nine/H
+fifty-second/S
+Figaro
+figurations/4
+figuring/S
+Fiji/M
+file/CaSAGD
+filet's
+Fillmore
+film-maker/S
+filth/2ZSMz
+fin/DZGowMdS
+finality/SM
+financier/SDGM
+Finnegan
+fire-fighter/SM
+fire's
+firewall/S
+firing/MS
+firmer
+fishnet/SM
+fish-plate/S
+fissure/GDSM
+fixable
+fixture/MS
+flagellum/M
+flagging/YU
+flagstone/SM
+flamboyant/Y
+flank/eSDG
+flaps/M
+flashback/MS
+flashcard/S
+flashgun/S
+flat-head/M
+flatware/MS
+fleabag/SM
+flecker
+flexure/M
+flightiness/S
+flincher/M
+flirtatiousness/S
+flora/MSo
+floridness/S
+flotation/SM
+flotsam/SM
+flout/GRDS
+flt
+fluorite/MS
+fluster/dS
+flutelike
+flux's/I
+flyblown
+flyer/SM
+flyhalf
+fo'c's'le
+focused/U
+foetid/Y
+foetus/MS
+foist/DSG
+folio/SGMD
+folks/Z2
+folk-ways
+fondant/MS
+Foote
+footing/M
+footmen/M
+footrace/S
+footsore
+foppishness/S
+forbore
+foregoes
+foremost
+forepeople
+foresee/BGRS
+foreseeable/U
+forested/AC
+forests/AC
+foretaste/MGSD
+forgery/SM
+forge's
+forgo/RG
+forgotten/U
+fork/D6GSM
+forker
+formal/qsQ89P3-
+Formica
+formula/MSn
+Forrester
+forsaken
+fort/MZS
+forthcoming/U
+fortunate/UYS
+forty-second/S
+forward-looking
+fount/MS
+fountain/SDMG
+fountain-head/SM
+fourpenny
+foursome/MS
+foveae
+fowler/M
+fowl-run
+foxed/e
+foxhole/MS
+fox-hunting
+foxtrot/DMGS
+fractionation/M
+fragment/NGMSnD
+frailty/SM
+francium/M
+Franck
+frantic/YP
+fratricide/SM
+fraudulent/Y
+freedom/SM
+freehold/RSM
+free-standing
+Freetown/M
+free-wheel/DGS
+freeze-dried
+frenetic/Y
+frescoes
+fretboard
+fretsaw/S
+friary/MS
+friendliness/SM
+friendly/TU
+friendship/MS
+frightfulness/S
+frigid/PY
+fringe/IDGS
+Frisbee
+frisky/TP
+fritterer/M
+frontrunning
+front's
+frost/CSGD
+frowziness/S
+fructify/DSG
+fruit/X6jNdpSM
+frustrater/M
+f-stop/S
+ft/C
+FTC
+fuck/DRSMGJ
+fuel/MRGDS
+fullest
+full-wave
+fully-fledged
+fumy/T
+function/SMyGopD
+functor/SM
+fundamentalism/MS
+fundholders
+funicular/SM
+furnishing/M
+furthermost
+fuss/SD2ZMGz
+fusser/M
+fut
+Gaborone/M
+Gael/W
+gaggle/SGD
+gal/GkDM
+Galatians
+Galilee
+Gallicism
+gallows/M
+galvanise/nSDG
+galvanize/NnSDG
+galvanometer/MSW
+gander/dMS
+gang/DMGSY
+gangland/MS
+ganglia/M
+gannet/MS
+gaol/RDGMS
+Garcia/M
+Gardner/M
+Gareth/M
+garland/SDMG
+gaseous/YP
+gassy/PT
+gastritides
+gastroenteritis/M
+gastronome/Z1SwM
+gateway/MS
+gathered/AI
+gathering/M
+gaucheness/S
+gaucho/MS
+gauntness/S
+gawkiness/S
+gearbox/MS
+gee/dGMS
+geisha/M
+gelatin/MS
+gelatinous/PY
+gen/GD
+genera/onWM1Vv
+generic/S
+generousness/S
+Geneva/M
+genially/F
+genocide/SM
+genteel/PY
+gentleness/S
+Geoffrey/M
+geographer/MS
+geometrician/M
+Geraldine
+geriatrics/M
+Germantown
+Germany/M
+gerontology/3SMw
+gerund/MS
+geyser/dMS
+ghost-wrote
+GHQ
+Gifford
+gig/GMSD
+gild/RJGDS
+gimlet/MS
+Gina/M
+gingerly/P
+girlie/M
+girlish/PY
+giving/aY
+gladiator/SM
+glamour/GMDS
+glanders/M
+glare/kSDG
+glassful/MS
+glass-maker/MS
+glass-paper
+glaucoma/MS
+glim/M
+gloater/M
+globular/YP
+globule/SM
+gloss/DMZGSz2
+glottalization/M
+glow-worm/SM
+glue-sniffing
+gluier
+glumness/S
+gluteus
+glycerolized/C
+glycine/M
+GMO
+gneiss/MS
+gnomelike
+gnostic
+goatherd/SM
+godchild/M
+God-forsaken
+godlessness/S
+godson/MS
+goldbrick/MDRSG
+goldfish/SM
+Golgotha
+Goliath/M
+gonadal
+Gondwanaland
+gonococcus
+gonorrhoea/M
+good/YPZS
+GOP
+Goren/M
+Gorgonzola
+goshawk/SM
+gourd/M6S
+government/a
+GPSS
+grades/A
+gradual/YP3
+gradualist
+gradualness/S
+grammarian/MS
+grand/TYSP
+grandmaster/SM
+grantsmanship/S
+grapheme/M
+graphic/PS
+graphics/M
+grapnel/SM
+grasping/P
+grassers
+gratefully/U
+gratuitous/PY
+gravitas
+grazes/c
+grease's
+greathearted
+greed/2ZSzM
+greediness/S
+Greeley
+Greene/M
+greenhorn/MS
+greening/M
+Greenwich
+Greer/M
+Greig
+Grenadian/S
+Grenoble
+grew/cAe
+greybeard/M
+grill/GSD
+grimace/RMDSG
+Grimm
+grinner/M
+grip/rRdGMDS
+grisaille
+grizzly/TS
+groggy/TP
+Grosvenor
+Grumman
+grumpiness/S
+Gruyère
+g's
+guacamole/SM
+Guadalupe
+Guerre
+Guerrero
+guesstimate/GDS
+guest/DGMS
+Guggenheim
+guidance/MaS
+Guido
+guilelessness/S
+guitar/3MS
+gum/G2DZMS
+gumboil/SM
+gunfight/RMS
+gunk/MZS
+gunman/M
+gunny/MS
+gunrunner/MS
+gunship/S
+gushy/T
+gusted/E
+gutsy/PT
+gutta
+gutter/d
+guttersnipe/SM
+gymnosperm/SM
+gynaecological/MS
+gynaecology/S3wM
+gypping
+habeas
+habiliment/MS
+habitat/MS
+habited/IF
+habitualness/S
+habituate/NnSDG
+haemophilia/MS
+haemorrhoid/MS
+hafnium/M
+haft/MDGS
+Haili
+hailstorm/SM
+hajjes
+hale/SIDG
+half-baked
+half-breed/SM
+half-mast
+half-moon
+halfness
+half-timbered
+half-yearly
+hall-stand/S
+handbook/SM
+handrail/MS
+hands/Uc
+handshaker/M
+handsomely/U
+handspring/SM
+hangout/SM
+Hanover
+haploid/S
+happy/TUY
+harden/rdS
+hardiness/S
+hardness/S
+hard-on
+hard-pressed
+harebell/SM
+harem/MS
+Hargreaves
+harmlessness/S
+Harold/M
+harrow/MGDS
+Harvard
+harvestman/M
+Harwell
+Harwich
+Hattie
+hauler/c
+Hauser
+Havana/M
+haven't
+haw/GMDS
+Hawley
+Hayden/M
+hayer
+Haynes
+haystack/MS
+Hayward
+haywire
+head-hunt/DGSR
+headlight/MS
+headline/DSMG
+headphone/SM
+headrest/MS
+headroom/SM
+headstall/MS
+headwater/S
+heal/DGRS
+healed/U
+heartache/SM
+heartland/MS
+hearty/TSP
+heatproof
+heatwave
+heave/RSGZD
+heavy-duty
+Hebraism
+hectometre/SM
+heedful/P
+Hegelian
+Heidelberg
+heigh
+held
+Helen/SM
+helium/M
+he'll
+Hellenise/DGnS
+Hellenize/DGS
+Heller
+helm/mSGMD
+Helmholtz
+helter
+henceforth
+henry/M
+hep
+hepatitis/M
+herbalism
+herbicide/SM
+herbivore/SM
+Hercules
+heresy/SM
+heritability
+heritor/IM
+hermaphroditism
+Hermaphroditus
+hermitage/SM
+heroes
+heroic/S
+heroine/MS
+Herschel
+Hester/M
+heterosexuality/SM
+hewn
+hexagonal
+hey
+Hialeah
+hidden/U
+hideousness/S
+high-born
+highfalutin
+high-flyer/S
+high-handed/PY
+high-level
+highness/S
+hill/2MGYS
+hillwalker
+hilly/PT
+Hillyer
+Hilton
+hind/R
+Hindenburg
+Hindustan/M
+hinge/USGD
+Hippocratic
+hippodrome/SM
+hirsute/P
+hist
+histochemic
+hitherto
+hoary/TP
+Hobbs
+hoity-toity
+holdall/SM
+Holland/M
+hollow/PDTGSY
+Holman/M
+Holt
+homily/SM
+hominid/SM
+homology/SMw
+homotopy
+homunculus
+Honda/M
+honer/S
+honeybee/SM
+honorific
+honour/E7MRlDGS
+hooey/MS
+Hoosier
+hoppled
+Horace
+horribleness/S
+horrify/1SWGDk
+Horsham
+horsiest
+hortatory
+hose/M
+hospitable/YI
+hotel/mSM
+hound/GSMD
+houser
+housing's
+Howard
+Howell
+hoyden/dMS
+html
+hubbub/M
+hubris/MS
+Hudson
+huff/GMZDSz2
+hulling/M
+humanitarian/S
+humiliation/M
+hummus/S
+humourlessness/S
+Hun/S
+Huntingdon/M
+Huntingdonshire/M
+huntress/SM
+hurl/DYSGR
+hurly-burly
+hurrier
+husbandry/MS
+hush/DGS
+Huxley
+hydrated/AC
+hydrogen/nMN
+hydrogenating/C
+hydrometer/SM
+hydrotherapy/MS
+hygienic/U
+hypercellularity
+hypersensitive/P
+hypersensitivity/MS
+hyphenate/SGD
+hypnosis/M
+hypothalamic/Y
+hypothesis/d8rM9QS
+hypoxaemia
+Iberian/SM
+icebound
+icon/SWM
+iconoclast/MWS
+ictus/SM
+I'd
+idealism/SM
+idiosyncrasy/SM
+Igor/M
+illumination/M
+illusionary
+illusive/PY
+I'm
+imaginative/UY
+imaginativeness/U
+immanent/Y
+immediateness/S
+immense/YPT
+immersion/M
+immunoassay/M
+immutable/P
+impala/M
+impaler/M
+impassibility/SM
+impeached/U
+impeccability/SM
+impecuniousness/S
+imperialism/SM
+impermeable/Y
+implementation/SM
+imply/VuGNvnh
+imposing/Y
+impregnable/PY
+impressed/U
+impressive/U
+improvisational
+impulsive/P
+impunity/SM
+inbreed/SGJ
+incantation/M
+incantatory
+inclination/EM
+incongruence
+inconsolable/PY
+incontestability/MS
+incorruptible/SY
+increasable
+incubate/DNSGVn
+incubus/M
+incurious
+incurs/XN
+Ind.
+indebtedness/S
+indefinable/PS
+indemnify/NDnSG
+Indiana/M
+Indianapolis
+indigence/SM
+indignant/Y
+indignation/SM
+indirect/GP
+indiscriminate/PY
+indoctrinator/SM
+ineptitude/MS
+inevitable/YP
+inexact/P
+inexhaustible/YP
+inexpedience/M
+inexpressible/SP
+infallible
+infect/EDGAS
+infected/U
+infecter
+infectious/YP
+inferno/MS
+infirmary/SM
+infix/M
+influential/Y
+influenza/MS
+inform/aNGDS
+infra-red/M
+infringe/L
+Ingersoll
+ingest/DGbVS
+inhabitance
+inherent/Y
+inheritor/S
+inhibiting/U
+inhold/JG
+initialness
+initiated/U
+inkiness/S
+inky/TP
+inmate/SM
+innocent/TYS
+innocuous/PY
+innuendo/DGMS
+innuendoes
+inoperative
+inquest
+inquire/kRDGZ
+inquisition/SoM
+insatiable/PY
+insecticidal
+inside/R
+insight/6j
+insinuator/SM
+insistent/Y
+insomuch
+inspector/SM
+inst/g
+instalment/MS
+instead
+instep
+insulate/DSnNG
+insurmountable/Y
+intangible/M
+intelligencer's
+intelligentsia/MS
+intelligible/UY
+intemperate/P
+intensification/M
+inter/ELDG
+interaxial
+interbred
+intercede/GSD
+intercensal
+intercommunicate/DGnNS
+interconnect/GDiS
+interferometry/M
+interleukin/S
+interlock/GSD
+interlocker/M
+interlude/MS
+intermediary/MS
+intermediation/M
+inter-modal
+intermodulate/SD
+internecine
+internee/SM
+internist's
+interoffice
+interpenetrates
+interpolation/M
+interpretative/Y
+interspecies
+interventionist/S
+interview's/K
+interweave/SG
+intestate/S
+intra
+intraline
+intramuscular/Y
+intransigence/MS
+intrauterine
+intrinsic/YS
+inundation/M
+inventive/P
+inventory/MDSG
+invests/A
+inveteracy/SM
+invidious/YP
+invigoration/MA
+inviter/M
+invulnerability/M
+ion/s9MWqQ8-S
+ipecac/SM
+ipso
+Ira
+Irene
+irk/DSG
+ironwork/MS
+irremediable/PY
+irritate/BnSkNhVDG
+irrupt/DGVS
+Irving
+Isabel/M
+islet/MS
+isomer/MS
+isothermal
+Israelite/SM
+ISSN
+issuance/SM
+issuing/A
+iteration/M
+Ivan/M
+J
+jackpot/MS
+Jackson/MS
+Jacksonville
+jaded/P
+Jagger
+jaguar/MS
+jambalaya/SM
+jape/GSMD
+jar/MG6JSD
+jarring/Y
+Jayasuriya
+jerky/TP
+jerry/M
+jerry-built
+jess/M
+jet/MDGS
+jetsam/MS
+jet-setted
+jibe/S
+jitterbug/RGSDM
+Jo/M
+jobless/P
+jocundity/MS
+Jodie
+jog/RJDSG
+jointing/E
+jounce/SGD
+journalism/SM
+journalist/W
+Jove
+joy/pMDG6jS
+joyous/YP
+jubilee/SM
+judgement/o
+judgement-seat
+juggle/RySDG
+juiciness/S
+Juliana
+julienne/S
+jumpsuit/S
+Jupiter/M
+justifiably/U
+Kafka
+kaftan
+Kahn/M
+Kalamazoo
+Kannada
+Kanoa/M
+Kasprowicz
+kazoo/SM
+KDE
+Kenneth
+Kenny
+Kenosha
+kerning
+Kerr/MZ
+ketone/M
+ketosis/M
+Kewaskum
+keyboardist/S
+KGB
+Khabarovsk
+kickback/MS
+kiddie/S
+Kieffer/M
+kif
+kilogramme/S
+kindler/M
+kingbird/M
+king-size/D
+Kingstown
+Kingwood
+kinkiness/S
+Kiwanis
+kleptomaniac/SM
+knee-jerk
+knuckleduster/S
+Koch
+Kodak/M
+Kodiak
+kookiness/S
+Korea/M
+Kowloon
+Krebs
+Krugman
+kudos/M
+kurtosis/M
+kW
+kyle/SM
+Kyushu/M
+labelled/U
+lacteal
+lacuna/SM
+lad/MRDJSG
+ladle/GSMD
+laggard/PYMS
+lagniappe's
+Lagos/M
+Lagrangian/M
+laid/Aacf
+lake/SM
+Lalo
+lam/GSD
+lambkin/SM
+lampoon/SDGM
+lancet/MS
+landward/S
+Lang/M
+languisher/M
+lank/T2PYZ
+lankiness/S
+lanolin/SM
+lapdog/S
+lappet/MS
+lard/FMS
+lardy/T
+large/TPY
+Larine
+Larsen
+larynx/M
+lassitude/MS
+Laszlo/M
+late/PTY
+latex/SM
+LaTeX/M
+lather/d
+latherer/M
+latitudinarian/S
+latitudinary
+Latrobe/M
+latte/S
+lauder/M
+launching/S
+lavage/SM
+lawbreaker/SM
+lawfulness/MS
+Lawson
+lawyer/YMdS
+laxness/S
+laymen/M
+laziness/S
+le/Gz3
+league/FMDGS
+leapt
+leathern
+Leda
+Lee
+leftward/S
+legacy/SM
+legality/ISM
+legate's/C
+Legendre/M
+legible/IY
+legislative/S
+legroom/SM
+Leighton
+leisureliness/S
+leitmotif/MS
+Leland/M
+lemme/JG
+lemur/SM
+Len/M
+lengthiness/S
+lengthwise
+leniency/SM
+Leno
+Lenore/M
+lens/SDGM
+lenser/S
+Leominster
+leopard/SM
+leopardess/MS
+lessor/MS
+letterpress/MS
+level-headedness/S
+Lewis/M
+Lexington
+liability/SAM
+libation/M
+Liberace
+liberality/SIM
+liberalization/M
+liberalness/SM
+liberator/MCS
+library/SM
+Libreville/M
+licence/SM
+licensable
+licensor/M
+lichenology
+Lichfield
+licit/IY
+lickerish
+life/RpM
+life-and-death
+lifespan/S
+ligand/MS
+lightening/M
+light-headed
+lightship/SM
+Lilliput
+limber/dUS
+limeade/MS
+limper/M
+lineage/MS
+linefeed
+link-up/S
+Linn/M
+Linton
+lion/QSM-s
+lipase/M
+Lipschitz/M
+liq
+liquidity/SM
+lisp/RMSGD
+Lister/SM
+listlessness/S
+litany/MS
+lithography/MS
+Lithuanian
+litigant/MS
+liverwort/MS
+living/eA
+Livingston
+Livonia
+Ljubljana/M
+llama/MS
+LLB
+loaded/AKcU
+lob/MRDGSZ
+lobular/Y
+lobularity
+locative
+locator/SM
+lock/RSDGM7
+locked/UA
+locksmith/SMG
+locomotion/MS
+locomotive/YMS
+lodged/E
+lofter/M
+loganberry/MS
+logic/IMSY
+loin/SM
+Lois
+Londonderry/M
+long-awaited
+Longbridge
+long-faced
+longhorn/SM
+long-sighted/Y
+long-standing
+longueur/SM
+long-waisted
+lookup/MS
+loosing/U
+lore/SM
+lorn
+lorry/MS
+losable
+loss/SpMZ
+lot/MS
+lotion/MS
+Louisville/M
+lout/MS
+low-born
+lower-case
+low-income
+lowlight/MS
+lowly/PT
+lubrication/M
+lucidity/MS
+Lucille
+lucky/TUY
+Ludmilla
+luger
+lugubrious/PY
+Luke/M
+Lumière/M
+lunchpack
+lunch-time
+lurcher/M
+luxuriant/Y
+Lyman/M
+Lyme
+lynching/M
+lyrical/P
+lyricist
+ma/FMS
+macabre/Y
+machine-readable
+macromolecule/SM
+macroscopic/Y
+made/AU
+Madrid/M
+Madsen/M
+madwoman/M
+Mae/M
+Mafioso/M
+Magdalene
+maggoty/T
+magnification/SM
+magpie/SM
+Maguire
+mahatma/MS
+Mahayana
+maidservant/MS
+mail/RS7GDMJ
+mailshot
+Maine
+mainframe/SM
+mainland/RMS
+mainmast/MS
+mains/M
+mainspring/MS
+majorette/MS
+makeshift
+Malabo/M
+malachite/SM
+malaria/SM
+malarkey/SM
+Malay
+Malayan/MS
+Male
+malignant/Y
+mallet/MS
+managed/U
+manager/oSM
+managerial
+managership/M
+Manama/M
+Manchester/M
+mandarin/SM
+mango/MS
+mangold-wurzel/S
+mangy/T
+manhunt/SM
+manifolder/M
+manipulatable
+manliness/S
+man-sized
+mantelshelf
+Manton
+mantra/SM
+manumit/XNSGD
+Manx
+mappable
+march/DRSG
+margarine/SM
+Marge/y
+Marianne/M
+Marina
+Marjorie
+marked/AU
+markka/M
+marl/SGDM
+Marlborough/M
+Marline/M
+marmalade/SM
+marquetry/MS
+marriageability/SM
+marriages/A
+married/S
+Marshall/M
+Martha
+martinique
+Martinson
+Marty
+marvel/GDS
+marvellous/Y
+Marxism
+Maryland/M
+mascara/DGSM
+mash/RJSGDM
+masquerade/MRSDG
+masseuse/SM
+Massey/M
+mastectomy/SM
+masterliness
+matchbook's
+Mathematica
+mathematician/MS
+Mathias
+Mathieu
+matriarch/MZ
+matriculate/NSGDn
+Matsumoto/M
+Mattel
+maturate/SGD
+matzo/MS
+Maureen
+Mauricio
+Mauritanian/S
+Maxwell/M
+Mayfair/M
+mayhap
+mayoralty/MS
+mayorship/M
+Mayotte/M
+maypole/MS
+Mazda
+mazer
+mazy/T
+Mbabane/M
+McCarty/M
+McCormick/M
+McIntosh/M
+McLaren/M
+McLaughlin/M
+McMillan/M
+McPherson/M
+mdse
+measurer/M
+meatball/SM
+meatloaves
+mechanizer/M
+mediated
+mediator/SM
+medic/NYVnMS
+medical/S
+medicine/MoS
+mediocre
+Medway/M
+meeting/M
+Meg/M
+mega
+megabuck/S
+megabyte/S
+megalomania/MS
+megalomaniac/SM
+mélange
+Melanie
+membranous
+memoir/SM
+mendacious/PY
+menial/YS
+mensurable/F
+mentholated
+meow/DSG
+Mercedes-Benz/M
+merchantmen/M
+meromorphic
+merrymaker/SM
+Merthyr
+meshes
+mesmerizing
+messianic
+mestizo/SM
+metabolic/Y
+metacentre/W
+metallic/S
+metallurgy/1MSwW
+metamorphic
+metaphysical
+metastases
+metatarsus/M
+metempsychosis/M
+metropolitan/S
+mgr
+micelles
+microbicide/M
+microeconomic/S
+microeconomics/M
+microfiche/M
+microfilm/GDMS
+micro-organism/SM
+microword/S
+mid-air/SM
+Middlesex
+midland
+midlander
+midlives
+midway
+midyear/SM
+MIG/S
+might/S2Zz
+mightiness/S
+Mignon
+Mikhail
+milepost/SM
+miler/M
+milestone/MS
+militarisation
+militate/SGD
+militia/mSM
+millenarianism/M
+milligram/S
+millilitre/S
+millivoltmeter/SM
+millstone/SM
+Millwall
+Milquetoast/S
+Milwaukee
+mincemeat/SM
+mind-numbing/Y
+mined/f
+mineral/Qq8-SM
+mineralisation/CS
+mineralogy/Mw3S
+miniature/GQ3S8M-qD
+minicam/MS
+ministerial
+minke
+minnesinger/MS
+minority/SM
+minstrelsy/SM
+misbrand
+miscall
+misclassified
+miscommunicate
+miscreant/SM
+misery/MS
+misgiving/SM
+misguided/P
+mishandle/G
+misnomer/SM
+misogamy/M3S
+misplace/L
+missal/MSE
+mistime/G
+mitosis/M
+mitt/SM
+mobility/SMI
+Mobutu
+mocha/SM
+mock-up/S
+mod/oS
+modal
+modality/SM
+moderation/MI
+modify/NnRSBGD
+Mohamed/M
+Mohammedanism
+Mojave
+molestation/M
+momentariness/S
+Monaco/M
+monastic/YS
+monetarism/S
+monetary/3Y
+money-changer/S
+Mongolian/S
+'mongst
+monitor/MSd
+monk/SM
+monkeyshine/S
+monogamousness
+monomaniacal
+monomial/MS
+Monongahela/M
+mononucleoses
+monopolist/W
+Monrovia/M
+monster/MS
+montage/SMDG
+moonbeam/MS
+moonlighting/M
+moonstruck
+Moore
+moose/M
+moralist/W1
+morally/I
+Moreen
+moribund/Y
+moroseness/S
+morph/SDJG
+Morpheus/M
+morphogenesis
+morrow/MS
+mortal/IYS
+mortar/dMS
+mortgagee/SM7
+mortifier/M
+mortify/GhnSND
+mortuary/SM
+mosaic/MS
+mote/SMV
+motes/C
+motherboard/MS
+mothers-in-law
+motocross/MS
+motorcycle/3GSM
+motorised/U
+mottle/SGD
+mottoes
+mouldboard/MS
+mountain/SM
+mournfulness/S
+mousiness/S
+movably/I
+moveable/PSY
+movement/SM
+MPs
+ms
+mucous
+muddlehead's
+mug/2JMRGZSD
+Muire/M
+mukluk's
+Mullen/M
+multicultural
+multilateralists
+multilevel/D
+multilingual
+multiplexor/SM
+multiversity/M
+mummification/M
+mummify/SNDGn
+mumps/M
+mundaneness
+municipality/SM
+Munroe/M
+murder/rdSM
+Murillo/M
+murmuring/S
+murmurous
+Muscat/M
+muscularity/SM
+mushiness/S
+musician/MSY
+musketeer/SM
+mutability/IMS
+muted/Y
+mutely
+muteness/S
+mutiny/DSGM
+myopia/SM
+mystery/SM
+mythologise/CSGD
+mythology/SQM31w
+n/NnxVvu
+nacho/S
+nacre/MS
+naffness
+naiveness
+naivete/Z
+Nakayama/M
+namely
+nark/SMZ
+narrowband
+nascences/A
+natch
+nationalism/SM
+nationally/4
+nationwide
+natl
+naught/z2MZ
+navigation/M
+naysayer/S
+NBA
+NBS
+NCO
+necessitous
+necessity/MS
+neckerchief/MS
+necropolis/MS
+nectarine/SM
+needless/Y
+needn't
+ne'er-do-wells
+negation/M
+neglect/6jSDG
+negotiability/MS
+negotiable/A
+negotiation/MA
+neither
+Nell/MY
+neoclassicism/MS
+Nepali/M
+nephritis/M
+Nero/M
+nervousness/S
+netherworld/S
+nett/SJ
+netter
+neutralization/M
+Nevada/M
+nevermore
+Newark/M
+newfangled
+Newnham
+newsagent/SM
+newscast/RSM
+news-gathering
+newsgroup/MS
+Newsweekly/M
+NFC
+NFL
+Nicholas
+Nicky/M
+Nicola/MS
+nicotine/SM
+Niger/M
+niggard/YMS
+niggardly/P
+nigh
+nightie/SM
+night-life/M
+nightshirt/MS
+nightstick/S
+Nikki/M
+Nikon/M
+nil/MGY
+nimbi
+nimbused
+Nimrod/MS
+ninety/HMS
+ninety-seven/H
+ninety-three/H
+ninety-two
+nitration/M
+nitrite/MS
+no/Q
+NOAA
+node/SM
+noes
+Nolan/M
+nominee/SM
+non-acid/S
+non-adhesive
+non-adjustable
+non-complying/S
+non-conservative
+non-constructive
+non-deductible
+non-deterministic/Y
+non-discrimination/S
+non-enforceable
+non-equivalent/S
+non-factual
+non-governmental
+non-granular
+non-interchangeable
+non-interference
+non-intervention/S
+non-ionic
+non-ionising
+non-judicial
+non-natural
+non-nuclear
+non-obligatory
+non-operative
+non-parametric
+non-payment/SM
+non-physical/Y
+non-prescription
+non-productive
+non-reciprocating
+non-recurring
+non-returnable/S
+nonsuch
+non-surgical
+non-taxable/S
+non-trunk
+non-user/SM
+non-violent/Y
+non-white/SM
+Norbert/M
+Nordic/S
+normalcy/SM
+normalise/CGASD
+Normandy/M
+Norris
+north-eastward/S
+Northrop/M
+Northumberland/M
+north-Westward/S
+nosh/SDMG
+nostril/SM
+noticeboard/S
+notion's
+Nova
+nubbin's
+nubby/T
+nugatory
+nuisance/MS
+null/S
+nullify/DRSnNG
+numberer/M
+numbering/e
+numbskull/M
+nurture/MRDSG
+nutate/GSD
+nylon/SM
+nympholepsy/M
+oafishness/S
+oakwood
+OAP
+oars/m5
+obdurate/YS
+obdurateness/S
+obligate/SNxyGnD
+oblige/EGDS
+observation/M
+observatory/MS
+obstetrics/M
+obstreperous/PY
+obstruct/GSvDuV
+obstructionism/SM
+obtain/SGD7
+obtrusiveness/SM
+obtuseness/S
+obviate/DnNSG
+occipital/Y
+occlusive/S
+occurrence/SM
+oceanic/4
+Oceanside/M
+octal/S
+October/SM
+odious/PY
+oenophile/S
+o'er
+oesophageal
+oesophagus/M
+Ofelia/M
+Offaly/M
+offensive/IYP
+offertory/MS
+officership/S
+officious/PY
+offprint/GMSD
+offshoot/MS
+oftener
+oftenest
+oiliness/S
+Okamoto/M
+Okinawa/M
+Oktoberfest
+Oldbury
+old-time/R
+old-world
+Oliver/M
+Olson/M
+omen/SMd
+omnidirectional
+on-board
+oneness/S
+one-piece
+one-third
+one-track
+one-way
+onlooker/SM
+onlooking
+onward/S
+ooh/DSG
+oops/S
+open-air
+opened/AU
+open-heart/D
+open-top
+openwork/SM
+operand/SM
+opine/GSD
+Oporto
+opossum/SM
+Oppenheimer/M
+opposite/YPS
+oppression/M
+optional/S
+opus/SM
+ordered/AU
+orderer
+ordinands
+ordinary/TSY
+ordination/SM
+ore/MySo
+O'Reilly
+organise/EnADGS
+organize/AnSEGDN
+organza/MS
+orgy/MS
+orient/ENSADnG
+oriental/SY
+orienteering/M
+origami/MS
+original/U
+Oriya/M
+Orleans
+ornament/nMDGNSo
+ornithology/3wSM
+Orpheus/M
+Orrin/M
+orthography/w1SMW
+osmosis/M
+osteoporosis/M
+Oswald/M
+OTC
+other/SPM
+OTOH
+out/MDSGJ
+outgrip
+outgrow
+outland
+outlandishness/S
+outlaw/DyG
+oval/MSP
+oven/SM
+over-abundance/SM
+over-abundant
+overbook/G
+overbuy
+overcloud
+over-delicate
+overeducate
+overload/G
+overnight/G
+overpressure
+over-sensitiveness/S
+oversize
+overtake
+overweening
+overwrite/G
+ovulate/GySD
+ovum/SM
+owl/MS
+owner/SM
+oxalic
+oxaloacetic
+oxbow/MS
+Oxfordshire
+oxidation/M
+Paarl
+Pablo/M
+pacesetter/SM
+pachyderm/MS
+pacific/4
+pacification/M
+packaging/M
+paddy/MS
+paeony/M
+paganism/SM
+painterliness
+painting/M
+pair/ADMSG
+paired/UI
+pal/MS
+Palaeocene
+palate/SgoM
+Palestine/M
+pallor/MS
+Palmyra/M
+palpitation/M
+panache/MS
+pandemic/S
+pang/SM
+parabola/MWS
+paradigmatic
+paraffin/SM
+paralinguistic
+Paramaribo/M
+paramedical/S
+paramount
+paraphraser/M
+paraquat/S
+parasite/MwWS1
+parasitic/S
+pardon/rgl7dS
+pardonableness/M
+parentage/MS
+parfait/SM
+Paris/M
+parkland/M
+parlourmaid
+parquetry/MS
+parson/MS
+partial/IY
+particularity/SM
+partitive/S
+part-timer/S
+parturition/MS
+partway
+party/DMSG
+pascal/MS
+passbook/MS
+passive/IY
+passkey/SM
+passover
+pastiness/S
+pastis
+pastor/dMS
+pasturage/SM
+patchable
+patellae
+patency
+paternalist/W
+paternity/MS
+patient/eMS
+patisserie
+patriotic/U
+patron/98Q-YMqsS
+patronise/k
+patroon/MS
+patten/MS
+paunch/S2GMZD
+pauperism/MS
+paved/U
+paver/M
+pawner/M
+pcm
+PE
+peacetime/SM
+pearler/M
+peasanthood
+pebbling/M
+pecan/MS
+pectoral/S
+pedagogics/M
+pedestrian/Q-8qMS
+peduncle/MS
+pee/RGS
+peekaboo/SM
+peers/F
+pell-mell
+pen/oGDMS
+peninsula/SM
+penknife/M
+penknives
+pennon/SM
+pennyworth/M
+pensiveness/S
+penultimate/SY
+Penzance/M
+people/DMGS
+peopled/U
+peptide/MS
+perchance
+percolate/NnDSG
+perestroika/S
+perfectionism/SM
+perform/eDGS
+performance/MS
+performer/MS
+perfused
+periastron
+perihelia
+peril/MSDG
+period/Mw1WS
+periodontal/Y
+periphrasis/M
+periphrastic
+perish/7RGDkS
+peris