tobrien 2003/02/03 07:48:14 Modified: codec TODO codec/src/test/org/apache/commons/codec TestAll.java Added: codec/src/java/org/apache/commons/codec/language Nysiis.java codec/src/test/org/apache/commons/codec/language TestNysiis.java Log: Added Nysiis implementation Revision Changes Path 1.3 +4 -1 jakarta-commons-sandbox/codec/TODO Index: TODO =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/codec/TODO,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TODO 3 Feb 2003 15:08:10 -0000 1.2 +++ TODO 3 Feb 2003 15:48:14 -0000 1.3 @@ -27,14 +27,17 @@ * Integrate Patches: ** Patch submitted by Iulian Musat for Base64 -** Add Nysiis implementation from KyleBurton * DoubleMetaphone ** Modify DoubleMetaphone implementation - make it thread safe(r). ** Figure out why algorithm fails to properly code "bryce" and "maurice". +* Nysiis +** Modify Nysiis implementation - make it thread safe(r). + ** DONE +2/3/03 - TOB - Added Nysiis code and tests from Kyle Burton 2/3/03 - TOB - Added DoubleMetaphone code and tests from Kyle Burton 2/2/03 - TOB - "language" package created to hold language and phonetic encodings 2/2/03 - TOB - All CRLF issues resolved in codec 1.1 jakarta-commons-sandbox/codec/src/java/org/apache/commons/codec/language/Nysiis.java Index: Nysiis.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2001-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Commons" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Turbine", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.commons.codec.language; import org.apache.commons.codec.Encoder; /** * A class to generate phonetic codings based on the New York State * Identification and Intelligence System algorithm. This module is based on * the code from the Perl module available from CPAN, which derives from an * implementation by Ben Kennedy. * * @see http://www.nist.gov/dads/HTML/nysiis.html * @see http://search.cpan.org/search?query=nysiis&mode=all * * @see Atack, J., and F. Bateman. 1992 . * <i>"Matchmaker, matchmaker, make me a match"</i> : a general * computer-based matching program for historical researc. * Historical Methods 25: 53-65. * * @version $Revision: 1.1 $ * @author <a href="[EMAIL PROTECTED]">Kyle R. Burton</a> */ public final class Nysiis implements Encoder { /** Enable/disable internal debugging. */ private boolean debug = false; /** The name to be encoded. */ private StringBuffer word = null; /** * Static version of encode. This method was originaly created to allow this * encoder to be used as a Java Stored Procedure in Oracle. * @param word the data to encode. * @return the encoded string. */ public static String sencode( String word ) { Nysiis ny = new Nysiis(); return ny.encode(word); } /** * Encode the given string using the Nysiis phonetic encoding algorithm. * @param String originalWord * @return String - the encoded word */ public String encode( String originalWord ) { if( originalWord != null && originalWord.length() > 0 ) { word = new StringBuffer( originalWord.toUpperCase() ); } else { return ""; } char first; // strip any trailing S or Zs while(word.toString().endsWith("S") || word.toString().endsWith("Z")) { word.deleteCharAt( word.length() - 1 ); } replaceFront( "MAC", "MC" ); replaceFront( "PF", "F" ); replaceEnd( "IX", "IC" ); replaceEnd( "EX", "EC" ); replaceEnd( "YE", "Y" ); replaceEnd( "EE", "Y" ); replaceEnd( "IE", "Y" ); replaceEnd( "DT", "D" ); replaceEnd( "RT", "D" ); replaceEnd( "RD", "D" ); replaceEnd( "NT", "N" ); replaceEnd( "ND", "N" ); // .EV => .EF replaceAll( "EV", "EF", 1 ); first = word.charAt(0); // replace all vowels with 'A' // word = replaceAll( word, "A", "A" ); replaceAll( "E", "A" ); replaceAll( "I", "A" ); replaceAll( "O", "A" ); replaceAll( "U", "A" ); // remove any 'W' that follows a vowel replaceAll( "AW", "A" ); replaceAll( "GHT", "GT" ); replaceAll( "DG", "G" ); replaceAll( "PH", "F" ); replaceAll( "AH", "A", 1 ); replaceAll( "HA", "A", 1 ); replaceAll( "KN", "N" ); replaceAll( "K", "C" ); replaceAll( "M", "N", 1 ); replaceAll( "Q", "G", 1 ); replaceAll( "SH", "S" ); replaceAll( "SCH", "S" ); replaceAll( "YW", "Y" ); replaceAll( "Y", "A", 1, word.length() - 2 ); replaceAll( "WR", "R" ); replaceAll( "Z", "S", 1 ); replaceEnd( "AY", "Y" ); while(word.toString().endsWith("A")) { word.deleteCharAt( word.length() - 1 ); } reduceDuplicates(); if( 'A' == first || 'E' == first || 'I' == first || 'O' == first || 'U' == first ) { word.deleteCharAt(0); word.insert(0,first); } return word.toString(); } /** * Traverse the string reducing duplicated characters. */ private void reduceDuplicates() { char lastChar; StringBuffer newWord = new StringBuffer(); if(0 == word.length()) { return; } lastChar = word.charAt(0); newWord.append(lastChar); for(int i = 1; i < word.length(); ++i) { if(lastChar != word.charAt(i)) { newWord.append(word.charAt(i)); } lastChar = word.charAt(i); } log("reduceDuplicates: " + word); word = newWord; } /** * Replace all occurances of the given pattern in the string to be encoded * with the given replacement. * @param find the sequence to locate * @param repl the string to replace it with */ private void replaceAll( String find, String repl ) { replaceAll(find,repl,0,-1); } /** * Replace all occurances of the given pattern in the string to be encoded * with the given replacement, beginning at the given staring position. * @param find the sequence to locate * @param repl the string to replace it with * @param startPos the position to begin at */ private void replaceAll( String find, String repl, int startPos ) { replaceAll(find,repl,startPos,-1); } /** * Replace all occurances of the given pattern in the string to be encoded * with the given replacement, beginning at the given staring position up to * the given end position. * @param find the sequence to locate * @param repl the string to replace it with * @param startPos the position to begin at * @param endPos the position to stop at */ private void replaceAll( String find, String repl, int startPos, int endPos ) { int pos = word.toString().indexOf(find,startPos); /* log("Nysiis.replaceAll(): " + "pos: " + pos + " " + "word: " + word + " " + "find: " + find + " " + "repl: " + repl + " " + "startPos: " + startPos + " " + "endPos: " + endPos + " " ); */ if(-1 == endPos) { endPos = word.length() - 1; } while(-1 != pos) { if(-1 != endPos && pos > endPos) { log("stopping pos > endPos: " + pos + ":" + endPos); break; } // log("word[" + word.length() + "]: " + word); // log("deleting at: " + pos + ", " + (find.length() - 1)); word.delete( pos, pos + find.length() ); // log("del[" + word.length() + "]: " + word); word.insert( pos, repl ); // log("ins[" + word.length() + "]: " + word); pos = word.toString().indexOf(find); // log("new pos[" + word.length() + "]: " + pos); log("replaceAll[" + find + "," + repl + "]: " + word); } } /** * If the encoded string begins with the given find string, replace it. * @param find the prefix to test for * @param repl the replacement to substitue */ private void replaceFront( String find, String repl ) { if(word.toString().startsWith(find)) { word.delete( 0, find.length() ); word.insert( 0, repl ); log("replaceFront[" + find + "]: " + word); } } /** * If the encoded string ends with the given find string, replace it. * @param find the suffix to test for * @param repl the replacement to substitue */ private void replaceEnd( String find, String repl ) { if(word.toString().endsWith(find)) { word.delete( word.length() - find.length(), word.length() ); word.append(repl); log("replaceEnd[" + find + "]: " + word); } } /** * Logging statement controlled by the debug member. * @param msg the message to optionaly log. */ private void log( String msg ) { if(!debug) { return; } System.out.println(msg); System.out.flush(); } /** * Check if the two strings encode to the same primary or alternate encodings * using the Nysiis algorithm. * @param s1 * @param s2 * @return true/false */ public static boolean isEncodeEqual( String s1, String s2 ) { return sencode( s1 ).equals( sencode( s2 ) ); } } 1.4 +6 -4 jakarta-commons-sandbox/codec/src/test/org/apache/commons/codec/TestAll.java Index: TestAll.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/codec/src/test/org/apache/commons/codec/TestAll.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- TestAll.java 3 Feb 2003 15:00:12 -0000 1.3 +++ TestAll.java 3 Feb 2003 15:48:14 -0000 1.4 @@ -62,6 +62,7 @@ package org.apache.commons.codec; import org.apache.commons.codec.language.TestDoubleMetaphone; +import org.apache.commons.codec.language.TestNysiis; import junit.framework.Test; import junit.framework.TestCase; @@ -84,6 +85,7 @@ suite.addTest(TestSoundex.suite()); suite.addTest(TestRefinedSoundex.suite()); suite.addTest(TestDoubleMetaphone.suite()); + suite.addTest(TestNysiis.suite()); return suite; } 1.1 jakarta-commons-sandbox/codec/src/test/org/apache/commons/codec/language/TestNysiis.java Index: TestNysiis.java =================================================================== /* * $Header: /home/cvs/jakarta-commons-sandbox/codec/src/test/org/apache/commons/codec/language/TestNysiis.java,v 1.1 2003/02/03 15:48:14 tobrien Exp $ * $Revision: 1.1 $ * $Date: 2003/02/03 15:48:14 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.codec.language; import org.apache.commons.codec.Encoder; import org.apache.commons.codec.TestEncoder; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * @version $Revision: 1.1 $ $Date: 2003/02/03 15:48:14 $ * @author <a href="mailto:[EMAIL PROTECTED]">Kyle R. Burton</a> */ public class TestNysiis extends TestEncoder { public TestNysiis(String name) { super(name); } public static Test suite() { return (new TestSuite(TestNysiis.class)); } public void setUp() throws Exception { super.setUp(); _encoder = new Nysiis(); } public void tearDown() throws Exception { super.tearDown(); _encoder = null; } protected Encoder makeEncoder() { return new Nysiis(); } // ------------------------------------------------------------------------ public void testNysiis() { Nysiis nysiis = new Nysiis(); for(int i = 0; i < words.length; ++i) { assertEquals( "encoding: " + words[i], encodings[i], _encoder.encode(words[i]) ); } } public void testIsNysiisEqual() { // need good examples of when two strings should encode to // the same values... } private Nysiis _encoder = null; private String [] words = { "Aarhus", "Aaron", "Ababa", "aback", "abaft", "abandon", "abandoned", "abandoning", "abandonment", "abandons", "abase", "abased", "abasement", "abasements", "abases", "abash", "abashed", "abashes", "abashing", "abasing", "abate", "abated", "abatement", "abatements", "abater", "abates", "abating", "Abba", "abbe", "abbey", "abbeys", "abbot", "abbots", "Abbott", "abbreviate", "abbreviated", "abbreviates", "abbreviating", "abbreviation", "abbreviations", "Abby", "abdomen", "abdomens", "abdominal", "abduct", "abducted", "abduction", "abductions", "abductor", "abductors", "abducts", "Abe", "abed", "Abel", "Abelian", "Abelson", "Aberdeen", "Abernathy", "aberrant", "aberration", "aberrations", "abet", "abets", "abetted", "abetter", "abetting", "abeyance", "abhor", "abhorred", "abhorrent", "abhorrer", "abhorring", "abhors", "abide", "abided", "abides", "abiding", "Abidjan", "Abigail", "Abilene", "abilities", "ability", "abject", "abjection", "abjections", "abjectly", "abjectness", "abjure", "abjured", "abjures", "abjuring", "ablate", "ablated", "ablates", "ablating", "ablation", "ablative", "ablaze", "able", "abler", "ablest", "ably", "Abner", "abnormal", "abnormalities", "abnormality", "abnormally", "Abo", "aboard", "abode", "abodes", "abolish", "abolished", "abolisher", "abolishers", "abolishes", "abolishing", "abolishment", "abolishments", "abolition", "abolitionist", "abolitionists", "abominable", "abominate", "aboriginal", "aborigine", "aborigines", "abort", "aborted", "aborting", "abortion", "abortions", "abortive", "abortively", "aborts", "Abos", "abound", "abounded", "abounding", "abounds", "about", "above", "aboveboard", "aboveground", "abovementioned", "abrade", "abraded", "abrades", "abrading", "Abraham", "Abram", "Abrams", "Abramson", "abrasion", "abrasions", "abrasive", "abreaction", "abreactions", "abreast", "abridge", "abridged", "abridges", "abridging", "abridgment", "abroad", "abrogate", "abrogated", "abrogates", "abrogating", "abrupt", "abruptly", "abruptness", "abscess", "abscessed", "abscesses", "abscissa", "abscissas", "abscond", "absconded", "absconding", "absconds", "absence", "absences", "absent", "absented", "absentee", "absenteeism", "absentees", "absentia", "absenting", "absently", "absentminded", "absents", "absinthe", "absolute", "absolutely", "absoluteness", "absolutes", "absolution", "absolve", "absolved", "absolves", "absolving", "absorb", "absorbed", "absorbency", "absorbent", "absorber", "absorbing", "absorbs", "absorption", "absorptions", "absorptive", "abstain", "abstained", "abstainer", "abstaining", "abstains", "abstention", "abstentions", "abstinence", "abstract", "abstracted", "abstracting", "abstraction", "abstractionism", "abstractionist", "abstractions", "abstractly", "abstractness", "abstractor", "abstractors", "abstracts", "abstruse", "abstruseness", "absurd", "absurdities", "absurdity", "absurdly", "Abu", "abundance", "abundant", "abundantly", "abuse", "abused", "abuses", "abusing", "abusive", "abut", "abutment", "abuts", "abutted", "abutter", "abutters", "abutting", "abysmal", "abysmally", "abyss", "abysses", "Abyssinia", "Abyssinian", "Abyssinians", "acacia", "academia", "academic", "academically", "academics", "academies", "academy", "Acadia", "Acapulco", "accede", "acceded", "accedes", "accelerate", "accelerated", "accelerates", "accelerating", "acceleration", "accelerations", "accelerator", "accelerators", "accelerometer", "accelerometers", "accent", "accented", "accenting", "accents", "accentual", "accentuate", "accentuated", "accentuates", "accentuating", "accentuation", "accept", "acceptability", "acceptable", "acceptably", "acceptance", "acceptances", "accepted", "accepter", "accepters", "accepting", "acceptor", "acceptors", "accepts", "access", "accessed", "accesses", "accessibility", "accessible", "accessibly", "accessing", "accession", "accessions", "accessories", "accessors", "accessory", "accident", "accidental", "accidentally", "accidently", "accidents", "acclaim", "acclaimed", "acclaiming", "acclaims", "acclamation", "acclimate", "acclimated", "acclimates", "acclimating", "acclimatization", "acclimatized", "accolade", "accolades", "accommodate", "accommodated", "accommodates", "accommodating", "accommodation", "accommodations", "accompanied", "accompanies", "accompaniment", "accompaniments", "accompanist", "accompanists", "accompany", "accompanying", "accomplice", "accomplices", "accomplish", "accomplished", "accomplisher", "accomplishers", "accomplishes", "accomplishing", "accomplishment", "accomplishments", "accord", "accordance", "accorded", "accorder", "accorders", "according", "accordingly", "accordion", "accordions", "accords", "accost", "accosted", "accosting", "accosts", "account", "accountability", "accountable", "accountably", "accountancy", "accountant", "accountants", "accounted", "accounting", "accounts", "Accra", "accredit", "accreditation", "accreditations", "accredited", "accretion", "accretions", "accrue", "accrued", "accrues", "accruing", "acculturate", "acculturated", "acculturates", "acculturating", "acculturation", "accumulate", "accumulated", "accumulates", "accumulating", "accumulation", "accumulations", "accumulator", "accumulators", "accuracies", "accuracy", "accurate", "accurately", "accurateness", "accursed", "accusal", "accusation", "accusations", "accusative", "accuse", "accused", "accuser", "accuses", "accusing", "accusingly", "accustom", "accustomed", "accustoming", "accustoms", "ace", "aces", "acetate", "acetone", "acetylene", "Achaean", "Achaeans", "ache", "ached", "aches", "achievable", "achieve", "achieved", "achievement", "achievements", "achiever", "achievers", "achieves", "achieving", "Achilles", "aching", "acid", "acidic", "acidities", "acidity", "acidly", "acids", "acidulous", "Ackerman", "Ackley", "acknowledge", "acknowledgeable", "acknowledged", "acknowledgement", "acknowledgements", "acknowledger", "acknowledgers", "acknowledges", "acknowledging", "acknowledgment", "acknowledgments", "acme", "acne", "acolyte", "acolytes", "acorn", "acorns", "acoustic", "acoustical", "acoustically", "acoustician", "acoustics", "acquaint", "acquaintance", "acquaintances", "acquainted", "acquainting", "acquaints", "acquiesce", "acquiesced", "acquiescence", "acquiescent", "acquiesces", "acquiescing", "acquirable", "acquire", "acquired", "acquires", "acquiring", "acquisition", "acquisitions", "acquisitive", "acquisitiveness", "acquit", "acquits", "acquittal", "acquitted", "acquitter", "acquitting", "acre", "acreage", "acres", "acrid", "acrimonious", "acrimony", "acrobat", "acrobatic", "acrobatics", "acrobats", "acronym", "acronyms", "acropolis", "across", "acrylic", "act", "Acta", "Actaeon", "acted", "acting", "actinium", "actinometer", "actinometers", "action", "actions", "activate", "activated", "activates", "activating", "activation", "activations", "activator", "activators", "active", "actively", "activism", "activist", "activists", "activities", "activity", "Acton", "actor", "actors", "actress", "actresses", "Acts", "actual", "actualities", "actuality", "actualization", "actually", "actuals", "actuarial", "actuarially", "actuate", "actuated", "actuates", "actuating", "actuator", "actuators", "acuity", "acumen", "acute", "acutely", "acuteness", "acyclic", "acyclically", "ad", "Ada", "adage", "adages", "adagio", "adagios", "Adair", "Adam", "adamant", "adamantly", "Adams", "Adamson", "adapt", "adaptability", "adaptable", "adaptation", "adaptations", "adapted", "adapter", "adapters", "adapting", "adaptive", "adaptively", "adaptor", "adaptors", "adapts", "add", "added", "addend", "addenda", "addendum", "adder", "adders", "addict", "addicted", "addicting", "addiction", "addictions", "addicts", "adding", "Addis", "Addison", "addition", "additional", "additionally", "additions", "additive", "additives", "additivity", "address", "addressability", "addressable", "addressed", "addressee", "addressees", "addresser", "addressers", "addresses", "addressing", "Addressograph", "adds", "adduce", "adduced", "adduces", "adducible", "adducing", "adduct", "adducted", "adducting", "adduction", "adductor", "adducts", "Adelaide", "Adele", "Adelia", "Aden", "adept", "adequacies", "adequacy", "adequate", "adequately", "adhere", "adhered", "adherence", "adherent", "adherents", "adherer", "adherers", "adheres", "adhering", "adhesion", "adhesions", "adhesive", "adhesives", "adiabatic", "adiabatically", "adieu", "Adirondack", "Adirondacks", "adjacency", "adjacent", "adjective", "adjectives", "adjoin", "adjoined", "adjoining", "adjoins", "adjourn", "adjourned", "adjourning", "adjournment", "adjourns", "adjudge", "adjudged", "adjudges", "adjudging", "adjudicate", "adjudicated", "adjudicates", "adjudicating", "adjudication", "adjudications", "adjunct", "adjuncts", "adjure", "adjured", "adjures", "adjuring", "adjust", "adjustable", "adjustably", "adjusted", "adjuster", "adjusters", "adjusting", "adjustment", "adjustments", "adjustor", "adjustors", "adjusts", "adjutant", "adjutants", "Adkins", "Adler", "Adlerian", "administer", "administered", "administering", "administerings", "administers", "administrable", "administrate", "administration", "administrations", "administrative", "administratively", "administrator", "administrators", "admirable", "admirably", "admiral", "admirals", "admiralty", "admiration", "admirations", "admire", "admired", "admirer", "admirers", "admires", "admiring", "admiringly", "admissibility", "admissible", "admission", "admissions", "admit", "admits", "admittance", "admitted", "admittedly", "admitter", "admitters", "admitting", "admix", "admixed", "admixes", "admixture", "admonish", "admonished", "admonishes", "admonishing", "admonishment", "admonishments", "admonition", "admonitions", "ado", "adobe", "adolescence", "adolescent", "adolescents", "Adolph", "Adolphus", "Adonis", "adopt", "adopted", "adopter", "adopters", "adopting", "adoption", "adoptions", "adoptive", "adopts", "adorable", "adoration", "adore", "adored", "adores", "adorn", "adorned", "adornment", "adornments", "adorns", "adrenal", "adrenaline", "Adrian", "Adriatic", "Adrienne", "adrift", "adroit", "adroitness", "ads", "adsorb", "adsorbed", "adsorbing", "adsorbs", "adsorption", "adulate", "adulating", "adulation", "adult", "adulterate", "adulterated", "adulterates", "adulterating", "adulterer", "adulterers", "adulterous", "adulterously", "adultery", "adulthood", "adults", "adumbrate", "adumbrated", "adumbrates", "adumbrating", "adumbration", "advance", "advanced", "advancement", "advancements", "advances", "advancing", "advantage", "advantaged", "advantageous", "advantageously", "advantages", "advent", "adventist", "adventists", "adventitious", "adventure", "adventured", "adventurer", "adventurers", "adventures", "adventuring", "adventurous", "adverb", "adverbial", "adverbs", "adversaries", "adversary", "adverse", "adversely", "adversities", "adversity", "advert", "advertise", "advertised", "advertisement", "advertisements", "advertiser", "advertisers", "advertises", "advertising", "advice", "advisability", "advisable", "advisably", "advise", "advised", "advisedly", "advisee", "advisees", "advisement", "advisements", "adviser", "advisers", "advises", "advising", "advisor", "advisors", "advisory", "advocacy", "advocate", "advocated", "advocates", "advocating", "Aegean", "aegis", "Aeneas", "Aeneid", "Aeolus", "aerate", "aerated", "aerates", "aerating", "aeration", "aerator", "aerators", "aerial", "aerials", "aeroacoustic", "Aerobacter", "aerobic", "aerobics", "aerodynamic", "aerodynamics", "aeronautic", "aeronautical", "aeronautics", "aerosol", "aerosolize", "aerosols", "aerospace", "Aeschylus", "Aesop", "aesthetic", "aesthetically", "aesthetics", "afar", "affable", "affair", "affairs", "affect", "affectation", "affectations", "affected", "affecting", "affectingly", "affection", "affectionate", "affectionately", "affections", "affective", "affects", "afferent", "affianced", "affidavit", "affidavits", "affiliate", "affiliated", "affiliates", "affiliating", "affiliation", "affiliations", "affinities", "affinity", "affirm", "affirmation", "affirmations", "affirmative", "affirmatively", "affirmed", "affirming", "affirms", "affix", "affixed", "affixes", "affixing", "afflict", "afflicted", "afflicting", "affliction", "afflictions", "afflictive", "afflicts", "affluence", "affluent", "afford", "affordable", "afforded", "affording", "affords", "affricate", "affricates", "affright", "affront", "affronted", "affronting", "affronts", "Afghan", "Afghanistan", "Afghans", "aficionado", "afield", "afire", "aflame", "afloat", "afoot", "afore", "aforementioned", "aforesaid", }; private String [] encodings = { "AR", "ARAN", "ABAB", "ABAC", "ABAFT", "ABANDAN", "ABANDANAD", "ABANDANANG", "ABANDANAN", "ABANDAN", "ABAS", "ABASAD", "ABASANAN", "ABASANAN", "ABAS", "ABAS", "ABASAD", "ABAS", "ABASANG", "ABASANG", "ABAT", "ABATAD", "ABATANAN", "ABATANAN", "ABATAR", "ABAT", "ABATANG", "AB", "AB", "ABY", "ABY", "ABAT", "ABAT", "ABAT", "ABRAFAT", "ABRAFATAD", "ABRAFAT", "ABRAFATANG", "ABRAFATAN", "ABRAFATAN", "ABY", "ABDANAN", "ABDANAN", "ABDANANAL", "ABDACT", "ABDACTAD", "ABDACTAN", "ABDACTAN", "ABDACTAR", "ABDACTAR", "ABDACT", "AB", "ABAD", "ABAL", "ABALAN", "ABALSAN", "ABARDAN", "ABARNATHY", "ABARAN", "ABARATAN", "ABARATAN", "ABAT", "ABAT", "ABATAD", "ABATAR", "ABATANG", "ABANC", "ABAR", "ABARAD", "ABARAN", "ABARAR", "ABARANG", "ABAR", "ABAD", "ABADAD", "ABAD", "ABADANG", "ABADJAN", "ABAGAL", "ABALAN", "ABALATY", "ABALATY", "ABJACT", "ABJACTAN", "ABJACTAN", "ABJACTLY", "ABJACTN", "ABJAR", "ABJARAD", "ABJAR", "ABJARANG", "ABLAT", "ABLATAD", "ABLAT", "ABLATANG", "ABLATAN", "ABLATAV", "ABLAS", "ABL", "ABLAR", "ABLAST", "ABLY", "ABNAR", "ABNARNAL", "ABNARNALATY", "ABNARNALATY", "ABNARNALY", "AB", "ABAD", "ABAD", "ABAD", "ABALAS", "ABALASAD", "ABALASAR", "ABALASAR", "ABALAS", "ABALASANG", "ABALASNAN", "ABALASNAN", "ABALATAN", "ABALATANAST", "ABALATANAST", "ABANANABL", "ABANANAT", "ABARAGANAL", "ABARAGAN", "ABARAGAN", "ABAD", "ABARTAD", "ABARTANG", "ABARTAN", "ABARTAN", "ABARTAV", "ABARTAVALY", "ABAD", "AB", "ABAN", "ABANDAD", "ABANDANG", "ABAN", "ABAT", "ABAV", "ABAVABAD", "ABAVAGRAN", "ABAVANANTANAD", "ABRAD", "ABRADAD", "ABRAD", "ABRADANG", "ABRAN", "ABRAN", "ABRAN", "ABRANSAN", "ABRASAN", "ABRASAN", "ABRASAV", "ABRACTAN", "ABRACTAN", "ABRAST", "ABRAG", "ABRAGAD", "ABRAG", "ABRAGANG", "ABRAGNAN", "ABRAD", "ABRAGAT", "ABRAGATAD", "ABRAGAT", "ABRAGATANG", "ABRAPT", "ABRAPTLY", "ABRAPTN", "ABSC", "ABSCASAD", "ABSCAS", "ABSCAS", "ABSCAS", "ABSCAN", "ABSCANDAD", "ABSCANDANG", "ABSCAN", "ABSANC", "ABSANC", "ABSAN", "ABSANTAD", "ABSANTY", "ABSANTASN", "ABSANTY", "ABSANT", "ABSANTANG", "ABSANTLY", "ABSANTNANDAD", "ABSAN", "ABSANT", "ABSALAT", "ABSALATALY", "ABSALATAN", "ABSALAT", "ABSALATAN", "ABSALV", "ABSALVAD", "ABSALV", "ABSALVANG", "ABSARB", "ABSARBAD", "ABSARBANCY", "ABSARBAN", "ABSARBAR", "ABSARBANG", "ABSARB", "ABSARPTAN", "ABSARPTAN", "ABSARPTAV", "ABSTAN", "ABSTANAD", "ABSTANAR", "ABSTANANG", "ABSTAN", "ABSTANTAN", "ABSTANTAN", "ABSTANANC", "ABSTRACT", "ABSTRACTAD", "ABSTRACTANG", "ABSTRACTAN", "ABSTRACTANASN", "ABSTRACTANAST", "ABSTRACTAN", "ABSTRACTLY", "ABSTRACTN", "ABSTRACTAR", "ABSTRACTAR", "ABSTRACT", "ABSTRAS", "ABSTRASAN", "ABSAD", "ABSARDATY", "ABSARDATY", "ABSARDLY", "AB", "ABANDANC", "ABANDAN", "ABANDANTLY", "ABAS", "ABASAD", "ABAS", "ABASANG", "ABASAV", "ABAT", "ABATNAN", "ABAT", "ABATAD", "ABATAR", "ABATAR", "ABATANG", "ABASNAL", "ABASNALY", "ABY", "ABAS", "ABASAN", "ABASANAN", "ABASANAN", "ACAC", "ACADAN", "ACADANAC", "ACADANACALY", "ACADANAC", "ACADANY", "ACADANY", "ACAD", "ACAPALC", "ACAD", "ACADAD", "ACAD", "ACALARAT", "ACALARATAD", "ACALARAT", "ACALARATANG", "ACALARATAN", "ACALARATAN", "ACALARATAR", "ACALARATAR", "ACALARANATAR", "ACALARANATAR", "ACAN", "ACANTAD", "ACANTANG", "ACAN", "ACANTAL", "ACANTAT", "ACANTATAD", "ACANTAT", "ACANTATANG", "ACANTATAN", "ACAPT", "ACAPTABALATY", "ACAPTABL", "ACAPTABLY", "ACAPTANC", "ACAPTANC", "ACAPTAD", "ACAPTAR", "ACAPTAR", "ACAPTANG", "ACAPTAR", "ACAPTAR", "ACAPT", "AC", "ACASAD", "ACAS", "ACASABALATY", "ACASABL", "ACASABLY", "ACASANG", "ACASAN", "ACASAN", "ACASARY", "ACASAR", "ACASARY", "ACADAN", "ACADANTAL", "ACADANTALY", "ACADANTLY", "ACADAN", "ACLAN", "ACLANAD", "ACLANANG", "ACLAN", "ACLANATAN", "ACLANAT", "ACLANATAD", "ACLANAT", "ACLANATANG", "ACLANATASATAN", "ACLANATASAD", "ACALAD", "ACALAD", "ACANADAT", "ACANADATAD", "ACANADAT", "ACANADATANG", "ACANADATAN", "ACANADATAN", "ACANPANAD", "ACANPANY", "ACANPANANAN", "ACANPANANAN", "ACANPANAST", "ACANPANAST", "ACANPANY", "ACANPANANG", "ACANPLAC", "ACANPLAC", "ACANPLAS", "ACANPLASAD", "ACANPLASAR", "ACANPLASAR", "ACANPLAS", "ACANPLASANG", "ACANPLASNAN", "ACANPLASNAN", "ACAD", "ACARDANC", "ACARDAD", "ACARDAR", "ACARDAR", "ACARDANG", "ACARDANGLY", "ACARDAN", "ACARDAN", "ACAD", "ACAST", "ACASTAD", "ACASTANG", "ACAST", "ACAN", "ACANTABALATY", "ACANTABL", "ACANTABLY", "ACANTANCY", "ACANTAN", "ACANTAN", "ACANTAD", "ACANTANG", "ACAN", "ACR", "ACRADAT", "ACRADATATAN", "ACRADATATAN", "ACRADATAD", "ACRATAN", "ACRATAN", "ACR", "ACRAD", "ACR", "ACRANG", "ACALTARAT", "ACALTARATAD", "ACALTARAT", "ACALTARATANG", "ACALTARATAN", "ACANALAT", "ACANALATAD", "ACANALAT", "ACANALATANG", "ACANALATAN", "ACANALATAN", "ACANALATAR", "ACANALATAR", "ACARACY", "ACARACY", "ACARAT", "ACARATALY", "ACARATAN", "ACARSAD", "ACASAL", "ACASATAN", "ACASATAN", "ACASATAV", "ACAS", "ACASAD", "ACASAR", "ACAS", "ACASANG", "ACASANGLY", "ACASTAN", "ACASTANAD", "ACASTANANG", "ACASTAN", "AC", "AC", "ACATAT", "ACATAN", "ACATALAN", "ACAN", "ACAN", "AC", "ACAD", "AC", "ACAFABL", "ACAF", "ACAFAD", "ACAFANAN", "ACAFANAN", "ACAFAR", "ACAFAR", "ACAF", "ACAFANG", "ACAL", "ACANG", "ACAD", "ACADAC", "ACADATY", "ACADATY", "ACADLY", "ACAD", "ACADAL", "ACARNAN", "ACLY", "ACNALAG", "ACNALAGABL", "ACNALAGAD", "ACNALAGANAN", "ACNALAGANAN", "ACNALAGAR", "ACNALAGAR", "ACNALAG", "ACNALAGANG", "ACNALAGNAN", "ACNALAGNAN", "ACN", "ACN", "ACALAT", "ACALAT", "ACARN", "ACARN", "ACASTAC", "ACASTACAL", "ACASTACALY", "ACASTACAN", "ACASTAC", "ACGAN", "ACGANTANC", "ACGANTANC", "ACGANTAD", "ACGANTANG", "ACGAN", "ACGASC", "ACGASCAD", "ACGASCANC", "ACGASCAN", "ACGASC", "ACGASCANG", "ACGARABL", "ACGAR", "ACGARAD", "ACGAR", "ACGARANG", "ACGASATAN", "ACGASATAN", "ACGASATAV", "ACGASATAVAN", "ACGAT", "ACGAT", "ACGATAL", "ACGATAD", "ACGATAR", "ACGATANG", "ACR", "ACRAG", "ACR", "ACRAD", "ACRANAN", "ACRANANY", "ACRABAT", "ACRABATAC", "ACRABATAC", "ACRABAT", "ACRANAN", "ACRANAN", "ACRAPAL", "ACR", "ACRALAC", "ACT", "ACT", "ACTAN", "ACTAD", "ACTANG", "ACTANAN", "ACTANANATAR", "ACTANANATAR", "ACTAN", "ACTAN", "ACTAVAT", "ACTAVATAD", "ACTAVAT", "ACTAVATANG", "ACTAVATAN", "ACTAVATAN", "ACTAVATAR", "ACTAVATAR", "ACTAV", "ACTAVALY", "ACTAVASN", "ACTAVAST", "ACTAVAST", "ACTAVATY", "ACTAVATY", "ACTAN", "ACTAR", "ACTAR", "ACTR", "ACTRAS", "ACT", "ACTAL", "ACTALATY", "ACTALATY", "ACTALASATAN", "ACTALY", "ACTAL", "ACTARAL", "ACTARALY", "ACTAT", "ACTATAD", "ACTAT", "ACTATANG", "ACTATAR", "ACTATAR", "ACATY", "ACANAN", "ACAT", "ACATALY", "ACATAN", "ACACLAC", "ACACLACALY", "AD", "AD", "ADAG", "ADAG", "ADAG", "ADAG", "ADAR", "ADAN", "ADANAN", "ADANANTLY", "ADAN", "ADANSAN", "ADAPT", "ADAPTABALATY", "ADAPTABL", "ADAPTATAN", "ADAPTATAN", "ADAPTAD", "ADAPTAR", "ADAPTAR", "ADAPTANG", "ADAPTAV", "ADAPTAVALY", "ADAPTAR", "ADAPTAR", "ADAPT", "AD", "ADAD", "ADAN", "ADAND", "ADANDAN", "ADAR", "ADAR", "ADACT", "ADACTAD", "ADACTANG", "ADACTAN", "ADACTAN", "ADACT", "ADANG", "AD", "ADASAN", "ADATAN", "ADATANAL", "ADATANALY", "ADATAN", "ADATAV", "ADATAV", "ADATAVATY", "ADR", "ADRASABALATY", "ADRASABL", "ADRASAD", "ADRASY", "ADRASY", "ADRASAR", "ADRASAR", "ADRAS", "ADRASANG", "ADRASAGRAF", "AD", "ADAC", "ADACAD", "ADAC", "ADACABL", "ADACANG", "ADACT", "ADACTAD", "ADACTANG", "ADACTAN", "ADACTAR", "ADACT", "ADALAD", "ADAL", "ADAL", "ADAN", "ADAPT", "ADAGACY", "ADAGACY", "ADAGAT", "ADAGATALY", "ADAR", "ADARAD", "ADARANC", "ADARAN", "ADARAN", "ADARAR", "ADARAR", "ADAR", "ADARANG", "ADASAN", "ADASAN", "ADASAV", "ADASAV", "ADABATAC", "ADABATACALY", "AD", "ADARANDAC", "ADARANDAC", "ADJACANCY", "ADJACAN", "ADJACTAV", "ADJACTAV", "ADJAN", "ADJANAD", "ADJANANG", "ADJAN", "ADJARN", "ADJARNAD", "ADJARNANG", "ADJARNAN", "ADJARN", "ADJAG", "ADJAGAD", "ADJAG", "ADJAGANG", "ADJADACAT", "ADJADACATAD", "ADJADACAT", "ADJADACATANG", "ADJADACATAN", "ADJADACATAN", "ADJANCT", "ADJANCT", "ADJAR", "ADJARAD", "ADJAR", "ADJARANG", "ADJAST", "ADJASTABL", "ADJASTABLY", "ADJASTAD", "ADJASTAR", "ADJASTAR", "ADJASTANG", "ADJASTNAN", "ADJASTNAN", "ADJASTAR", "ADJASTAR", "ADJAST", "ADJATAN", "ADJATAN", "ADCAN", "ADLAR", "ADLARAN", "ADNANASTAR", "ADNANASTARAD", "ADNANASTARANG", "ADNANASTARANG", "ADNANASTAR", "ADNANASTRABL", "ADNANASTRAT", "ADNANASTRATAN", "ADNANASTRATAN", "ADNANASTRATAV", "ADNANASTRATAVALY", "ADNANASTRATAR", "ADNANASTRATAR", "ADNARABL", "ADNARABLY", "ADNARAL", "ADNARAL", "ADNARALTY", "ADNARATAN", "ADNARATAN", "ADNAR", "ADNARAD", "ADNARAR", "ADNARAR", "ADNAR", "ADNARANG", "ADNARANGLY", "ADNASABALATY", "ADNASABL", "ADNASAN", "ADNASAN", "ADNAT", "ADNAT", "ADNATANC", "ADNATAD", "ADNATADLY", "ADNATAR", "ADNATAR", "ADNATANG", "ADNAC", "ADNAXAD", "ADNAX", "ADNAXTAR", "ADNANAS", "ADNANASAD", "ADNANAS", "ADNANASANG", "ADNANASNAN", "ADNANASNAN", "ADNANATAN", "ADNANATAN", "AD", "ADAB", "ADALASCANC", "ADALASCAN", "ADALASCAN", "ADALF", "ADALF", "ADAN", "ADAPT", "ADAPTAD", "ADAPTAR", "ADAPTAR", "ADAPTANG", "ADAPTAN", "ADAPTAN", "ADAPTAV", "ADAPT", "ADARABL", "ADARATAN", "ADAR", "ADARAD", "ADAR", "ADARN", "ADARNAD", "ADARNAN", "ADARNAN", "ADARN", "ADRANAL", "ADRANALAN", "ADRAN", "ADRATAC", "ADRAN", "ADRAFT", "ADRAT", "ADRATN", "AD", "ADSARB", "ADSARBAD", "ADSARBANG", "ADSARB", "ADSARPTAN", "ADALAT", "ADALATANG", "ADALATAN", "ADALT", "ADALTARAT", "ADALTARATAD", "ADALTARAT", "ADALTARATANG", "ADALTARAR", "ADALTARAR", "ADALTAR", "ADALTARASLY", "ADALTARY", "ADALTAD", "ADALT", "ADANBRAT", "ADANBRATAD", "ADANBRAT", "ADANBRATANG", "ADANBRATAN", "ADVANC", "ADVANCAD", "ADVANCANAN", "ADVANCANAN", "ADVANC", "ADVANCANG", "ADVANTAG", "ADVANTAGAD", "ADVANTAG", "ADVANTAGASLY", "ADVANTAG", "ADVAN", "ADVANTAST", "ADVANTAST", "ADVANTAT", "ADVANTAR", "ADVANTARAD", "ADVANTARAR", "ADVANTARAR", "ADVANTAR", "ADVANTARANG", "ADVANTAR", "ADVARB", "ADVARBAL", "ADVARB", "ADVARSARY", "ADVARSARY", "ADVARS", "ADVARSALY", "ADVARSATY", "ADVARSATY", "ADVAD", "ADVARTAS", "ADVARTASAD", "ADVARTASANAN", "ADVARTASANAN", "ADVARTASAR", "ADVARTASAR", "ADVARTAS", "ADVARTASANG", "ADVAC", "ADVASABALATY", "ADVASABL", "ADVASABLY", "ADVAS", "ADVASAD", "ADVASADLY", "ADVASY", "ADVASY", "ADVASANAN", "ADVASANAN", "ADVASAR", "ADVASAR", "ADVAS", "ADVASANG", "ADVASAR", "ADVASAR", "ADVASARY", "ADVACACY", "ADVACAT", "ADVACATAD", "ADVACAT", "ADVACATANG", "AGAN", "AG", "AN", "ANAD", "AL", "ARAT", "ARATAD", "ARAT", "ARATANG", "ARATAN", "ARATAR", "ARATAR", "ARAL", "ARAL", "ARACASTAC", "ARABACTAR", "ARABAC", "ARABAC", "ARADANANAC", "ARADANANAC", "ARANATAC", "ARANATACAL", "ARANATAC", "ARASAL", "ARASALAS", "ARASAL", "ARASPAC", "ASAL", "ASAP", "ASTATAC", "ASTATACALY", "ASTATAC", "AFAR", "AFABL", "AFAR", "AFAR", "AFACT", "AFACTATAN", "AFACTATAN", "AFACTAD", "AFACTANG", "AFACTANGLY", "AFACTAN", "AFACTANAT", "AFACTANATALY", "AFACTAN", "AFACTAV", "AFACT", "AFARAN", "AFANCAD", "AFADAVAT", "AFADAVAT", "AFALAT", "AFALATAD", "AFALAT", "AFALATANG", "AFALATAN", "AFALATAN", "AFANATY", "AFANATY", "AFARN", "AFARNATAN", "AFARNATAN", "AFARNATAV", "AFARNATAVALY", "AFARNAD", "AFARNANG", "AFARN", "AFAC", "AFAXAD", "AFAX", "AFAXANG", "AFLACT", "AFLACTAD", "AFLACTANG", "AFLACTAN", "AFLACTAN", "AFLACTAV", "AFLACT", "AFLANC", "AFLAN", "AFAD", "AFARDABL", "AFARDAD", "AFARDANG", "AFAD", "AFRACAT", "AFRACAT", "AFRAGT", "AFRAN", "AFRANTAD", "AFRANTANG", "AFRAN", "AFGAN", "AFGANASTAN", "AFGAN", "AFACANAD", "AFALD", "AFAR", "AFLAN", "AFLAT", "AFAT", "AFAR", "AFARANANTANAD", "AFARASAD", }; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]